[
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xcuserstate\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the \n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md\n\nfastlane/report.xml\nfastlane/screenshots\n\n#Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Master\n\n* Nothing yet.\n\n# 1.8.13\n\n* Added support for the Xcode 11 docs - [b052c97](https://github.com/Kapeli/Dash-iOS/commit/b052c970b6536cc12ce5ab216f723466eff9899c)\n\n# 1.8.12\n\n* Added support for the Xcode 10.2 docs - [2065d5b](https://github.com/Kapeli/Dash-iOS/commit/2065d5b4995d7ab4b35a25a3bd12ad305a4a106d)\n\n# 1.8.11\n\n* Added support for the Xcode 10.1 docs - [b6d3e4f](https://github.com/Kapeli/Dash-iOS/commit/b6d3e4f3d53c4ac77628e3142b656aaa7c0ab966)\n\n# 1.8.10\n\n* Added support for the Xcode 10 docs - [2aa2284](https://github.com/Kapeli/Dash-iOS/commit/2aa228480092f311b6ae809cfedff2ad5701e2cf)\n* Added Java SE11 docset - [55ca952](https://github.com/Kapeli/Dash-iOS/commit/55ca952e25edfbf82100299f9c1f9d7ba6eb377a)\n\n# 1.8.9\n\n* Added the Swift docset back - [ec51356](https://github.com/Kapeli/Dash-iOS/commit/ec51356e95ac7a0aedbd94e648771578174db35a)\n* Fixed an UI issue which occurred only in landscape mode on iPhone X. Thanks to [@qinyuhang](https://github.com/qinyuhang) for reporting the issue and [@DmytriE](https://github.com/DmytriE) for fixing it - [#80](https://github.com/Kapeli/Dash-iOS/pull/80)\n\n# 1.8.8\n\n* Apple API Reference docset: added support for Xcode 9.4 and Xcode 10 - [f29d3f0](https://github.com/Kapeli/Dash-iOS/commit/f29d3f01bb2030b81e311f74e45f5743568e53e6) and [0acc05c](https://github.com/Kapeli/Dash-iOS/commit/0acc05c01aadb427a51579c2b7a048a32e825bdf)\n\n# 1.8.7\n\n* Improved the way Dash selects the best server to connect to - [e122d05](https://github.com/Kapeli/Dash-iOS/commit/e122d05120aab70b2545f5300806a564276ee6d8)\n* Added Java SE10 docset - [c9d62b1](https://github.com/Kapeli/Dash-iOS/commit/c9d62b169fe9aa8945d8d0af7034e57928473741)\n* Removed JavaFX docset as it's now part of the Java SE docset - [c9d62b1](https://github.com/Kapeli/Dash-iOS/commit/c9d62b169fe9aa8945d8d0af7034e57928473741)\n* Docset index pages can now scroll to a specific section within the page - [091f04a](https://github.com/Kapeli/Dash-iOS/commit/091f04a10754a4256bd5e35545b3532440e63571)\n\n# 1.8.6\n\n* Fixed an issue with the Apple API Reference docset which caused some pages to not load - [bac544a](https://github.com/Kapeli/Dash-iOS/commit/bac544af11f3823bb246989201623b3bee3b8a39)\n* Updated Stylus docset icon - [0ad39d3](https://github.com/Kapeli/Dash-iOS/commit/0ad39d3363ead03d430f2cd8dcfa1007c93e5697)\n\n# 1.8.5\n\n* Added Apple API Reference docset support for Xcode 9.3 - [c585578](https://github.com/Kapeli/Dash-iOS/commit/c585578d0ab965dd3481f4c06aff6c320873d5f3)\n\n# 1.8.4\n\n* Fixed an issue which caused the Apple API Reference docset to not be able to display some pages. Thanks to [@philosopherdog](https://github.com/philosopherdog) for reporting the issue - [#71](https://github.com/Kapeli/Dash-iOS/issues/71)\n* Fixed an issue which caused docset alphabetical sorting to be case-sensitive. Thanks to [@ewalkie](https://github.com/ewalkie) for reporting the issue - [#72](https://github.com/Kapeli/Dash-iOS/issues/72)\n\n# 1.8.3\n\n* Added support for sorting docsets alphabetically in the docset browser. Thanks to [@waffleboot](https://github.com/waffleboot) for the great work on this - [#69](https://github.com/Kapeli/Dash-iOS/pull/69)\n* Added support for Xcode 9.3 docs - [73cadfb](https://github.com/Kapeli/Dash-iOS/commit/73cadfbcbb6e172ec8d12c2ef222a64160e4e42d)\n\n# 1.8.2\n\n* Fixed crash at launch for release build - [c0d2582](https://github.com/Kapeli/Dash-iOS/commit/c0d2582e70dbeec560c03781727fd8dcf95b9e7d)\n\n# 1.8.1\n\n* Fixed Apple API Reference docset transfer issues - [#66](https://github.com/Kapeli/Dash-iOS/issues/66)\n\n# 1.8.0\n\n* Fixed docset index page button on iOS 11 - [7fd09e8](https://github.com/Kapeli/Dash-iOS/commit/7fd09e8cae3b981aa75662ef3d19111a3ab2039a)\n* Fixed an issue which caused the Swift docset to still appear in Dash, although it was removed - [ca9c9f6](https://github.com/Kapeli/Dash-iOS/commit/ca9c9f64daf9eac30c4dcc000f99240a424bb123)\n* Fixed an issue which caused the search results table to be inset on iOS 11 - [d022d88](https://github.com/Kapeli/Dash-iOS/commit/d022d888e21a37e54a9960239689cac54bb7ef5b)\n* Fixed an issue which caused search results to not be highlighted correctly - [aea602e](https://github.com/Kapeli/Dash-iOS/commit/aea602e9b5292c110f6cb934f892349a3290689d)\n* Fixed access to UI on background thread - [90b1875](https://github.com/Kapeli/Dash-iOS/commit/90b1875f3728f5ca4485693ec8209cf8342cecfe)\n* Fixed an issue which caused extra table row separators to appear above the search results table - [313893d](https://github.com/Kapeli/Dash-iOS/commit/313893ddeddb10b029d7bb2c324867a09a127946)\n* Fixed Settings button sometimes appearing faded - [2bb42fe](https://github.com/Kapeli/Dash-iOS/commit/2bb42fe2ee51a3fabadb921100da6b0c7674efbc)\n* Consolidated the OpenCV C, C++, Python and Java docsets into a single OpenCV docset - [9af12ee](https://github.com/Kapeli/Dash-iOS/commit/9af12ee33f4d60de14d4bbb0a0741be61296e2b0)\n\n# 1.7.0\n\n* Added support for adding docsets using the \"Open in...\" menu. Thanks to [@insightmind](https://github.com/insightmind) for the great work on this - [#52](https://github.com/Kapeli/Dash-iOS/pull/52)\n* Added Java SE9 docset - [7c727c2](https://github.com/Kapeli/Dash-iOS/commit/7c727c2d30d41c0f37a4588510a804e4300b8c61)\n* Added Java EE8 docset - [61e2df7](https://github.com/Kapeli/Dash-iOS/commit/61e2df74f955bcf22ff6611be1ff0f6e45f6024a)\n* Added AngularJS docset (now separate from the Angular docset) - [b0ef193](https://github.com/Kapeli/Dash-iOS/commit/b0ef1936b71b026baa92e76371331be26c1f32dd)\n* Removed Swift docset. Swift docs can be found in the Apple API Reference docset - [88913a6](https://github.com/Kapeli/Dash-iOS/commit/88913a6236c8c3c3874da63b300930496658637e)\n* Fixed an AirDrop issue. Thanks to [@ClementPadovani](https://github.com/ClementPadovani) for the fix - [#61](https://github.com/Kapeli/Dash-iOS/pull/61)\n* Added Glossary, Control Structure, Expression, Handler, Iterator, Widget, Block, Template types - [a94006b](https://github.com/Kapeli/Dash-iOS/commit/a94006bc39996c69d168f9c2d8f94b0e37c31ac6)\n\n# 1.6.3\n\n* Fixed an iPad-only crash which occurred in Settings while going into split view mode with the search field active - [36cf36d](https://github.com/Kapeli/Dash-iOS/commit/36cf36df40619ebfae903e39af4ea836e26fdc42)\n\n# 1.6.2\n\n* Fixed an issue which caused the iOS remote feature to sometimes not pair correctly - [9f9dd6c](https://github.com/Kapeli/Dash-iOS/commit/9f9dd6c8b5761b28899dcae01f828888ab9011d8)\n* Consolidated all Angular docsets into one - [56fda1b](https://github.com/Kapeli/Dash-iOS/commit/56fda1b4fa94fa910e377004ba7988ecc5e389eb)\n* Fixed an issue which caused empty rows to sometimes appear in the table of contents - [097197c](https://github.com/Kapeli/Dash-iOS/commit/097197c828db9e1b1524f46da41a0db92e7376cf)\n* Fixed an iPad-only crash which occurred in Settings while pressing Done with the search field active - [e87a069](https://github.com/Kapeli/Dash-iOS/commit/e87a069b6a94f31d9fac91be9ac6ca4569bcf251)\n* Fixed an issue in the User Contributed repo which caused author names to not be truncated when there's not enough space - [3482d8f](https://github.com/Kapeli/Dash-iOS/commit/3482d8f7cd0f6e19b1a42c80a69f09783565522a)\n* Added \"Data Source\" type - [6a45537](https://github.com/Kapeli/Dash-iOS/commit/6a45537447319a68341c2b4686da3b4753828310)\n\n# 1.6.1\n\n* Added support for receiving docsets using AirDrop. Thanks to [@vinayjn](https://github.com/vinayjn) for the great work on this - [#36](https://github.com/Kapeli/Dash-iOS/pull/36)\n* Added Pug docset. Removed Jade docset - [36fdff3](https://github.com/Kapeli/Dash-iOS/commit/36fdff3a2ac6d74bddb07ef8c430d46b19dd64d3)\n* Fixed build products path. Thanks to [@RegalMedia](https://github.com/RegalMedia) for reporting the issue - [#28](https://github.com/Kapeli/Dash-iOS/issues/28)\n* Fixed the display of included modules for Ruby docsets - [4416ccb](https://github.com/Kapeli/Dash-iOS/commit/4416ccbb7b78b0b4b0e72608f1ce5bd38a013b72)\n* Fixed Dash App Store display/product name - [5015177](https://github.com/Kapeli/Dash-iOS/commit/5015177c23cefaea0688db95b462b33705e12952)\n\n# 1.6.0\n\n* Added support for cheat sheets - [#22](https://github.com/Kapeli/Dash-iOS/pull/22)\n* Added support for user contributed docsets - [#20](https://github.com/Kapeli/Dash-iOS/pull/20)\n* Added state restoration support. Thanks to [@zhongwuzw](https://github.com/zhongwuzw) for the great work on this - [#18](https://github.com/Kapeli/Dash-iOS/pull/18)\n* Fixed Unity 3D docset bug which caused it to not remember the selected language. Thanks to [@hantengx](https://github.com/hantengx) for reporting the issue - [#17](https://github.com/Kapeli/Dash-iOS/issues/17)\n* Fixed a crash in the docset downloader. Thanks to [@zhongwuzw](https://github.com/zhongwuzw) for the fix - [#16](https://github.com/Kapeli/Dash-iOS/pull/16)\n* Stopped an evil `if()` from taking over the world. Thanks to [@BalestraPatrick](https://github.com/BalestraPatrick) for reporting the issue and [@flovilmart](https://github.com/flovilmart) for fixing it - [#4](https://github.com/Kapeli/Dash-iOS/pull/4)\n"
  },
  {
    "path": "Dash/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16B2657\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"H1p-Uh-vWS\">\n    <device id=\"retina5_5\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11524\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Navigation Controller-->\n        <scene sceneID=\"pY4-Hu-kfo\">\n            <objects>\n                <navigationController storyboardIdentifier=\"DHMainNavigationController\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"RMx-3f-FxP\" customClass=\"DHNavigationController\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" misplaced=\"YES\" id=\"Pmd-2v-anx\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"7bK-jq-Zjz\" kind=\"relationship\" relationship=\"rootViewController\" id=\"tsl-Nk-0bq\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"8fS-aE-onr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"246\" y=\"-545\"/>\n        </scene>\n        <!--Nested Result-->\n        <scene sceneID=\"ftd-z8-gfn\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHNestedBrowser\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"On6-fK-Wo0\" customClass=\"DHNestedViewController\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHNestedBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"34K-oz-RHA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"672\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA Cell\" id=\"x0P-fR-ekF\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"x0P-fR-ekF\" id=\"xkY-Bg-Jb1\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"On6-fK-Wo0\" id=\"1bW-nC-WxR\"/>\n                            <outlet property=\"delegate\" destination=\"On6-fK-Wo0\" id=\"33f-4n-Xfr\"/>\n                        </connections>\n                    </tableView>\n                    <extendedEdge key=\"edgesForExtendedLayout\" bottom=\"YES\"/>\n                    <navigationItem key=\"navigationItem\" title=\"Nested Result\" id=\"BLr-sT-VsR\"/>\n                    <connections>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHSearchWebViewSegue\" id=\"JVl-yk-gWU\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"qBi-q0-XGz\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2322\" y=\"404\"/>\n        </scene>\n        <!--WebView-->\n        <scene sceneID=\"yUG-lL-AsK\">\n            <objects>\n                <viewController storyboardIdentifier=\"DHWebViewController\" title=\"WebView\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"JEX-9P-axG\" customClass=\"DHWebViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"KEp-bG-ttG\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"UCD-CE-b5i\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"svH-Pt-448\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <webView opaque=\"NO\" contentMode=\"scaleToFill\" misplaced=\"YES\" restorationIdentifier=\"DHWebView\" scalesPageToFit=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0LW-3L-DOL\" customClass=\"DHWebView\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"600\" height=\"600\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\"/>\n                            </webView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"0LW-3L-DOL\" firstAttribute=\"top\" secondItem=\"svH-Pt-448\" secondAttribute=\"top\" id=\"0jL-UA-6vM\"/>\n                            <constraint firstItem=\"0LW-3L-DOL\" firstAttribute=\"leading\" secondItem=\"svH-Pt-448\" secondAttribute=\"leading\" id=\"Hek-yP-hkF\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"0LW-3L-DOL\" secondAttribute=\"bottom\" id=\"Jyu-U7-lXJ\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"0LW-3L-DOL\" secondAttribute=\"trailing\" id=\"TI5-dG-fOf\"/>\n                        </constraints>\n                    </view>\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" title=\"WebView\" id=\"LO3-Fn-NLm\"/>\n                    <simulatedToolbarMetrics key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"webView\" destination=\"0LW-3L-DOL\" id=\"ZcG-L8-Mdc\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"FJe-Yq-33r\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"246\" y=\"636\"/>\n        </scene>\n        <!--Split View Controller-->\n        <scene sceneID=\"Nki-YV-4Qg\">\n            <objects>\n                <splitViewController storyboardIdentifier=\"DHSplitView\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"H1p-Uh-vWS\" customClass=\"DHSplitViewController\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <connections>\n                        <segue destination=\"RMx-3f-FxP\" kind=\"relationship\" relationship=\"masterViewController\" id=\"BlO-5A-QYV\"/>\n                        <segue destination=\"vC3-pB-5Vb\" kind=\"relationship\" relationship=\"detailViewController\" id=\"Tll-UG-LXB\"/>\n                    </connections>\n                </splitViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"cZU-Oi-B1e\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-536.71875\" y=\"-544.921875\"/>\n        </scene>\n        <!--Settings-->\n        <scene sceneID=\"PgB-42-Mhn\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHPreferences\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"LN4-2N-5f1\" customClass=\"DHPreferences\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"static\" style=\"grouped\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"10\" sectionFooterHeight=\"10\" id=\"9XA-MP-Y6T\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"0.93725490199999995\" green=\"0.93725490199999995\" blue=\"0.95686274510000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <sections>\n                            <tableViewSection headerTitle=\"Download\" id=\"5ll-Jq-5KZ\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHSettingsCell\" textLabel=\"Ug3-nq-xyc\" imageView=\"CfY-ch-rUA\" style=\"IBUITableViewCellStyleDefault\" id=\"r0i-wt-QAr\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"55.333333333333336\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"r0i-wt-QAr\" id=\"x7u-4T-8E0\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Main Docsets\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Ug3-nq-xyc\">\n                                                    <rect key=\"frame\" x=\"63\" y=\"0.0\" width=\"331\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" image=\"main_repo\" id=\"CfY-ch-rUA\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"7\" width=\"28\" height=\"28\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                </imageView>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHSettingsCell\" textLabel=\"tCo-zC-KEK\" imageView=\"mGt-fn-iWH\" style=\"IBUITableViewCellStyleDefault\" id=\"Il7-Fa-eRd\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"99.333333333333343\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"Il7-Fa-eRd\" id=\"ewh-53-hgF\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Cheat Sheets\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"tCo-zC-KEK\">\n                                                    <rect key=\"frame\" x=\"63\" y=\"0.0\" width=\"331\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" image=\"cheat_repo\" id=\"mGt-fn-iWH\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"7\" width=\"28\" height=\"28\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                </imageView>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHSettingsCell\" textLabel=\"g0J-MY-Gyr\" imageView=\"6px-e6-A4A\" style=\"IBUITableViewCellStyleDefault\" id=\"gTK-ia-7zI\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"143.33333333333334\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"gTK-ia-7zI\" id=\"3LL-D8-sfE\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"User Contributed Docsets\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"g0J-MY-Gyr\">\n                                                    <rect key=\"frame\" x=\"63\" y=\"0.0\" width=\"331\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" image=\"user_repo\" id=\"6px-e6-A4A\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"7\" width=\"28\" height=\"28\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                </imageView>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Other Sources\" id=\"geA-nh-aJW\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHSettingsCell\" textLabel=\"tH7-qh-OUH\" imageView=\"hJO-jA-eBm\" style=\"IBUITableViewCellStyleDefault\" id=\"sda-gL-9CQ\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"235.33333333333334\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"sda-gL-9CQ\" id=\"Wp8-gy-b2o\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Transfer Docsets\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"tH7-qh-OUH\">\n                                                    <rect key=\"frame\" x=\"63\" y=\"0.0\" width=\"331\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <imageView opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" image=\"transfer_repo\" id=\"hJO-jA-eBm\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"7\" width=\"28\" height=\"28\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                </imageView>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection headerTitle=\"Settings\" footerTitle=\"Dash will notify you when docset updates are available.\" id=\"DSC-i5-noV\" userLabel=\"Updates Section\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"auto_updates\" textLabel=\"L5q-QS-QhJ\" style=\"IBUITableViewCellStyleDefault\" id=\"NBw-o2-OgI\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"334.66666666666669\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"NBw-o2-OgI\" id=\"P7F-Da-gdU\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Automatic Updates\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"L5q-QS-QhJ\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"374\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hvT-X0-nTG\">\n                                                    <rect key=\"frame\" x=\"345\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <connections>\n                                                        <action selector=\"updatesSwitchValueChanged:\" destination=\"LN4-2N-5f1\" eventType=\"valueChanged\" id=\"74Q-tw-KN2\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"hvT-X0-nTG\" firstAttribute=\"centerY\" secondItem=\"L5q-QS-QhJ\" secondAttribute=\"centerY\" id=\"Znc-x7-6X4\"/>\n                                                <constraint firstItem=\"hvT-X0-nTG\" firstAttribute=\"trailing\" secondItem=\"L5q-QS-QhJ\" secondAttribute=\"trailing\" id=\"rUM-hk-XWB\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                            <tableViewSection footerTitle=\"Docsets will be sorted alphabetically in the docset browser.\" id=\"o2t-VJ-no4\" userLabel=\"Alphabetizing Section\">\n                                <cells>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"none\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"alphabetizing\" textLabel=\"j8z-O0-bgo\" style=\"IBUITableViewCellStyleDefault\" id=\"qBR-gw-pYW\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"418.66666666666674\" width=\"414\" height=\"44\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"qBR-gw-pYW\" id=\"1cz-0u-7TA\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Sort Alphabetically\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"j8z-O0-bgo\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"0.0\" width=\"374\" height=\"43.666666666666664\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"18\"/>\n                                                    <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" on=\"YES\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wrv-Ov-oob\">\n                                                    <rect key=\"frame\" x=\"345\" y=\"6\" width=\"51\" height=\"31\"/>\n                                                    <connections>\n                                                        <action selector=\"alphabetizingSwitchValueChanged:\" destination=\"LN4-2N-5f1\" eventType=\"valueChanged\" id=\"uRX-cV-Fn1\"/>\n                                                    </connections>\n                                                </switch>\n                                            </subviews>\n                                            <constraints>\n                                                <constraint firstItem=\"Wrv-Ov-oob\" firstAttribute=\"centerY\" secondItem=\"j8z-O0-bgo\" secondAttribute=\"centerY\" id=\"aQw-Zc-KSP\"/>\n                                                <constraint firstItem=\"Wrv-Ov-oob\" firstAttribute=\"trailing\" secondItem=\"j8z-O0-bgo\" secondAttribute=\"trailing\" id=\"df9-KI-7WX\"/>\n                                            </constraints>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </cells>\n                            </tableViewSection>\n                        </sections>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"LN4-2N-5f1\" id=\"Efj-iq-t4A\"/>\n                            <outlet property=\"delegate\" destination=\"LN4-2N-5f1\" id=\"u0Q-nm-tNM\"/>\n                        </connections>\n                    </tableView>\n                    <toolbarItems>\n                        <barButtonItem style=\"plain\" systemItem=\"flexibleSpace\" id=\"T2e-0d-yIN\"/>\n                        <barButtonItem title=\"Get Dash for macOS\" id=\"2rJ-qk-tNm\">\n                            <connections>\n                                <action selector=\"getDashForMacOS:\" destination=\"LN4-2N-5f1\" id=\"53W-TV-cwl\"/>\n                            </connections>\n                        </barButtonItem>\n                        <barButtonItem style=\"plain\" systemItem=\"flexibleSpace\" id=\"vy5-DI-Lqt\"/>\n                    </toolbarItems>\n                    <navigationItem key=\"navigationItem\" title=\"Settings\" id=\"OIB-dx-J0z\">\n                        <barButtonItem key=\"leftBarButtonItem\" style=\"done\" systemItem=\"done\" id=\"Fip-DI-Smg\">\n                            <connections>\n                                <action selector=\"dismissModal:\" destination=\"LN4-2N-5f1\" id=\"KMc-0W-FPt\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <simulatedToolbarMetrics key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"alphabetizingCell\" destination=\"qBR-gw-pYW\" id=\"2ud-R6-qlJ\"/>\n                        <outlet property=\"alphabetizingSwitch\" destination=\"Wrv-Ov-oob\" id=\"xXQ-YN-OMD\"/>\n                        <outlet property=\"updatesCell\" destination=\"NBw-o2-OgI\" id=\"jen-wa-vKn\"/>\n                        <outlet property=\"updatesSwitch\" destination=\"hvT-X0-nTG\" id=\"uqh-Ew-FYx\"/>\n                        <segue destination=\"bVq-xA-3wd\" kind=\"push\" identifier=\"DHDocsetDownloaderToDetailSegue\" splitViewControllerTargetIndex=\"1\" id=\"078-Zd-cbO\"/>\n                        <segue destination=\"KZf-iV-yPx\" kind=\"push\" identifier=\"DHDocsetTransferrerToMasterSegue\" splitViewControllerTargetIndex=\"0\" id=\"vh9-ti-qTq\"/>\n                        <segue destination=\"KZf-iV-yPx\" kind=\"push\" identifier=\"DHDocsetTransferrerToDetailSegue\" splitViewControllerTargetIndex=\"1\" id=\"jto-ap-CAv\"/>\n                        <segue destination=\"bVq-xA-3wd\" kind=\"push\" identifier=\"DHDocsetDownloaderToMasterSegue\" splitViewControllerTargetIndex=\"0\" id=\"tZ0-kY-m9B\"/>\n                        <segue destination=\"7Pl-oD-WzV\" kind=\"push\" identifier=\"DHUserRepoToDetailSegue\" splitViewControllerTargetIndex=\"1\" id=\"UMU-KR-a0h\"/>\n                        <segue destination=\"7Pl-oD-WzV\" kind=\"push\" identifier=\"DHUserRepoToMasterSegue\" splitViewControllerTargetIndex=\"0\" id=\"BNM-LK-jE2\"/>\n                        <segue destination=\"bSe-FO-aTh\" kind=\"push\" identifier=\"DHCheatRepoToDetailSegue\" splitViewControllerTargetIndex=\"1\" id=\"oW0-T5-9L9\"/>\n                        <segue destination=\"bSe-FO-aTh\" kind=\"push\" identifier=\"DHCheatRepoToMasterSegue\" splitViewControllerTargetIndex=\"0\" id=\"z3k-ky-jyi\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"fmo-gt-gw4\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1586\" y=\"-1657\"/>\n        </scene>\n        <!--Docset Browser-->\n        <scene sceneID=\"smW-Zh-WAh\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHDocsetsBrowser\" title=\"Docset Browser\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" clearsSelectionOnViewWillAppear=\"NO\" id=\"7bK-jq-Zjz\" customClass=\"DHDocsetBrowser\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHDocsetsBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"r7i-6Z-zg0\" customClass=\"DHBrowserTableView\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" restorationIdentifier=\"DocsetsSearchBar\" id=\"VJZ-Lp-FAA\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"7bK-jq-Zjz\" id=\"dJ4-gv-uRt\"/>\n                            </connections>\n                        </searchBar>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA\" id=\"H2Y-Rn-XFZ\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"66\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"H2Y-Rn-XFZ\" id=\"kux-Q3-Ab3\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <sections/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"7bK-jq-Zjz\" id=\"Gho-Na-rnu\"/>\n                            <outlet property=\"delegate\" destination=\"7bK-jq-Zjz\" id=\"RA6-mI-bju\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Docsets\" id=\"Zdf-7t-Un8\">\n                        <barButtonItem key=\"leftBarButtonItem\" title=\"Settings\" id=\"UFq-dX-jiF\">\n                            <connections>\n                                <action selector=\"openSettings:\" destination=\"7bK-jq-Zjz\" id=\"q2C-N5-b8Q\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <connections>\n                        <outlet property=\"searchDisplayController\" destination=\"4Nc-re-3YX\" id=\"d5C-Zk-9Cy\"/>\n                        <segue destination=\"LN4-2N-5f1\" kind=\"show\" identifier=\"DHOpenSettingsSegue\" id=\"4LN-qs-RRA\"/>\n                        <segue destination=\"bVq-xA-3wd\" kind=\"push\" identifier=\"DHDocsetDownloaderToDetailSegue\" splitViewControllerTargetIndex=\"1\" id=\"BAb-G2-tNG\"/>\n                        <segue destination=\"MG8-DW-Fv2\" kind=\"show\" identifier=\"DHTypeBrowserSegue\" id=\"Ocj-J9-g6q\"/>\n                        <segue destination=\"On6-fK-Wo0\" kind=\"show\" identifier=\"DHNestedSegue\" id=\"Zvp-4Y-BjQ\"/>\n                        <segue destination=\"fAU-6P-OeP\" kind=\"show\" identifier=\"DHRemoteBrowserSegue\" id=\"bdX-NV-KLl\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHSearchWebViewSegue\" id=\"iku-X1-02v\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Rux-fX-hf1\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"4Nc-re-3YX\" customClass=\"DHSearchDisplayController\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"7bK-jq-Zjz\" id=\"t43-uI-qHE\"/>\n                        <outlet property=\"searchBar\" destination=\"VJZ-Lp-FAA\" id=\"sUn-GY-TJA\"/>\n                        <outlet property=\"searchContentsController\" destination=\"7bK-jq-Zjz\" id=\"FYG-uq-SSP\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"7bK-jq-Zjz\" id=\"58Z-1R-yn6\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"7bK-jq-Zjz\" id=\"Yap-xw-oMZ\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"918\" y=\"-545\"/>\n        </scene>\n        <!--Type Browser-->\n        <scene sceneID=\"0HO-gO-dJg\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHTypesBrowser\" title=\"Type Browser\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"MG8-DW-Fv2\" customClass=\"DHTypeBrowser\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHTypesBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"XY4-1C-CBf\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" id=\"VJR-eZ-B8V\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"MG8-DW-Fv2\" id=\"4dd-ej-3oY\"/>\n                            </connections>\n                        </searchBar>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA\" id=\"VA8-am-q6Z\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"66\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"VA8-am-q6Z\" id=\"nIL-hj-vFk\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"MG8-DW-Fv2\" id=\"9mk-Iz-bpP\"/>\n                            <outlet property=\"delegate\" destination=\"MG8-DW-Fv2\" id=\"Nn0-Nk-gye\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Types\" id=\"1DN-dq-KAm\"/>\n                    <connections>\n                        <outlet property=\"searchDisplayController\" destination=\"QXT-TT-18q\" id=\"Ffp-2g-pgc\"/>\n                        <segue destination=\"9Rs-Yt-R1b\" kind=\"show\" identifier=\"DHEntryBrowserSegue\" id=\"FUX-Tg-BvC\"/>\n                        <segue destination=\"On6-fK-Wo0\" kind=\"show\" identifier=\"DHNestedSegue\" id=\"ljv-Qq-slv\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHSearchWebViewSegue\" id=\"l26-aC-Nx3\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHShowIndexPageSegue\" id=\"5fr-qx-aky\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"l8s-68-JtL\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"QXT-TT-18q\" customClass=\"DHSearchDisplayController\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"MG8-DW-Fv2\" id=\"NhR-F4-gaX\"/>\n                        <outlet property=\"searchBar\" destination=\"VJR-eZ-B8V\" id=\"ZoK-EI-6Xc\"/>\n                        <outlet property=\"searchContentsController\" destination=\"MG8-DW-Fv2\" id=\"59w-BX-ea7\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"MG8-DW-Fv2\" id=\"SJ6-b1-uYr\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"MG8-DW-Fv2\" id=\"kPV-0H-TmG\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1743\" y=\"-451\"/>\n        </scene>\n        <!--Entry Browser-->\n        <scene sceneID=\"hsl-sd-m15\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHEntriesBrowser\" title=\"Type Browser\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"9Rs-Yt-R1b\" userLabel=\"Entry Browser\" customClass=\"DHEntryBrowser\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHEntriesBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"wwv-Id-rNo\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" restorationIdentifier=\"EntriesSearchBar\" id=\"ar1-R2-LNh\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"9Rs-Yt-R1b\" id=\"dCU-Oq-KCt\"/>\n                            </connections>\n                        </searchBar>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA\" id=\"gr3-qP-hfk\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"66\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"gr3-qP-hfk\" id=\"HWD-2S-7F9\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"9Rs-Yt-R1b\" id=\"6dg-AY-vP5\"/>\n                            <outlet property=\"delegate\" destination=\"9Rs-Yt-R1b\" id=\"nix-zh-9ZC\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Entries\" id=\"Un0-xc-bRD\"/>\n                    <connections>\n                        <outlet property=\"searchDisplayController\" destination=\"zcF-qB-4QT\" id=\"cms-mv-pRf\"/>\n                        <segue destination=\"On6-fK-Wo0\" kind=\"show\" identifier=\"DHNestedSegue\" id=\"y34-0z-6ul\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHSearchWebViewSegue\" id=\"hEp-xK-Brz\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHWebViewSegue\" id=\"Vt3-tf-TGA\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"KwV-Su-f2V\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"zcF-qB-4QT\" customClass=\"DHSearchDisplayController\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"9Rs-Yt-R1b\" id=\"PES-ZY-NqP\"/>\n                        <outlet property=\"searchBar\" destination=\"ar1-R2-LNh\" id=\"Yvm-7w-6oa\"/>\n                        <outlet property=\"searchContentsController\" destination=\"9Rs-Yt-R1b\" id=\"8Ws-Jg-PC2\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"9Rs-Yt-R1b\" id=\"eHe-KB-xvu\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"9Rs-Yt-R1b\" id=\"jRI-Em-gu9\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2556\" y=\"-470\"/>\n        </scene>\n        <!--Remote Browser-->\n        <scene sceneID=\"gnf-QR-1ra\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHRemoteBrowser\" title=\"Remote Browser\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"fAU-6P-OeP\" customClass=\"DHRemoteBrowser\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHEntriesBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"GI0-k2-aY7\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA\" id=\"geM-gl-w4a\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"22\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"geM-gl-w4a\" id=\"dRi-kM-G9B\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"fAU-6P-OeP\" id=\"NIx-So-K1H\"/>\n                            <outlet property=\"delegate\" destination=\"fAU-6P-OeP\" id=\"bP7-1o-Pks\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Remotes\" id=\"q55-40-w46\"/>\n                    <connections>\n                        <outlet property=\"searchDisplayController\" destination=\"zcF-qB-4QT\" id=\"Vgn-AA-Bhw\"/>\n                        <segue destination=\"On6-fK-Wo0\" kind=\"show\" identifier=\"DHNestedSegue\" id=\"cEQ-Zo-INv\"/>\n                        <segue destination=\"JEX-9P-axG\" kind=\"push\" identifier=\"DHSearchWebViewSegue\" id=\"q6b-SO-d4X\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"fUb-q5-H6p\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1383\" y=\"353\"/>\n        </scene>\n        <!--Main Docsets-->\n        <scene sceneID=\"j1n-HE-PZF\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHDocsetDownloader\" modalPresentationStyle=\"currentContext\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"bVq-xA-3wd\" customClass=\"DHDocsetDownloader\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHDocsetsDownloaderTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" allowsSelection=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"Ktb-IW-SX0\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" restorationIdentifier=\"DownloadSearchBar\" placeholder=\"Find docsets to download\" id=\"ibw-RZ-LKe\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"bVq-xA-3wd\" id=\"Ihj-hM-GF4\"/>\n                            </connections>\n                        </searchBar>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"bVq-xA-3wd\" id=\"nTB-cw-YaL\"/>\n                            <outlet property=\"delegate\" destination=\"bVq-xA-3wd\" id=\"kNS-Ag-j4A\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Main Docsets\" id=\"9ic-mO-5WP\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Update\" id=\"rwQ-iw-bgR\">\n                            <connections>\n                                <action selector=\"updateButtonPressed:\" destination=\"bVq-xA-3wd\" id=\"KBw-7q-bpx\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"searchBar\" destination=\"ibw-RZ-LKe\" id=\"Q52-Do-Tr4\"/>\n                        <outlet property=\"searchDisplayController\" destination=\"PMB-N5-wGr\" id=\"pz9-mU-T4r\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"0xz-hu-dUi\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"PMB-N5-wGr\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"bVq-xA-3wd\" id=\"xQ2-19-HTr\"/>\n                        <outlet property=\"searchBar\" destination=\"ibw-RZ-LKe\" id=\"N2f-yf-RkE\"/>\n                        <outlet property=\"searchContentsController\" destination=\"bVq-xA-3wd\" id=\"lUZ-i4-ck1\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"bVq-xA-3wd\" id=\"SiM-kY-Q8J\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"bVq-xA-3wd\" id=\"wdp-p8-Zh2\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2445\" y=\"-3288\"/>\n        </scene>\n        <!--User Contributed Docsets-->\n        <scene sceneID=\"okr-5a-bHb\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHUserRepo\" modalPresentationStyle=\"currentContext\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"7Pl-oD-WzV\" userLabel=\"User Contributed Docsets\" customClass=\"DHUserRepo\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHUserRepoTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" allowsSelection=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"o2K-Hn-pqx\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" restorationIdentifier=\"UserRepoSearchBar\" placeholder=\"Find docsets to download\" id=\"frS-D7-CD1\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"7Pl-oD-WzV\" id=\"G9T-Rt-21p\"/>\n                            </connections>\n                        </searchBar>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"7Pl-oD-WzV\" id=\"VGy-Sm-bWh\"/>\n                            <outlet property=\"delegate\" destination=\"7Pl-oD-WzV\" id=\"PBv-CB-bY0\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"User Contributed Docsets\" id=\"7o6-m1-emM\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Update\" id=\"nLQ-uE-WPX\">\n                            <connections>\n                                <action selector=\"updateButtonPressed:\" destination=\"7Pl-oD-WzV\" id=\"Ix3-Ob-twG\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"searchBar\" destination=\"frS-D7-CD1\" id=\"faI-Fs-5RH\"/>\n                        <outlet property=\"searchDisplayController\" destination=\"PMB-N5-wGr\" id=\"UiB-JZ-mBV\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"DbY-qO-Frw\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"NDK-Ah-hu2\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"7Pl-oD-WzV\" id=\"8Tv-80-sIu\"/>\n                        <outlet property=\"searchBar\" destination=\"frS-D7-CD1\" id=\"L4k-b0-GNj\"/>\n                        <outlet property=\"searchContentsController\" destination=\"7Pl-oD-WzV\" id=\"3mr-yZ-Dez\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"7Pl-oD-WzV\" id=\"dNb-KO-I0W\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"7Pl-oD-WzV\" id=\"hEh-mv-02t\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2445\" y=\"-2618\"/>\n        </scene>\n        <!--Transfer Docsets-->\n        <scene sceneID=\"dSW-F9-RBB\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHDocsetTransferrer\" modalPresentationStyle=\"currentContext\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"KZf-iV-yPx\" customClass=\"DHDocsetTransferrer\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHTransferDocsetsTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" allowsSelection=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"RlC-hy-GCI\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"KZf-iV-yPx\" id=\"ICT-G5-j4u\"/>\n                            <outlet property=\"delegate\" destination=\"KZf-iV-yPx\" id=\"4Gd-H2-3Ta\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Transfer Docsets\" id=\"w85-3G-Wi2\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Refresh\" id=\"g6k-h1-fQg\">\n                            <connections>\n                                <action selector=\"refreshFeeds:\" destination=\"KZf-iV-yPx\" id=\"seQ-0r-Kic\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"Ar8-em-khk\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2468\" y=\"-1204\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"r7l-gg-dq7\">\n            <objects>\n                <navigationController storyboardIdentifier=\"DHWebViewNavigationController\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"vC3-pB-5Vb\" customClass=\"DHNavigationController\" sceneMemberID=\"viewController\">\n                    <navigationBar key=\"navigationBar\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" misplaced=\"YES\" id=\"DjV-YW-jjY\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"JEX-9P-axG\" kind=\"relationship\" relationship=\"rootViewController\" id=\"GKi-kA-LjT\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"SLD-UC-DBI\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-539.453125\" y=\"588.28125\"/>\n        </scene>\n        <!--ToC Browser-->\n        <scene sceneID=\"krs-xc-y3h\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHTocBrowser\" title=\"Table of Contents\" clearsSelectionOnViewWillAppear=\"NO\" id=\"Wkz-GU-NNB\" userLabel=\"ToC Browser\" customClass=\"DHTocBrowser\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHTocBrowserTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"us7-S7-Voe\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" id=\"Lzc-4G-LSC\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <rect key=\"contentStretch\" x=\"0.0\" y=\"0.0\" width=\"0.0\" height=\"0.0\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"Wkz-GU-NNB\" id=\"08o-8I-7Be\"/>\n                            </connections>\n                        </searchBar>\n                        <prototypes>\n                            <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"default\" indentationWidth=\"10\" reuseIdentifier=\"BLABLA\" id=\"uat-DW-uld\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"66\" width=\"414\" height=\"44\"/>\n                                <autoresizingMask key=\"autoresizingMask\"/>\n                                <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"uat-DW-uld\" id=\"B7g-3q-qBW\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"43.666666666666664\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </tableViewCellContentView>\n                            </tableViewCell>\n                        </prototypes>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"Wkz-GU-NNB\" id=\"b4q-De-aK8\"/>\n                            <outlet property=\"delegate\" destination=\"Wkz-GU-NNB\" id=\"Zcd-Yw-Zcp\"/>\n                        </connections>\n                    </tableView>\n                    <toolbarItems/>\n                    <navigationItem key=\"navigationItem\" title=\"Table of Contents\" id=\"zNW-Es-vkB\">\n                        <barButtonItem key=\"rightBarButtonItem\" style=\"done\" systemItem=\"done\" id=\"g7R-rT-w04\">\n                            <connections>\n                                <action selector=\"dismissModal:\" destination=\"Wkz-GU-NNB\" id=\"u7Z-XE-Bwx\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <simulatedToolbarMetrics key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"searchBar\" destination=\"Lzc-4G-LSC\" id=\"kW7-uu-5Rf\"/>\n                        <outlet property=\"searchDisplayController\" destination=\"QXT-TT-18q\" id=\"hDw-2l-hBA\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"1fg-gS-VxA\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"8u3-sF-Owm\" customClass=\"DHSearchDisplayController\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Wkz-GU-NNB\" id=\"kvD-zX-wpP\"/>\n                        <outlet property=\"searchBar\" destination=\"Lzc-4G-LSC\" id=\"fNw-gA-Vhh\"/>\n                        <outlet property=\"searchContentsController\" destination=\"Wkz-GU-NNB\" id=\"8fa-tp-JZ0\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"Wkz-GU-NNB\" id=\"ga5-o2-6Ts\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"Wkz-GU-NNB\" id=\"M5n-z4-w4w\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1999\" y=\"1202\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"lHw-UH-CNc\">\n            <objects>\n                <navigationController storyboardIdentifier=\"DHTocBrowserNavigationController\" automaticallyAdjustsScrollViewInsets=\"NO\" id=\"pJz-3h-N98\" customClass=\"DHNavigationController\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" misplaced=\"YES\" id=\"U01-gx-C7H\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"Wkz-GU-NNB\" kind=\"relationship\" relationship=\"rootViewController\" id=\"3ME-RF-aVw\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"QwS-fp-JCr\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1177\" y=\"1202\"/>\n        </scene>\n        <!--Cheat Sheets-->\n        <scene sceneID=\"kGo-MS-1Iv\">\n            <objects>\n                <tableViewController storyboardIdentifier=\"DHCheatRepo\" modalPresentationStyle=\"currentContext\" useStoryboardIdentifierAsRestorationIdentifier=\"YES\" id=\"bSe-FO-aTh\" userLabel=\"Cheat Sheets\" customClass=\"DHCheatRepo\" sceneMemberID=\"viewController\">\n                    <tableView key=\"view\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" restorationIdentifier=\"DHCheatRepoTableView\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" allowsSelection=\"NO\" rowHeight=\"44\" sectionHeaderHeight=\"22\" sectionFooterHeight=\"22\" id=\"9Wm-HT-qeH\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"736\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <searchBar key=\"tableHeaderView\" contentMode=\"redraw\" restorationIdentifier=\"CheatRepoSearchBar\" placeholder=\"Find cheat sheets to download\" id=\"0Tx-yl-ZpH\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"44\"/>\n                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                            <textInputTraits key=\"textInputTraits\" autocorrectionType=\"no\" spellCheckingType=\"no\"/>\n                            <connections>\n                                <outlet property=\"delegate\" destination=\"bSe-FO-aTh\" id=\"tFS-Ty-amy\"/>\n                            </connections>\n                        </searchBar>\n                        <connections>\n                            <outlet property=\"dataSource\" destination=\"bSe-FO-aTh\" id=\"ZXy-xZ-NcM\"/>\n                            <outlet property=\"delegate\" destination=\"bSe-FO-aTh\" id=\"hUe-NY-iYK\"/>\n                        </connections>\n                    </tableView>\n                    <navigationItem key=\"navigationItem\" title=\"Cheat Sheets\" id=\"EeG-gR-3NH\" userLabel=\"Cheat Sheets\">\n                        <barButtonItem key=\"rightBarButtonItem\" title=\"Update\" id=\"20V-ZH-ehJ\">\n                            <connections>\n                                <action selector=\"updateButtonPressed:\" destination=\"bSe-FO-aTh\" id=\"OHn-dd-osM\"/>\n                            </connections>\n                        </barButtonItem>\n                    </navigationItem>\n                    <nil key=\"simulatedBottomBarMetrics\"/>\n                    <connections>\n                        <outlet property=\"searchBar\" destination=\"0Tx-yl-ZpH\" id=\"pnt-J4-9nb\"/>\n                        <outlet property=\"searchDisplayController\" destination=\"PMB-N5-wGr\" id=\"SJx-7j-3jo\"/>\n                    </connections>\n                </tableViewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"lpb-DD-g0c\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n                <searchDisplayController id=\"gvn-dN-aaF\">\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"bSe-FO-aTh\" id=\"tNi-fL-tpC\"/>\n                        <outlet property=\"searchBar\" destination=\"0Tx-yl-ZpH\" id=\"0qn-rZ-zFT\"/>\n                        <outlet property=\"searchContentsController\" destination=\"bSe-FO-aTh\" id=\"q2m-lz-cUb\"/>\n                        <outlet property=\"searchResultsDataSource\" destination=\"bSe-FO-aTh\" id=\"FR4-Tz-wfo\"/>\n                        <outlet property=\"searchResultsDelegate\" destination=\"bSe-FO-aTh\" id=\"PLW-Zm-zsW\"/>\n                    </connections>\n                </searchDisplayController>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2445\" y=\"-1928\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"cheat_repo\" width=\"28\" height=\"28\"/>\n        <image name=\"main_repo\" width=\"28\" height=\"28\"/>\n        <image name=\"transfer_repo\" width=\"28\" height=\"28\"/>\n        <image name=\"user_repo\" width=\"28\" height=\"28\"/>\n    </resources>\n    <inferredMetricsTieBreakers>\n        <segue reference=\"z3k-ky-jyi\"/>\n        <segue reference=\"vh9-ti-qTq\"/>\n        <segue reference=\"UMU-KR-a0h\"/>\n        <segue reference=\"tZ0-kY-m9B\"/>\n        <segue reference=\"GKi-kA-LjT\"/>\n        <segue reference=\"ljv-Qq-slv\"/>\n    </inferredMetricsTieBreakers>\n</document>\n"
  },
  {
    "path": "Dash/DHAppDelegate.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHWindow.h\"\n\n@interface DHAppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) DHWindow *_window;\n@property (strong) NSTimer *clipboardChangedTimer;\n\n+ (DHAppDelegate *)sharedDelegate;\n+ (UIStoryboard *)mainStoryboard;\n\n@end\n"
  },
  {
    "path": "Dash/DHAppDelegate.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHAppDelegate.h\"\n#import \"DHDocsetDownloader.h\"\n#import \"DHUserRepo.h\"\n#import \"DHCheatRepo.h\"\n#import \"DHDocsetTransferrer.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHTarixProtocol.h\"\n#import \"DHBlockProtocol.h\"\n#import \"DHAppleAPIProtocol.h\"\n#import \"DHCSS.h\"\n#import \"DHWebViewController.h\"\n#import \"DHAppUpdateChecker.h\"\n#import \"DHDocsetBrowser.h\"\n#ifdef APP_STORE\n#import <HockeySDK/HockeySDK.h>\n#endif\n#import \"DHRemoteServer.h\"\n#import \"DHRemoteProtocol.h\"\n\n@implementation DHAppDelegate\n\n+ (DHAppDelegate *)sharedDelegate\n{\n    return (id)[[UIApplication sharedApplication] delegate];\n}\n\n+ (UIStoryboard *)mainStoryboard\n{\n    return [self sharedDelegate].window.rootViewController.storyboard;\n}\n\n- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    [self setDoNotBackUp]; // this needs to be first because it deletes the preferences after a backup restore\n    NSLog(@\"Home Path: %@\", homePath);\n    [self.window makeKeyAndVisible];\n    \n    NSString *cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];\n    if(cacheDir)\n    {\n        [[NSFileManager defaultManager] removeItemAtPath:[cacheDir stringByAppendingPathComponent:@\"com.apple.nsurlsessiond/Downloads\"] error:nil];\n    }\n    \n#ifdef APP_STORE\n#ifndef DEBUG\n    [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"40091a11e4b749fcb7808992057b165a\"];\n    [[BITHockeyManager sharedHockeyManager].crashManager setCrashManagerStatus:BITCrashManagerStatusAutoSend];\n    [[BITHockeyManager sharedHockeyManager] startManager];\n    [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation];\n#endif\n#endif\n    \n#ifdef DEBUG\n    [self checkCommitHashes];\n#endif\n//    NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@\"Mozilla/5.0 (iPhone; CPU iPhone OS 10_10 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B411 Xcode/6.1.0\", @\"UserAgent\", nil];\n//    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];\n    \n//    NSLog(@\"%@\", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);\n\n    NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:4*1024*1024 diskCapacity:32*1024*1024 diskPath:@\"dh_nsurlcache\"];\n    [sharedCache removeAllCachedResponses];\n    [NSURLCache setSharedURLCache:sharedCache];\n    [NSURLProtocol registerClass:[DHTarixProtocol class]];\n    [NSURLProtocol registerClass:[DHAppleAPIProtocol class]];\n    [NSURLProtocol registerClass:[DHRemoteProtocol class]];\n    [NSURLProtocol registerClass:[DHBlockProtocol class]];\n    [[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@\"Defaults\" ofType:@\"plist\"]]];\n    [DHDocset stepLock];\n    [DHDocsetManager sharedManager];\n    [DHCSS sharedCSS];\n    [DHDBResultSorter sharedSorter];\n    [DHDBNestedResultSorter sharedSorter];\n//    self.window.tintColor = [UIColor purpleColor];\n    [DHDocsetDownloader sharedDownloader];\n    [DHDocsetTransferrer sharedTransferrer];\n    [DHUserRepo sharedUserRepo];\n    [DHCheatRepo sharedCheatRepo];\n    [DHRemoteServer sharedServer];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clipboardChanged:) name:UIPasteboardChangedNotification object:nil];\n    return YES;\n}\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n    UITextField *lagFreeField = [[UITextField alloc] init];\n    [self.window addSubview:lagFreeField];\n    [lagFreeField becomeFirstResponder];\n    [lagFreeField resignFirstResponder];\n    [lagFreeField setHidden:YES];\n    return YES;\n}\n\n- (BOOL)application:(UIApplication *)application openURL:(NSURL *)actualURL sourceApplication:(NSString *)sourceApplication annotation:(id)annotation\n{\n    if([[actualURL absoluteString] hasCaseInsensitivePrefix:@\"dash://\"] || [[actualURL absoluteString] hasCaseInsensitivePrefix:@\"dash-plugin://\"])\n    {\n        [[NSNotificationCenter defaultCenter] postNotificationName:DHPrepareForURLSearch object:nil];\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            [[NSNotificationCenter defaultCenter] postNotificationName:DHPerformURLSearch object:[actualURL absoluteString]];\n        });\n    }\n    else if([[actualURL pathExtension] isCaseInsensitiveEqual:@\"docset\"])\n    {\n        NSError *error;\n        NSString *fileName = [actualURL lastPathComponent];\n        NSURL *copyToURL = [[NSURL fileURLWithPath:transfersPath] URLByAppendingPathComponent:fileName isDirectory:NO];\n        [[NSFileManager defaultManager] removeItemAtPath:copyToURL.path error:nil];\n        [[NSFileManager defaultManager] moveItemAtURL:actualURL toURL:copyToURL error:&error];\n        NSString *title;\n        NSString *message;\n        if(error)\n        {\n            title = @\"Import Failed\";\n            message = @\"Could not import the docset. Please try again!\";\n            NSLog(@\"%@\", error.localizedDescription);\n        }\n        else\n        {\n            title = @\"Import Successful\";\n            message = @\"You can find the docset in Settings, under the Transfer Docsets section.\";\n            NSLog(@\"Docset successfully imported\");\n        }\n        UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle: UIAlertControllerStyleAlert];\n        [alert addAction:[UIAlertAction actionWithTitle:@\"Okay\" style:UIAlertActionStyleDefault handler:nil]];\n        [[self topViewController] presentViewController:alert animated:YES completion:nil];\n    }\n    return YES;\n}\n\n- (UINavigationController *)navigationController\n{\n    if([self.window.rootViewController isKindOfClass:[UINavigationController class]])\n    {\n        return (UINavigationController*)self.window.rootViewController;\n    }\n    return self.window.rootViewController.navigationController;\n}\n\n- (void)applicationWillResignActive:(UIApplication *)application\n{\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)applicationDidEnterBackground:(UIApplication *)application\n{\n    [[NSUserDefaults standardUserDefaults] synchronize];\n}\n\n- (void)applicationWillEnterForeground:(UIApplication *)application\n{\n\n}\n\n- (void)applicationDidBecomeActive:(UIApplication *)application\n{\n    if(![[DHAppUpdateChecker sharedUpdateChecker] alertIfUpdatesAreScheduled])\n    {\n        [[DHAppUpdateChecker sharedUpdateChecker] backgroundCheckForUpdatesIfNeeded];\n        if(![[DHDocsetDownloader sharedDownloader] alertIfUpdatesAreScheduled])\n        {\n            [[DHDocsetDownloader sharedDownloader] backgroundCheckForUpdatesIfNeeded];\n            if(![[DHUserRepo sharedUserRepo] alertIfUpdatesAreScheduled])\n            {\n                [[DHUserRepo sharedUserRepo] backgroundCheckForUpdatesIfNeeded];\n                if(![[DHCheatRepo sharedCheatRepo] alertIfUpdatesAreScheduled])\n                {\n                    [[DHCheatRepo sharedCheatRepo] backgroundCheckForUpdatesIfNeeded];\n                }\n            }\n        }\n    }\n}\n\n- (void)applicationWillTerminate:(UIApplication *)application\n{\n    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n}\n\n- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application\n{\n    [[NSURLCache sharedURLCache] removeAllCachedResponses];\n    NSLog(@\"did receive memory warning\");\n}\n\n- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler\n{\n    [[NSOperationQueue mainQueue] addOperationWithBlock:^{\n        completionHandler();\n    }];\n}\n\n#pragma mark - UIStateRestoration\n\n- (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder {\n    return YES;\n}\n\n- (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder {\n    return YES;\n}\n\n- (void)setDoNotBackUp\n{\n    NSString *path = [homePath stringByAppendingPathComponent:@\"Docsets\"];\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if(![fileManager fileExistsAtPath:path])\n    {\n        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n        for(NSString *key in @[@\"DHDocsetDownloaderScheduledUpdate\", @\"DHDocsetDownloader\", @\"DHDocsetTransferrer\", @\"docsets\"])\n        {\n            [defaults removeObjectForKey:key];\n        }\n        [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:nil];\n    }\n    NSURL *url = [NSURL fileURLWithPath:path];\n    [url setResourceValue:@YES forKey: NSURLIsExcludedFromBackupKey error:nil];\n}\n\n- (void)clipboardChanged:(NSNotification*)notification\n{\n    NSString *string = [UIPasteboard generalPasteboard].string;\n    if(string && string.length && [DHRemoteServer sharedServer].connectedRemote)\n    {\n        self.clipboardChangedTimer = [self.clipboardChangedTimer invalidateTimer];\n        self.clipboardChangedTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 block:^{\n            [[DHRemoteServer sharedServer] sendObject:@{@\"string\": string} forRequestName:@\"syncClipboard\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n        } repeats:NO];\n    }\n}\n\n- (void)checkCommitHashes\n{\n    NSDictionary *hashes = @{@\"DHDBSearcher\": @\"31900da1\",\n                             @\"DHDBResult\": @\"31900da1\",\n                             @\"DHDBUnifiedResult\": @\"31900da1\",\n                             @\"DHQueuedDB\": @\"31900da1\",\n                             @\"DHUnifiedQueuedDB\": @\"31900da1\",\n                             @\"DHDBUnifiedOperation\": @\"31900da1\",\n                             @\"DHWebViewController\": @\"da4e9df6\",\n                             @\"DHWebPreferences\": @\"6896e837\",\n                             @\"DHDocsetDownloader\": @\"3efbf5e6\",\n                             @\"PlatformIcons\": @\"31900da1\",\n                             @\"DHTypes\": @\"062c6b03\",\n                             @\"Types\": @\"062c6b03\",\n                             @\"CSS\": @\"7be5591d\",\n                             };\n    [hashes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {\n        NSString *plistHash = [[NSBundle mainBundle] infoDictionary][[key stringByAppendingString:@\"Commit\"]];\n        if(![plistHash isEqualToString:@\"not set\"] && ![plistHash isEqualToString:obj])\n        {\n            NSLog(@\"Wrong git hash %@ for %@. Maybe you forgot to sync something or update this list?\", plistHash, key);\n        }\n    }];\n}\n\n- (DHWindow *)window\n{\n    if(self._window)\n    {\n        return self._window;\n    }\n    self._window = [[DHWindow alloc] init];\n    return self._window;\n}\n\n- (UIViewController *)topViewController\n{\n    return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController];\n}\n\n- (UIViewController *)topViewController:(UIViewController *)rootViewController\n{\n    if (rootViewController.presentedViewController == nil)\n    {\n        return rootViewController;\n    }\n    if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]])\n    {\n        UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController;\n        UIViewController *lastViewController = [[navigationController viewControllers] lastObject];\n        return [self topViewController:lastViewController];\n    }\n    UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;\n    return [self topViewController:presentedViewController];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHAppUpdateChecker.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHAppUpdateChecker : NSObject\n\n+ (DHAppUpdateChecker *)sharedUpdateChecker;\n- (BOOL)alertIfUpdatesAreScheduled;\n- (void)backgroundCheckForUpdatesIfNeeded;\n\n@end\n"
  },
  {
    "path": "Dash/DHAppUpdateChecker.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHAppUpdateChecker.h\"\n\n#define DHAppUpdateCheckerLastCheckDate @\"DHAppUpdateCheckerLastCheckDate\"\n#define DHAppUpdateCheckerScheduledUpdateVersion @\"DHAppUpdateCheckerScheduledUpdateVersion\"\n\n@implementation DHAppUpdateChecker\n\n+ (DHAppUpdateChecker *)sharedUpdateChecker\n{\n#ifdef APP_STORE\n    return nil;\n#endif\n    static dispatch_once_t pred;\n    static DHAppUpdateChecker *_checker = nil;\n    \n    dispatch_once(&pred, ^{\n        _checker = [[DHAppUpdateChecker alloc] init];\n    });\n    return _checker;\n}\n\n- (void)backgroundCheckForUpdatesIfNeeded\n{\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    NSDate *lastDate = [defaults objectForKey:DHAppUpdateCheckerLastCheckDate];\n    if(!lastDate || [[NSDate date] timeIntervalSinceDate:lastDate] > 60*60*24)\n    {\n        [defaults setObject:[NSDate date] forKey:DHAppUpdateCheckerLastCheckDate];\n        dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n        dispatch_async(queue, ^{\n            NSData *jsonData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[@\"https://kapeli.com/dash_ios.json?bundle_id=\" stringByAppendingString:[NSBundle mainBundle].bundleIdentifier]]];\n            if(jsonData)\n            {\n                NSDictionary *json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];\n                if(json)\n                {\n                    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];\n                    NSString *myVersion = [infoDict objectForKey:@\"CFBundleVersion\"];\n                    if([myVersion integerValue] < [json[@\"version\"] integerValue])\n                    {\n                        [[NSUserDefaults standardUserDefaults] setObject:json[@\"version\"] forKey:DHAppUpdateCheckerScheduledUpdateVersion];\n                    }\n                }\n            }\n        });\n    }\n}\n\n- (BOOL)alertIfUpdatesAreScheduled\n{\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    NSString *version = [defaults objectForKey:DHAppUpdateCheckerScheduledUpdateVersion];\n    if(version)\n    {\n        [defaults removeObjectForKey:DHAppUpdateCheckerScheduledUpdateVersion];\n        NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];\n        NSString *myVersion = [infoDict objectForKey:@\"CFBundleVersion\"];\n        if([version integerValue] > [myVersion integerValue])\n        {\n            [UIAlertView showWithTitle:@\"Dash Update Available\" message:@\"A new version of Dash has been released. Would you like to update?\" cancelButtonTitle:@\"Maybe Later\" otherButtonTitles:@[@\"Update\"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n                if(buttonIndex == alertView.firstOtherButtonIndex)\n                {\n                    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\"https://kapeli.com/dash_ios?ref=update#update\"]];\n                }\n            }];\n            return YES;\n        }\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHAppleAPIProtocol.h",
    "content": "//\n//  Copyright (C) 2018  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHAppleAPIProtocol : NSURLProtocol\n\n@end\n"
  },
  {
    "path": "Dash/DHAppleAPIProtocol.m",
    "content": "//\n//  Copyright (C) 2018  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHAppleAPIProtocol.h\"\n#import <Apple_Docs_Framework/Apple_Docs_Framework.h>\n#import \"DHDocsetManager.h\"\n#import \"DHLatencyTester.h\"\n#import \"DHWebViewController.h\"\n#import \"DHTocBrowser.h\"\n\n@implementation DHAppleAPIProtocol\n\n+ (BOOL)canInitWithRequest:(NSURLRequest *)request\n{\n    if([[[request URL] scheme] isCaseInsensitiveEqual:@\"dash-apple-api\"])\n    {\n        return YES;\n    }\n    return NO;\n}\n\n+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request\n{\n    return request;\n}\n\n- (void)startLoading\n{\n    @autoreleasepool {\n        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL] MIMEType:@\"text/html\" expectedContentLength:-1 textEncodingName:nil];\n        [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];\n        NSString *url = [[self.request.URL absoluteString] substringToString:@\"#\"];\n        if(![url contains:@\"&language=\"])\n        {\n            url = [url stringByAppendingFormat:@\"&language=%@\", ([DHAppleActiveLanguage currentLanguage] == DHNewActiveAppleLanguageObjC) ? @\"occ\" : @\"swift\"];\n        }\n        DHDocset *docset = [[DHDocsetManager sharedManager] appleAPIReferenceDocset];\n        NSString *toolPath = [docset.documentsPath stringByAppendingPathComponent:@\"Apple Docs Helper\"];\n        NSData *data = [@\"<html><head><title>Error</title></head><body>Error. Please reinstall the Apple API Reference docset.</body></html>\" dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];\n        if(toolPath.length)\n        {\n            @try {\n                DHViewer *viewer = [DHViewer sharedViewer];\n                DHCommandLineParser *parser = [DHCommandLineParser sharedParser];\n                parser.ownPath = toolPath;\n                NSString *bestMirror = [[DHLatencyTester sharedLatency].bestMirror stringByConvertingKapeliHttpURLToHttps];\n                bestMirror = (bestMirror) ? bestMirror : @\"https://kapeli.com/feeds/\";\n                viewer.isIOS = YES;\n                parser.bestMirror = bestMirror;\n                viewer.url = url;\n                parser.dashBuildNumber = 450;\n                data = [[viewer htmlOutput] dataUsingEncoding:NSUTF8StringEncoding];\n                [self setUpTOC:viewer];\n                [DHXcodeHelper cleanUp];\n                [DHViewer cleanUp];\n            }\n            @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n        }\n        [[self client] URLProtocol:self didLoadData:data];\n        [[self client] URLProtocolDidFinishLoading:self];\n    }\n}\n\n- (void)setUpTOC:(DHViewer *)viewer\n{\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        DHWebViewController *controller = [DHWebViewController sharedWebViewController];\n        if(iPad && isRegularHorizontalClass)\n        {\n            if(controller.methodsPopover.popoverVisible)\n            {\n                [controller.methodsPopover dismissPopoverAnimated:YES];\n            }\n        }\n        else\n        {\n            [[controller.actualTOCBrowser searchDisplayController] setActive:NO animated:NO];\n            [[controller.actualTOCBrowser presentingViewController] dismissViewControllerAnimated:YES completion:nil];\n        }\n        controller.lastTocBrowser = nil;\n        controller.currentMethods = viewer.tocEntries.count ? viewer.tocEntries : nil;\n        controller.navigationItem.rightBarButtonItem = (viewer.tocEntries.count) ? [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"tocMenu\"] style:UIBarButtonItemStylePlain target:controller action:@selector(tocButtonPressed:)] : nil;\n    });\n}\n\n- (void)stopLoading\n{\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHAppleActiveLanguage.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHAppleActiveLanguage : NSObject\n\n@property (assign) NSInteger activeLanguage;\n\n+ (NSInteger)currentLanguage;\n+ (void)setLanguage:(NSInteger)language;\n\n@end\n\n#define DHNewAppleActiveLanguageKey @\"DHNewAppleActiveLanguageKey\"\n#define DHNewActiveAppleLanguageSwift 0\n#define DHNewActiveAppleLanguageObjC 1\n"
  },
  {
    "path": "Dash/DHAppleActiveLanguage.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHAppleActiveLanguage.h\"\n\n@implementation DHAppleActiveLanguage\n\n+ (DHAppleActiveLanguage *)sharedActiveLanguage\n{\n    static dispatch_once_t pred;\n    static DHAppleActiveLanguage *_singleton = nil;\n    \n    dispatch_once(&pred, ^{\n        _singleton = [[DHAppleActiveLanguage alloc] init];\n        [_singleton setUp];\n    });\n    return _singleton;\n}\n\n- (void)setUp\n{\n    self.activeLanguage = [[NSUserDefaults standardUserDefaults] integerForKey:DHNewAppleActiveLanguageKey];\n}\n\n+ (NSInteger)currentLanguage\n{\n    return [[DHAppleActiveLanguage sharedActiveLanguage] activeLanguage];\n}\n\n+ (void)setLanguage:(NSInteger)language\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:language forKey:DHNewAppleActiveLanguageKey];\n    [DHAppleActiveLanguage sharedActiveLanguage].activeLanguage = language;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHBlockProtocol.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHBlockProtocol : NSURLProtocol\n\n@end\n"
  },
  {
    "path": "Dash/DHBlockProtocol.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHBlockProtocol.h\"\n#import \"DHWebViewController.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHRemoteProtocol.h\"\n\n@implementation DHBlockProtocol\n\n+ (BOOL)canInitWithRequest:(NSURLRequest *)request\n{\n#ifdef DEBUG\n    if([[[request URL] scheme] isCaseInsensitiveEqual:@\"http\"])\n    {\n        NSLog(@\"HTTP URL load detected: %@\", request);\n    }\n#endif\n    DHWebViewController *webController = [DHWebViewController sharedWebViewController];\n    NSString *url = [[request URL] absoluteString];\n    NSString *mainFrameURL = webController.mainFrameURL;\n    if([url isEqualToString:@\"about:blank\"])\n    {\n        return YES;\n    }\n    if([url contains:@\"kapeli.com/\"])\n    {\n        return NO;\n    }\n    if([[[request URL] scheme] hasCaseInsensitivePrefix:@\"http\"])\n    {\n        if(![[[request URL] host] length] || [[[request URL] host] hasSuffix:@\".\"])\n        {\n            return YES;\n        }\n    }\n    NSString *lastPathComponent = [url lastPathComponent];\n    if([lastPathComponent contains:@\"xcode\"] && [[lastPathComponent pathExtension] isCaseInsensitiveEqual:@\"css\"])\n    {\n        return YES;\n    }\n    if([webController isLocalURL] || ([mainFrameURL contains:@\"developer.apple.com\"] && [mainFrameURL contains:@\"/documentation/\"]))\n    {\n        if([url rangeOfString:@\"disqus.com/\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url contains:@\"lloogg.com/\"] || [url rangeOfString:@\"google-analytics.com/\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url contains:@\"adzerk.net\"] || [url contains:@\"ghbtns.com\"] || [url contains:@\"platform.twitter.com/widgets.js\"] || [url contains:@\"analytics.twitter.com\"] || [url contains:@\"login.persona.org\"] || [url contains:@\"omtrdc.net\"] || [url contains:@\"google.com/cse/\"] || [url contains:@\"jashkenas.s3.amazonaws.com/images/a_documentcloud_project.png\"] || [url contains:@\"media.mongodb.org\"] || [url contains:@\"googleusercontent.com/beacon\"] || [url contains:@\"carbonads.com/\"] || [url contains:@\"facebook.com/plugins\"] || [url contains:@\"fbcdn.net\"] || [url contains:@\"http://nodejs.org/images/platform-icons.png\"] || [url contains:@\"apis.google.com/js/plusone.js\"] || ([url contains:@\"community.adobe.com\"] && [url hasCaseInsensitiveSuffix:@\".css\"]))\n        {\n            return YES;\n        }\n        if(([url contains:@\"codeclimate.com\"]  || [url contains:@\"coveralls.io\"] || [url contains:@\"travis-ci.org\"]) && [mainFrameURL rangeOfString:@\"/Ruby%20DocSets/\"].location == NSNotFound && [mainFrameURL rangeOfString:@\"/Cocoa%20DocSets/\"].location == NSNotFound && [mainFrameURL rangeOfString:@\"/Cocoa%20DocSets/\"].location == NSNotFound && [mainFrameURL rangeOfString:@\"/Hex%20DocSets/\"].location == NSNotFound && ([mainFrameURL rangeOfString:@\"/Versioned%20DocSets/\"].location == NSNotFound || [mainFrameURL rangeOfString:@\"DHDocsetDownloader/\"].location != NSNotFound) && ![url hasPrefix:@\"file://\"])\n        {\n            return YES;\n        }\n        \n        BOOL isJSEnabled = NO;\n        BOOL blockOnlineResources = NO;\n        NSString *platform = nil;\n        BOOL isHTTPRequest = ([url hasCaseInsensitivePrefix:@\"http\"]);\n        BOOL isJSRequest = [[[url stringByDeletingPathFragment] pathExtension] rangeOfString:@\"js\"].location != NSNotFound;\n        if(isHTTPRequest || isJSRequest)\n        {\n            if([DHRemoteServer sharedServer].connectedRemote)\n            {\n                NSDictionary *userInfo = [DHRemoteProtocol lastResponseUserInfo];\n                platform = userInfo[@\"platform\"];\n                isJSEnabled = [userInfo[@\"javaScriptEnabled\"] boolValue];\n                blockOnlineResources = [userInfo[@\"blocksOnline\"] boolValue];\n            }\n            else\n            {\n                DHDocset *docset = [[DHDocsetManager sharedManager] docsetForDocumentationPage:mainFrameURL];\n                platform = docset.platform;\n                isJSEnabled = docset.isJavaScriptEnabled;\n                blockOnlineResources = docset.blocksOnlineResources;\n            }\n        }\n        \n        if(([mainFrameURL containsAny:@[@\"SciPy.docset\", @\"NumPy.docset\"]]) && isHTTPRequest)\n        {\n            if(![url contains:@\"mathjax\"])\n            {\n                return YES;\n            }\n        }\n        if(([mainFrameURL containsAny:@[@\"SQLAlchemy.docset\", @\"RequireJS.docset\", @\"Tornado.docset\"]] || blockOnlineResources) && isHTTPRequest)\n        {\n            if([mainFrameURL containsAny:@[@\"Julia.docset\"]] && [url contains:@\"mathjax\"])\n            {\n                return NO;\n            }\n            return YES;\n        }\n        if([mainFrameURL contains:@\"jQuery%20UI.docset\"] || [mainFrameURL contains:@\"jQuery%20Mobile.docset\"] || [mainFrameURL contains:@\"jQuery.docset\"] || [mainFrameURL contains:@\"Foundation.docset\"])\n        {\n            return NO;\n        }\n        if(isJSRequest)\n        {\n            if([url contains:@\"Sass.docset\"] || [url rangeOfString:@\"UnderscoreJS.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"BackboneJS.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Bootstrap.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url contains:@\"CSS.docset\"] || [url contains:@\"HTML.docset\"] || [url contains:@\"XSLT.docset\"] || [url contains:@\"XUL.docset\"] || [url contains:@\"SVG.docset\"] || [url contains:@\"JavaScript.docset\"])\n            {\n                return NO;\n            }\n            if([url contains:@\"Dojo.docset\"] || [url contains:@\"Elixir.docset\"] || [url contains:@\"KnockoutJS.docset\"] || [url contains:@\"PhoneGap.docset\"] || [url contains:@\"MarionetteJS.docset\"])\n            {\n                return NO;\n            }\n            if([url contains:@\"Bourbon.docset\"] || [url contains:@\"Puppet.docset\"] || [url contains:@\"Neat.docset\"] || [url contains:@\"Xojo.docset\"] || [url contains:@\"Redis.docset\"] || [url contains:@\"sproutcore.docset\"])\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Compass.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url contains:@\"Processing.docset\"])\n            {\n                return NO;\n            }\n            if([url contains:@\"Laravel.docset\"])\n            {\n                return NO;\n            }\n            if([url contains:@\"Sencha%20Touch.docset\"] || [url contains:@\"ExtJS.docset\"] || [url contains:@\"Appcelerator%20Titanium.docset\"])\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Zend_Framework.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([mainFrameURL contains:@\"AngularJS.docset\"] || [url rangeOfString:@\"PrototypeJS.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Go.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"RubyMotion.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Ruby.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Ruby%20on%20Rails.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound && ![[url lastPathComponent] isEqualToString:@\"main.js\"])\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Cappuccino.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound && ([url hasSuffix:@\"jquery.js\"] || [url hasSuffix:@\"dynsections.js\"]))\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Unity%203D.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"CoffeeScript.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Yii.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Scala.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Akka.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url contains:@\"/dash_scaladoc/\"])\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"YUI.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Haskell.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Android.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n            {\n                return NO;\n            }\n            if([url rangeOfString:@\"Drupal.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"CodeIgniter.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Joomla.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Symfony.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"TYPO3.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Cocos2D-X.docset\" options:NSCaseInsensitiveSearch].location != NSNotFound || [url rangeOfString:@\"Zend_Framework.docset\"].location != NSNotFound)\n            {\n                return NO;\n            }\n            if(isJSEnabled)\n            {\n                return NO;\n            }\n            if([platform isEqualToString:@\"java\"] || [platform isEqualToString:@\"playjava\"] || [platform isEqualToString:@\"groovy\"] || [platform isEqualToString:@\"javafx\"] || [platform isEqualToString:@\"scaladoc\"])\n            {\n                return NO;\n            }\n            if([[request mainDocumentURL] isEqual:[request URL]])\n            {\n                return NO;\n            }\n            return YES;\n        }\n        if([url rangeOfString:@\"://developer.mozilla.org\"].location != NSNotFound || [url rangeOfString:@\"google.com/jsapi\"].location != NSNotFound)\n        {\n            return YES;\n        }\n    }\n    return NO;\n}\n\n+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request\n{\n    return request;\n}\n\n- (void)startLoading\n{\n    NSString *path = [[self.request URL] path];\n    NSString *extension = [path pathExtension];\n    NSString *mimeType = [NSString mimeTypeForPathExtension:extension];\n    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL]\n                                                        MIMEType:mimeType\n                                           expectedContentLength:-1\n                                                textEncodingName:nil];\n    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];\n    NSData *data = [@\"\" dataUsingEncoding:NSUTF8StringEncoding];\n    [[self client] URLProtocol:self didLoadData:data];\n    [[self client] URLProtocolDidFinishLoading:self];\n}\n\n- (void)stopLoading\n{\n\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHBrowserCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"14113\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"14088\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHBrowserCell\" id=\"S6W-09-1z9\" userLabel=\"Browser Cell\" customClass=\"DHBrowserTableViewCell\" colorLabel=\"IBBuiltInLabel-Blue\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n            <autoresizingMask key=\"autoresizingMask\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"S6W-09-1z9\" id=\"Ca5-1b-CYh\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"43.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" misplaced=\"YES\" text=\"\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"579-AP-FUS\" customClass=\"DHRightDetailLabel\">\n                        <rect key=\"frame\" x=\"46\" y=\"1\" width=\"274\" height=\"43\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMaxY=\"YES\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <color key=\"textColor\" cocoaTouchSystemColor=\"darkTextColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" id=\"JGq-Sz-Apf\" userLabel=\"Platform\">\n                        <rect key=\"frame\" x=\"15\" y=\"14\" width=\"16\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                    </imageView>\n                </subviews>\n            </tableViewCellContentView>\n            <inset key=\"separatorInset\" minX=\"46\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n            <connections>\n                <outlet property=\"platformImageView\" destination=\"JGq-Sz-Apf\" id=\"el0-Nd-vxM\"/>\n                <outlet property=\"titleLabel\" destination=\"579-AP-FUS\" id=\"xTO-dh-YM0\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"139\" y=\"154\"/>\n        </tableViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Dash/DHBrowserTableView.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHBrowserTableView : UITableView\n\n@end\n\n@protocol DHBrowserTableViewDelegate <NSObject>\n\n@optional\n- (void)tableViewWillBeginEditing:(UITableView *)tableView;\n- (void)tableViewDidBeginEditing:(UITableView *)tableView;\n- (void)tableViewWillEndEditing:(UITableView *)tableView;\n- (void)tableViewDidEndEditing:(UITableView *)tableView;\n\n@end"
  },
  {
    "path": "Dash/DHBrowserTableView.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHBrowserTableView.h\"\n\n@implementation DHBrowserTableView\n\n- (void)setEditing:(BOOL)editing animated:(BOOL)animated\n{\n    if(editing == self.editing)\n    {\n        return;\n    }\n    if(editing && [[self delegate] respondsToSelector:@selector(tableViewWillBeginEditing:)])\n    {\n        [(id)[self delegate] tableViewWillBeginEditing:self];\n    }\n    if(!editing && [[self delegate] respondsToSelector:@selector(tableViewWillEndEditing:)])\n    {\n        [(id)[self delegate] tableViewWillEndEditing:self];\n    }\n    [super setEditing:editing animated:animated];\n    if(editing && [[self delegate] respondsToSelector:@selector(tableViewDidBeginEditing:)])\n    {\n        [(id)[self delegate] tableViewDidBeginEditing:self];\n    }\n    if(!editing && [[self delegate] respondsToSelector:@selector(tableViewDidEndEditing:)])\n    {\n        [(id)[self delegate] tableViewDidEndEditing:self];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHBrowserTableViewCell.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHRightDetailLabel.h\"\n\n@interface DHBrowserTableViewCell : UITableViewCell\n\n@property (assign) UIImageView *typeImageView;\n@property (weak) IBOutlet DHRightDetailLabel *titleLabel;\n@property (assign) IBOutlet UIImageView *platformImageView;\n\n- (void)makeEntryCell;\n\n@end\n"
  },
  {
    "path": "Dash/DHBrowserTableViewCell.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHBrowserTableViewCell.h\"\n\n@implementation DHBrowserTableViewCell\n\n- (void)awakeFromNib\n{\n    [super awakeFromNib];\n    self.titleLabel.isBrowserCell = YES;\n}\n\n- (void)makeEntryCell\n{\n    if(self.typeImageView)\n    {\n        return;\n    }\n    self.separatorInset = UIEdgeInsetsMake(0, 70, 0, 0);\n    [self.titleLabel increaseFrameByX:24 y:0 width:-24 height:0];\n    UIImageView *typeImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.imageView.frame.origin.x+28, self.imageView.frame.origin.y+1, 14, 14)];\n    [typeImageView setAutoresizingMask:UIViewAutoresizingFlexibleRightMargin];\n    self.typeImageView = typeImageView;\n    [self addSubview:typeImageView];\n}\n\n- (UIImageView *)imageView\n{\n    return self.platformImageView;\n}\n\n- (UILabel *)textLabel\n{\n    return self.titleLabel;\n}\n\n- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index\n{\n    if(self.editing)\n    {\n        return;\n    }\n    [super insertSubview:view atIndex:index];\n}\n\n- (NSString *)accessibilityValue\n{\n    return [self.titleLabel accessibilityValue];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHCSS.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHCSS : NSObject\n\n@property (strong) NSString *bothCSS;\n@property (strong) NSString *swiftCSS;\n@property (strong) NSString *objcCSS;\n\n+ (DHCSS *)sharedCSS;\n+ (NSString *)currentCSSString;\n+ (NSString *)currentCSSStringWithTextModifier;\n+ (int)activeAppleLanguage;\n- (void)refreshActiveCSS;\n- (void)modifyTextSize:(BOOL)increase;\n- (BOOL)shouldModifyTextSize;\n- (NSString *)textSizeAdjust;\n\n@end\n\n#define DHActiveAppleLanguageKey @\"ActiveAppleLanguage\"\n#define DHActiveAppleLanguageBoth 0\n#define DHActiveAppleLanguageSwift 1\n#define DHActiveAppleLanguageObjC 2"
  },
  {
    "path": "Dash/DHCSS.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHCSS.h\"\n\n@implementation DHCSS\n\nstatic int _activeAppleLanguage;\nstatic long _textSizeAdjust;\n\n+ (DHCSS *)sharedCSS\n{\n    static dispatch_once_t pred;\n    static DHCSS *_css = nil;\n    \n    dispatch_once(&pred, ^{\n        _css = [[DHCSS alloc] init];\n        [_css setUp];\n    });\n    return _css;\n}\n\n- (void)setUp\n{\n    self.bothCSS = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@\"style\" ofType:@\"css\"] encoding:NSUTF8StringEncoding error:nil];\n    self.objcCSS = [self.bothCSS stringByAppendingString:@\"body.jazz #bashful #language #obj_c + label, body.jazz #bashful #language #objective_c + label {background: rgba(0,136,204,1) !important;color: rgba(255,255,255,1) !important;border-radius: 2px !important;cursor: default !important;} body#reference.jazz:not(.swift) .Swift { display: none !important; } body#reference.jazz:not(.java_script) .code-sample .Swift:only-child {display:inline-block !important} body#reference.jazz:not(.swift) .height-container .z-module-import {display:none !important}\"];\n    self.swiftCSS = [self.bothCSS stringByAppendingString:@\"body.jazz #bashful #language #swift + label {background: rgba(0,136,204,1) !important;color: rgba(255,255,255,1) !important;border-radius: 2px !important;cursor: default !important;} body#reference.jazz:not(.java_script) .Objective-C { display: none !important; } body#reference.jazz:not(.java_script) .code-sample .Objective-C:only-child {display:inline-block !important} body#reference.jazz:not(.java_script) .obj-c-only .height-container { display:none !important; } body#reference.jazz:not(.java_script) .obj-c-only .task-group-term a { display:block !important; text-decoration: line-through !important; -webkit-text-stroke-color: rgba(163,21,21,1) !important; -webkit-text-stroke-width: .0000000001px !important; } body.jazz:not(.java_script) .obj-c-only .task-group-term::after {content: '(Not available in Swift)' !important; color:rgba(163,21,21,1) !important; font-size:.8em !important; margin-left:5px !important; } body.jazz p.para.Swift {display:block !important} body.jazz .Swift { display: inline-block !important; } body.jazz #metadata_table .Swift { display: block !important; } body.jazz .task-group-term a.Swift, body.jazz #jump_to .Swift { display: block !important; } body.jazz .declaration .Swift { display: block !important; }\"];\n    self.bothCSS = [self.bothCSS stringByAppendingString:@\"body.jazz #bashful #language #both + label {background: rgba(0,136,204,1) !important;color: rgba(255,255,255,1) !important;border-radius: 2px !important;cursor: default !important;}\"];\n    [self refreshActiveCSS];\n    [self refreshTextSize];\n}\n\n- (void)refreshActiveCSS\n{\n    NSString *active = [[NSUserDefaults standardUserDefaults] objectForKey:DHActiveAppleLanguageKey];\n    if([active isEqualToString:@\"swift\"])\n    {\n        _activeAppleLanguage = DHActiveAppleLanguageSwift;\n    }\n    else if([active isEqualToString:@\"obj_c\"] || [active isEqualToString:@\"objective_c\"])\n    {\n        _activeAppleLanguage = DHActiveAppleLanguageObjC;\n    }\n    else\n    {\n        _activeAppleLanguage = DHActiveAppleLanguageBoth;\n    }\n    [[NSURLCache sharedURLCache] removeAllCachedResponses];\n}\n\n+ (NSString *)currentCSSString\n{\n    DHCSS *css = [DHCSS sharedCSS];\n    if(_activeAppleLanguage == DHActiveAppleLanguageBoth)\n    {\n        return css.bothCSS;\n    }\n    else if(_activeAppleLanguage == DHActiveAppleLanguageObjC)\n    {\n        return css.objcCSS;\n    }\n    else if(_activeAppleLanguage == DHActiveAppleLanguageSwift)\n    {\n        return css.swiftCSS;\n    }\n    return css.bothCSS;\n}\n\n+ (NSString *)currentCSSStringWithTextModifier\n{\n    return [NSString stringWithFormat:@\"%@%@\", [DHCSS currentCSSString], ([[DHCSS sharedCSS] shouldModifyTextSize]) ? [NSString stringWithFormat:@\"\\n\\nbody {-webkit-text-size-adjust: %@}\", [[DHCSS sharedCSS] textSizeAdjust]] : @\"\"];\n}\n\n+ (int)activeAppleLanguage\n{\n    return _activeAppleLanguage;\n}\n\n- (void)refreshTextSize\n{\n    _textSizeAdjust = [[NSUserDefaults standardUserDefaults] integerForKey:@\"DHTextSizeAdjust\"];\n}\n\n- (NSString *)textSizeAdjust\n{\n    return [NSString stringWithFormat:@\"%ld%%\", 100+_textSizeAdjust];\n}\n\n- (BOOL)shouldModifyTextSize\n{\n    return _textSizeAdjust != 0;\n}\n\n- (void)modifyTextSize:(BOOL)increase\n{\n    if(increase)\n    {\n        _textSizeAdjust += 5;\n    }\n    else\n    {\n        _textSizeAdjust -= 5;\n    }\n    if(_textSizeAdjust < -70)\n    {\n        _textSizeAdjust = -70;\n    }\n    else if(_textSizeAdjust > 70)\n    {\n        _textSizeAdjust = 70;\n    }\n    [[NSURLCache sharedURLCache] removeAllCachedResponses];\n    NSLog(@\"Text size adjust set to %ld\", _textSizeAdjust);\n    [[NSUserDefaults standardUserDefaults] setInteger:_textSizeAdjust forKey:@\"DHTextSizeAdjust\"];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHCheatRepo.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepo.h\"\n\n@interface DHCheatRepo : DHRepo\n\n@property (strong) NSDate *lastListLoad;\n\n+ (instancetype)sharedCheatRepo;\n\n@end\n"
  },
  {
    "path": "Dash/DHCheatRepo.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHCheatRepo.h\"\n#import \"DHCheatRepoList.h\"\n\n@implementation DHCheatRepo\n\nstatic id singleton = nil;\n\n+ (instancetype)sharedCheatRepo\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    id cheatRepo = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];\n    [cheatRepo setUp];\n    return cheatRepo;\n}\n\n- (void)setUp\n{\n    [super setUp];\n    [self reloadCheatsheetsIfNeeded];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    [self reloadCheatsheetsIfNeeded];\n}\n\n- (void)reloadCheatsheetsIfNeeded\n{\n    if(!self.loading && (!self.lastListLoad || (!self.searchBar.text.length && [[NSDate date] timeIntervalSinceDate:self.lastListLoad] > 300)))\n    {\n        self.loading = YES;\n        BOOL shouldDelay = [self.loadingText contains:@\"Retrying\"];\n        self.loadingText = nil;\n        self.searchBar.userInteractionEnabled = NO;\n        self.searchBar.alpha = 0.5;\n        self.searchBar.placeholder = @\"Loading...\";\n        [self.tableView reloadData];\n        dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n        dispatch_async(queue, ^{\n            if(shouldDelay)\n            {\n                [NSThread sleepForTimeInterval:1.0];\n            }\n            [[DHCheatRepoList sharedCheatRepoList] reload];\n            NSMutableArray *feeds = [[DHCheatRepoList sharedCheatRepoList] allCheatsheets];\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                if(feeds.count)\n                {\n                    NSArray *savedFeeds = [[NSUserDefaults standardUserDefaults] objectForKey:[self defaultsKey]];\n                    for(NSDictionary *feedDictionary in savedFeeds)\n                    {\n                        DHFeed *savedFeed = [DHFeed feedWithDictionaryRepresentation:feedDictionary];\n                        NSUInteger index = [feeds indexOfObject:savedFeed];\n                        if(index != NSNotFound)\n                        {\n                            DHFeed *feed = feeds[index];\n                            feed.installed = savedFeed.installed;\n                            feed.installedVersion = savedFeed.installedVersion;\n                            feed.size = savedFeed.size;\n                        }\n                    }\n                    [feeds sortUsingFunction:compareFeeds context:nil];\n                    \n                    self.lastListLoad = [NSDate date];\n                    self.searchBar.userInteractionEnabled = YES;\n                    self.searchBar.alpha = 1.0;\n                    self.searchBar.placeholder = @\"Find cheat sheets to download\";\n                    self.loading = NO;\n                    self.feeds = feeds;\n                    [self.tableView reloadData];\n                }\n                else\n                {\n                    self.loadingText = @\"Loading failed. Retrying...\";\n                    [self.tableView reloadData];\n                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                        self.loading = NO;\n                        [self reloadCheatsheetsIfNeeded];\n                    });\n                }\n            });\n        });\n    }\n}\n\n- (NSString *)installFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    NSObject *identifier = [[NSObject alloc] init];\n    feed.identifier = identifier;\n    feed.waiting = YES;\n    BOOL didStallOnce = NO;\n    BOOL didSetStallLabel = NO;\n    while([self shouldStall] && feed.installing && feed.identifier == identifier)\n    {\n        if(didStallOnce && !didSetStallLabel)\n        {\n            didSetStallLabel = YES;\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                [feed setDetailString:@\"Waiting...\"];\n                [[feed cell].titleLabel setRightDetailText:@\"Waiting...\" adjustMainWidth:YES];\n                [feed setMaxRightDetailWidth:[feed cell].titleLabel.maxRightDetailWidth];\n            });\n        }\n        didStallOnce = YES;\n        [NSThread sleepForTimeInterval:1.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    feed.waiting = NO;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *installPath = [self docsetPathForFeed:feed];\n    NSString *tempPath = [self uniqueTempDirAtPath:installPath];\n    NSString *tempFile = [tempPath stringByAppendingPathComponent:@\"dash_temp_docset.tgz\"];\n    NSString *tarixFile = [tempFile stringByAppendingString:@\".tarix\"];\n    \n    __block BOOL shouldWait = NO;\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        shouldWait = [[DHLatencyTester sharedLatency] performTests:NO];\n    });\n    if(shouldWait)\n    {\n        [NSThread sleepForTimeInterval:3.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    NSString *error = nil;\n    DHFeedResult *feedResult = [self loadFeed:feed error:&error];\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    if(feedResult && feed.installing)\n    {\n        feed.feedResult = feedResult;\n        feedResult.feed = feed;\n        NSError *downloadError = nil;\n        if(feedResult.downloadURLs.count)\n        {\n            NSString *downloadURL = feedResult.downloadURLs[0];\n            [self emptyTrashAtPath:tempPath];\n            if(![fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil])\n            {\n                return @\"Couldn't create install directory.\";\n            }\n            if([feedResult isCancelled])\n            {\n                [self emptyTrashAtPath:tempPath];\n                return @\"cancelled\";\n            }\n            NSURL *url = [NSURL URLWithString:downloadURL];\n            if(url)\n            {\n                BOOL result = NO;\n                NSURL *tarixURL = [NSURL URLWithString:[[downloadURL stringByAppendingString:@\".tarix\"] stringByConvertingKapeliHttpURLToHttps]];\n                feedResult.hasTarix = [NSURL URLIsFound:[tarixURL absoluteString] timeoutInterval:120.0f checkForRedirect:YES];\n                downloadError = nil;\n#ifdef DEBUG\n                NSLog(@\"Downloading %@\", url);\n#endif\n                if([DHFileDownload downloadItemAtURL:url toFile:tempFile error:&downloadError delegate:self identifier:feedResult] && !downloadError)\n                {\n                    if([feedResult isCancelled])\n                    {\n                        [self emptyTrashAtPath:tempPath];\n                        return @\"cancelled\";\n                    }\n                    \n                    [feedResult setRightDetail:@\"Waiting...\"];\n                    @synchronized([DHDocsetIndexer class])\n                    {\n                        if(!feedResult.hasTarix)\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            result = [DHUnarchiver unarchiveArchive:tempFile delegate:feedResult];\n                        }\n                        else\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Preparing...\"];\n                            result = [DHFileDownload downloadItemAtURL:tarixURL toFile:tarixFile error:nil delegate:nil identifier:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't download index file.\";\n                            }\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Extracting...\"];\n                            result = [DHUnarchiver unarchiveArchive:tarixFile delegate:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive index file.\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            tarixFile = [fileManager firstFileWithExtension:@\"tarix\" atPath:tempPath ignoreHidden:YES];\n                            if(!tarixFile)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't find index file.\";\n                            }\n                            tarixFile = [tempPath stringByAppendingPathComponent:tarixFile];\n                            result = [DHUnarchiver unpackTarixDocset:tempFile tarixPath:tarixFile delegate:feedResult];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive docset.\";\n                            }\n                        }\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        if(!result)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't unarchive docset.\";\n                        }\n                        \n                        if(!feedResult.hasTarix)\n                        {\n                            [fileManager removeItemAtPath:tempFile error:nil];\n                        }\n                        DHDocset *docset = [DHDocset firstDocsetInsideFolder:tempPath];\n                        if(!docset)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't install docset.\";\n                        }\n                        else if(feedResult.hasTarix)\n                        {\n                            [fileManager moveItemAtPath:tarixFile toPath:docset.tarixIndexPath error:nil];\n                            [fileManager moveItemAtPath:tempFile toPath:docset.tarixPath error:nil];\n                        }\n                        \n                        [DHDocsetIndexer indexerForDocset:docset delegate:feedResult];\n                        [fileManager removeItemAtPath:docset.sqlPath error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-shm\"] error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-wal\"] error:nil];\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:installPath];\n                        NSString *file = nil;\n                        while(file = [dirEnum nextObject])\n                        {\n                            [dirEnum skipDescendents];\n                            NSString *filePath = [installPath stringByAppendingPathComponent:file];\n                            if(![filePath isEqualToString:tempPath])\n                            {\n                                NSString *trashPath = [self uniqueTrashPath];\n                                [fileManager moveItemAtPath:filePath toPath:trashPath error:nil];\n                                dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n                                dispatch_async(queue, ^{\n                                    [self emptyTrashAtPath:trashPath];\n                                });\n                            }\n                        }\n                        [fileManager moveItemAtPath:docset.path toPath:[installPath stringByAppendingPathComponent:[docset.path lastPathComponent]] error:nil];\n                        [self emptyTrashAtPath:tempPath];\n                        return nil;\n                    }\n                }\n                else if(downloadError.code == DHDownloadCancelled)\n                {\n                    [self emptyTrashAtPath:tempPath];\n                    return @\"cancelled\";\n                }\n                else\n                {\n                    [self emptyTrashAtPath:tempPath];\n                }\n            }\n        }\n        return @\"Couldn't download cheat sheet.\";\n    }\n    else\n    {\n        return error;\n    }\n    return nil;\n}\n\n- (DHFeedResult *)loadFeed:(DHFeed *)feed error:(NSString **)returnError\n{\n    DHFeedResult *feedResult = [[DHFeedResult alloc] init];\n    DHCheatRepoList *list = [DHCheatRepoList sharedCheatRepoList];\n    feedResult.downloadURLs = @[[list downloadURLForEntry:feed]];\n    feedResult.version = [list versionForEntry:feed];\n    return feedResult;\n}\n\n- (NSString *)docsetInstallFolderName\n{\n    return @\"Cheat Sheets\";\n}\n\n- (void)showUpdateRequestForFeeds:(NSArray *)toUpdate count:(NSInteger)feedCount docsetList:(NSString *)docsetList\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n    [UIAlertView showWithTitle:@\"Updates Found\" message:[NSString stringWithFormat:@\"Updates are available for %ld %@:%@%@\", (long)feedCount, (feedCount > 1) ? @\"cheat sheets\" : @\"cheat sheet\", (feedCount > 1) ? @\"\\n\\n\" : @\" \", docsetList] cancelButtonTitle:@\"Maybe Later\" otherButtonTitles:@[@\"Update\"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n        if(buttonIndex != alertView.cancelButtonIndex)\n        {\n            if(toUpdate)\n            {\n                [self updateFeeds:toUpdate];\n            }\n            else\n            {\n                [self checkForUpdatesAndShowInterface:NO updateWithoutAsking:YES];\n            }\n        }\n    }];\n}\n\n- (IBAction)errorButtonPressed:(id)sender\n{\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    [[[UIAlertView alloc] initWithTitle:@\"Cheat Sheet Install Failed\" message:[NSString stringWithFormat:@\"%@ Please check your Internet connection and available free space and try again.\", feed.error] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n}\n\n+ (id)alloc\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    return [super alloc];\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    self = [super initWithCoder:aDecoder];\n    singleton = self;\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHCheatRepoList.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHFeed.h\"\n\n@interface DHCheatRepoList : NSObject\n\n@property (retain) NSDictionary *json;\n\n+ (DHCheatRepoList *)sharedCheatRepoList;\n- (NSMutableArray *)allCheatsheets;\n- (NSString *)downloadURLForEntry:(DHFeed *)entry;\n- (NSString *)versionForEntry:(DHFeed *)entry;\n- (void)reload;\n\n@end\n"
  },
  {
    "path": "Dash/DHCheatRepoList.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHCheatRepoList.h\"\n#import \"DHLatencyTester.h\"\n\n@implementation DHCheatRepoList\n\n+ (DHCheatRepoList *)sharedCheatRepoList\n{\n    static dispatch_once_t pred;\n    static DHCheatRepoList *_cheatList = nil;\n    \n    dispatch_once(&pred, ^{\n        _cheatList = [[DHCheatRepoList alloc] init];\n        [_cheatList setUp];\n    });\n    return _cheatList;\n}\n\n- (void)setUp\n{\n}\n\n- (void)reload\n{\n    BOOL success = NO;\n    NSString *url = [[[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingString:@\"zzz/cheatsheets/cheat.json\"] stringByConvertingKapeliHttpURLToHttps];\n    NSString *json = [NSString stringWithContentsOfURLString:url];\n    if(json)\n    {\n        NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];\n        if(newJSON)\n        {\n            self.json = newJSON;\n            success = YES;\n        }\n    }\n    if(!success)\n    {\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            [[DHLatencyTester sharedLatency] performTests:YES];\n        });\n    }\n}\n\n- (NSMutableArray *)allCheatsheets\n{\n    NSMutableArray *entries = [NSMutableArray array];\n    [self.json[@\"cheatsheets\"] enumerateKeysAndObjectsUsingBlock:^(id key, NSDictionary *value, BOOL *stop) {\n        DHFeed *entry = [DHFeed entryWithName:value[@\"name\"] platform:@\"cheatsheet\" icon:nil];\n        entry.aliases = value[@\"aliases\"];\n        entry._uniqueIdentifier = key;\n        entry._icon = [UIImage imageNamed:@\"cheatsheet\"];\n        [entries addObject:entry];\n    }];\n    if(!entries.count)\n    {\n        return nil;\n    }\n    return entries;\n}\n\n- (NSString *)versionForEntry:(DHFeed *)entry\n{\n    if(!self.json)\n    {\n        return nil;\n    }\n    NSString *globalVersion = self.json[@\"global_version\"];\n    NSString *version = self.json[@\"cheatsheets\"][entry.uniqueIdentifier][@\"version\"];\n    if(version)\n    {\n        return [NSString stringWithFormat:@\"Global: %@, Individual: %@\", globalVersion, version];\n    }\n    return nil;\n}\n\n- (NSString *)downloadURLForEntry:(DHFeed *)entry\n{\n    if(!self.json)\n    {\n        return nil;\n    }\n    return [[[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingFormat:@\"zzz/cheatsheets/%@.tgz\", entry.uniqueIdentifier] stringByConvertingKapeliHttpURLToHttps];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDBNestedResultSorter.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@class DHDBResult;\n\n@interface DHDBNestedResultSorter : NSObject {\n}\n\n@property (retain) NSMutableDictionary *ranks;\n\n+ (DHDBNestedResultSorter *)sharedSorter;\n- (void)saveDefaults:(NSMutableDictionary *)entries;\n- (DHDBResult *)sortNestedResults:(DHDBResult *)parentResult;\n- (NSInteger)rankForResult:(DHDBResult *)aResult;\n- (void)increaseRankForResult:(DHDBResult *)aResult;\n\n@end\n"
  },
  {
    "path": "Dash/DHDBNestedResultSorter.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDBNestedResultSorter.h\"\n#import \"DHDBResult.h\"\n\n@implementation DHDBNestedResultSorter\n\nstatic DHDBNestedResultSorter *_sorter = nil;\n\n+ (DHDBNestedResultSorter *)sharedSorter\n{\n    @synchronized([DHDBNestedResultSorter class])\n\t{\n\t\tif(!_sorter)\n\t\t{\n\t\t\t_sorter = [[DHDBNestedResultSorter alloc] init];\n            [_sorter setUp];\n\t\t}\n\t}\n\treturn _sorter;\n}\n\n- (void)setUp\n{\n    self.ranks = [[[NSUserDefaults standardUserDefaults] objectForKey:@\"nestedResultSortRanks\"] mutableCopy];\n    if(!self.ranks)\n    {\n        self.ranks = [NSMutableDictionary dictionary];\n    }\n}\n\n- (DHDBResult *)sortNestedResults:(DHDBResult *)parentResult\n{\n    NSMutableArray *allResults = [parentResult similarResults];\n    [allResults insertObject:parentResult atIndex:0];\n    parentResult.similarResults = [NSMutableArray array];\n    [parentResult setIsActive:NO];\n    \n    NSCharacterSet *symbolsSet = [NSCharacterSet characterSetWithCharactersInString:@\":./\\\\#\"];\n    [allResults sortUsingComparator:^NSComparisonResult(DHDBResult *obj1, DHDBResult *obj2) {\n        NSInteger rank1 = [self rankForResult:obj1];\n        NSInteger rank2 = [self rankForResult:obj2];\n        if(rank1 > rank2)\n        {\n            return NSOrderedAscending;\n        }\n        else if(rank2 > rank1)\n        {\n            return NSOrderedDescending;\n        }\n        if(obj1.perfectMatchOriginal && !obj2.perfectMatchOriginal)\n        {\n            return NSOrderedAscending;\n        }\n        else if(obj2.perfectMatchOriginal && !obj1.perfectMatchOriginal)\n        {\n            return NSOrderedDescending;\n        }\n        if(obj1.queryIsPrefixOfOriginal && !obj2.queryIsPrefixOfOriginal)\n        {\n            return NSOrderedAscending;\n        }\n        else if(obj2.queryIsPrefixOfOriginal && !obj1.queryIsPrefixOfOriginal)\n        {\n            return NSOrderedDescending;\n        }\n        if(obj1.queryIsSuffixOfOriginal && !obj2.queryIsSuffixOfOriginal)\n        {\n            return NSOrderedAscending;\n        }\n        else if(obj2.queryIsSuffixOfOriginal && !obj1.queryIsSuffixOfOriginal)\n        {\n            return NSOrderedDescending;\n        }\n        if(obj1.originalMatchesQueryAtAll && !obj2.originalMatchesQueryAtAll)\n        {\n            return NSOrderedAscending;\n        }\n        else if(obj2.originalMatchesQueryAtAll && !obj1.originalMatchesQueryAtAll)\n        {\n            return NSOrderedDescending;\n        }\n        NSInteger count1 = [[[obj1 declaredInPage] stringByReplacingOccurrencesOfString:@\"...\" withString:@\"\"] countOfCharactersInSet:symbolsSet];\n        NSInteger count2 = [[[obj2 declaredInPage] stringByReplacingOccurrencesOfString:@\"...\" withString:@\"\"] countOfCharactersInSet:symbolsSet];\n        if(count1 < count2)\n        {\n            return NSOrderedAscending;\n        }\n        else if(count2 < count1)\n        {\n            return NSOrderedDescending;\n        }\n        return [[obj1 declaredInPage] localizedCaseInsensitiveCompare:[obj2 declaredInPage]];\n    }];\n    \n    DHDBResult *newParent = allResults[0];\n    [allResults removeObjectAtIndex:0];\n    newParent.similarResults = allResults;\n    [newParent setIsActive:YES];\n    return newParent;\n}\n\n- (NSInteger)rankForResult:(DHDBResult *)aResult\n{\n    NSMutableDictionary *nestedEntry = (self.ranks)[[aResult name]];\n    if(!nestedEntry)\n    {\n        return 0;\n    }\n    NSNumber *rank = nestedEntry[[aResult relativePath]];\n    if(!rank)\n    {\n        return 0;\n    }\n    return [rank integerValue];\n}\n\n- (void)increaseRankForResult:(DHDBResult *)aResult\n{\n    if(aResult.isRemote)\n    {\n        return;\n    }\n    NSMutableDictionary *entries = self.ranks;\n    if(entries.count > 500)\n    {\n        [self purgeDictionary:entries];\n    }\n    NSMutableDictionary *nestedEntry = entries[[aResult name]];\n    if(!nestedEntry)\n    {\n        nestedEntry = [NSMutableDictionary dictionaryWithObject:@1 forKey:[aResult relativePath]];\n        entries[[aResult name]] = nestedEntry;\n    }\n    else\n    {\n        nestedEntry = [NSMutableDictionary dictionaryWithDictionary:nestedEntry];\n        NSNumber *rank = nestedEntry[[aResult relativePath]];\n        if([rank integerValue] <= 0)\n        {\n            nestedEntry[[aResult relativePath]] = @1;\n        }\n        else\n        {\n            nestedEntry[[aResult relativePath]] = @([rank integerValue]+1);\n        }\n        entries[[aResult name]] = nestedEntry;\n    }\n    [self saveDefaults:entries];\n}\n\n\n- (void)saveDefaults:(NSMutableDictionary *)entries\n{\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    [defaults setObject:entries forKey:@\"nestedResultSortRanks\"];\n}\n\n- (void)purgeDictionary:(NSMutableDictionary *)entries\n{\n    NSInteger threshold = 0;\n    while(entries.count > 250)\n    {\n        ++threshold;\n        @autoreleasepool {\n            NSMutableArray *entriesToRemove = [NSMutableArray array];\n            __block NSMutableDictionary *toReplace = [NSMutableDictionary dictionary];\n            [entries enumerateKeysAndObjectsUsingBlock:^(id entryKey, id entry, BOOL *stop) {\n                NSMutableArray *nestedToRemove = [NSMutableArray array];\n                [entry enumerateKeysAndObjectsUsingBlock:^(id nestedKey, id nested, BOOL *stop2) {\n                    if([nested integerValue] <= threshold)\n                    {\n                        [nestedToRemove addObject:nestedKey];\n                    }\n                }];\n                entry = [NSMutableDictionary dictionaryWithDictionary:entry];\n                [entry removeObjectsForKeys:nestedToRemove];\n                if([entry count] == 0)\n                {\n                    [entriesToRemove addObject:entryKey];\n                }\n                else\n                {\n                    toReplace[entryKey] = entry;\n                }\n            }];\n            [entries removeObjectsForKeys:entriesToRemove];\n            [toReplace enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {\n                entries[key] = obj;\n            }];\n        }\n    }\n    for(NSString *entryKey in [entries allKeys])\n    {\n        NSMutableDictionary *nestedEntry = entries[entryKey];\n        for(NSString *nestedKey in [nestedEntry allKeys])\n        {\n            nestedEntry[nestedKey] = @([nestedEntry[nestedKey] integerValue]-threshold);\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDBResult.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHDocset.h\"\n#import \"DHDBResultSorter.h\"\n\n@interface DHDBResult : NSObject\n\n@property (retain) NSString *path, *anchor, *relativePath, *fullPath, *name, *originalName, *type, *platform;\n@property (retain) DHDocset *docset;\n@property (retain) NSMutableArray *similarResults;\n@property (retain) NSString *query;\n@property (retain) NSString *_declaredInPage;\n@property (retain) NSNumber *distanceFromQuery;\n@property (assign) BOOL isHTTP, isSO, isPHP, isRust, isGo, isSwift;\n@property (assign) BOOL perfectMatch, queryIsPrefix, queryIsSuffix, perfectMatchOriginal, queryIsPrefixOfOriginal, queryIsSuffixOfOriginal, matchesQueryAtAll, fuzzyCamel, fuzzyPerfect, fuzzy, whitespaceMatch, originalMatchesQueryAtAll, fuzzyShouldIgnore;\n@property (retain) NSMutableArray *highlightRanges;\n@property (assign) NSInteger fragmentation;\n@property (assign) NSInteger actualFragmentation;\n@property (assign) BOOL isApple;\n@property (assign) NSInteger appleLanguage;\n@property (assign) BOOL linkIsSwift;\n@property (assign) NSInteger score;\n@property (assign) BOOL isAGuide;\n@property (assign) BOOL isActive;\n@property (assign) BOOL isRemote;\n@property (retain) UIImage *_typeImage;\n@property (retain) UIImage *_platformImage;\n@property (retain) NSString *remoteDocsetName;\n@property (retain) NSString *remoteResultURL;\n@property (retain) NSString *menuDescription; // used to build the declaredInPage, set it using #<dash_entry_menuDescription=value_encoded>\n@property (retain) NSString *appleObjCPath;\n@property (retain) NSString *appleSwiftPath;\n\n+ (DHDBResult *)resultWithDocset:(DHDocset *)docset resultSet:(FMResultSet *)rs;\n- (void)prepareName;\n- (UIImage *)typeImage;\n- (UIImage *)platformImage;\n- (NSString *)declaredInPage;\n- (void)highlightLabel:(UILabel *)label;\n- (void)highlightWithQuery:(NSString *)aQuery;\n+ (NSDictionary *)highlightDictionary;\n- (NSComparisonResult)compare:(DHDBResult *)aResult;\n- (NSComparisonResult)levenshteinCompare:(DHDBResult *)aResult;\n- (NSComparisonResult)compareFuziness:(DHDBResult *)aResult;\n- (float)levenshteinDistance;\n- (NSString *)sortType;\n- (NSString *)duplicateHash;\n- (NSString *)browserDuplicateHash;\n- (DHDBResult *)activeResult;\n- (NSUInteger)indexOfActiveItem;\n- (void)setActiveItemByIndex:(NSUInteger)index;\n- (NSString *)webViewURL;\n\n@end\n"
  },
  {
    "path": "Dash/DHDBResult.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDBResult.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHCSS.h\"\n\n@implementation DHDBResult\n\nstatic NSSet *commonDeclaredInStylePlatforms;\nstatic NSDictionary *highlightDictionary;\n\n+ (DHDBResult *)resultWithDocset:(DHDocset *)docset resultSet:(FMResultSet *)rs\n{\n    return [[DHDBResult alloc] initWithDocset:docset resultSet:rs];\n}\n\n- (id)initWithDocset:(DHDocset *)docset resultSet:(FMResultSet *)rs\n{\n    self = [super init];\n    if(self)\n    {\n        self.docset = docset;\n        self.platform = self.docset.platform;\n        self.isSO = [self.platform isEqualToString:@\"soonline\"] || [self.platform isEqualToString:@\"sooffline\"];\n        self.path = [rs stringForColumnIndex:0];\n        if(!self.path.length)\n        {\n            return nil;\n        }\n        NSRange anchorRange = [self.path rangeOfString:@\"#\"];\n        if(anchorRange.location != NSNotFound && anchorRange.location+1 < self.path.length)\n        {\n            self.anchor = [self.path substringFromDashIndex:anchorRange.location+1];\n            self.path = [self.path substringToDashIndex:anchorRange.location];\n        }\n        \n        if([self.platform isEqualToString:@\"apple\"])\n        {\n            NSInteger activeLanguage = [DHAppleActiveLanguage currentLanguage];\n            if([self.anchor contains:@\"<dash_entry_language=objc>\"] || [self.anchor contains:@\"<dash_entry_language=occ>\"])\n            {\n                if(activeLanguage == DHNewActiveAppleLanguageSwift)\n                {\n                    return nil;\n                }\n                self.appleLanguage = DHNewActiveAppleLanguageObjC;\n                self.anchor = [self.anchor stringByReplacingOccurrencesOfString:@\"<dash_entry_language=objc>\" withString:@\"\"];\n                self.anchor = [self.anchor stringByReplacingOccurrencesOfString:@\"<dash_entry_language=occ>\" withString:@\"\"];\n            }\n            else if([self.anchor contains:@\"<dash_entry_language=swift>\"])\n            {\n                if(activeLanguage == DHNewActiveAppleLanguageObjC)\n                {\n                    return nil;\n                }\n                self.appleLanguage = DHNewActiveAppleLanguageSwift;\n                self.anchor = [self.anchor stringByReplacingOccurrencesOfString:@\"<dash_entry_language=swift>\" withString:@\"\"];\n            }\n        }\n        BOOL isOSX = ([self.platform isEqualToString:@\"macosx\"] || [self.platform isEqualToString:@\"osx\"]);\n        if(self.anchor && isOSX && [self.anchor rangeOfString:@\"java\" options:NSCaseInsensitiveSearch].location != NSNotFound)\n        {\n            return nil;\n        }\n        \n        self.type = [rs stringForColumnIndex:2];\n        if(!self.type.length)\n        {\n            return nil;\n        }\n        \n        self.isApple = (isOSX || [[self platform] isEqualToString:@\"ios\"] || [[self platform] isEqualToString:@\"iphoneos\"] || [self.platform isEqualToString:@\"watchos\"] || [self.platform isEqualToString:@\"tvos\"]);\n        if(self.isApple)\n        {\n            if([self.anchor hasSuffix:@\"-dash-swift-hack\"])\n            {\n                self.linkIsSwift = YES;\n                self.anchor = [self.anchor substringToIndex:self.anchor.length-16];\n            }\n            self.linkIsSwift = self.linkIsSwift || [self.anchor contains:@\"apple_ref/swift/\"];\n            int active = [DHCSS activeAppleLanguage];\n            if(active == DHActiveAppleLanguageObjC && ![docset.name contains:@\"Xcode\"])\n            {\n                if(self.linkIsSwift)\n                {\n                    return nil;\n                }\n            }\n            else if(active == DHActiveAppleLanguageSwift)\n            {\n                BOOL isObjC = [self.anchor contains:@\"apple_ref/occ\"];\n                if(isObjC)\n                {\n                    return nil;\n                }\n            }\n        }\n        \n        BOOL isOnlineGuide = NO;\n        if([self.type isEqualToString:@\"Guide\"] || [self.type isEqualToString:@\"Sample\"])\n        {\n            if([self.path hasPrefix:@\"gfile://\"])\n            {\n                self.isAGuide = YES;\n                self.path = [self.path substringFromDashIndex:8];\n                self.fullPath = self.path;\n                self.relativePath = self.path;\n            }\n            else if([self.path hasPrefix:@\"ghttp://\"] || [self.path hasPrefix:@\"ghttps://\"])\n            {\n                self.isAGuide = YES;\n                isOnlineGuide = YES;\n                self.path = [self.path substringFromDashIndex:8];\n                self.fullPath = self.path;\n                self.relativePath = self.path;\n            }\n        }\n        \n        if(!isOnlineGuide)\n        {\n            if([self.path hasPrefix:@\"http://\"] || [self.path hasPrefix:@\"https://\"] || self.isSO || [self.path hasPrefix:@\"dash-apple-api://\"])\n            {\n                self.isHTTP = YES;\n                self.fullPath = self.path;\n                if([self.platform isEqualToString:@\"sooffline\"])\n                {\n                    self.fullPath = [self.fullPath stringByAppendingFormat:@\"?dbPath=%@\", [self.docset.sqlPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];\n                }\n            }\n            else\n            {\n                self.fullPath = [@\"file://\" stringByAppendingString:[[self.docset.path stringByAppendingPathComponent:@\"Contents/Resources/Documents\"] stringByAppendingPathComponent:self.path]];\n            }\n            self.fullPath = (self.anchor) ? [self.fullPath stringByAppendingFormat:@\"#%@\", self.anchor] : self.fullPath;\n            self.relativePath = (self.anchor) ? [self.path stringByAppendingFormat:@\"#%@\", self.anchor] : self.path;\n        }\n        self.name = [rs stringForColumnIndex:1];\n        if(!self.name.length)\n        {\n            return nil;\n        }\n        self.originalName = self.name;\n        self.similarResults = [NSMutableArray array];\n        [self prepareName];\n    }\n    return self;\n}\n\n- (void)prepareName\n{\n    if(self.isSO)\n    {\n        if([self.anchor hasPrefix:@\"dash-score-\"])\n        {\n            self.score = [[self.anchor substringFromIndex:11] integerValue];\n        }\n    }\n    if(self.isApple)\n    {\n        self.isApple = YES;\n    }\n    if([self.platform isEqualToString:@\"unity3d\"])\n    {\n        self.name = [self.name stringByReplacingOccurrencesOfString:@\"%47\" withString:@\"/\"];\n        self.originalName = [self.originalName stringByReplacingOccurrencesOfString:@\"%47\" withString:@\"/\"];\n    }\n    if([self.platform isEqualToString:@\"go\"] || [self.platform isEqualToString:@\"godoc\"])\n    {\n        self.isGo = YES;\n    }\n    \n    NSString *shorteningFamily = self.docset.nameShorteningFamily;\n    NSString *parseFamily = (shorteningFamily) ? shorteningFamily : self.docset.parseFamily;\n    parseFamily = (parseFamily && parseFamily.length) ? parseFamily : self.platform;\n    if(([parseFamily isEqualToString:@\"python\"] || [parseFamily isEqualToString:@\"flask\"] || [parseFamily isEqualToString:@\"scipy\"] || [parseFamily isEqualToString:@\"numpy\"] || [parseFamily isEqualToString:@\"pandas\"] || [parseFamily isEqualToString:@\"sqlalchemy\"] || [parseFamily isEqualToString:@\"tornado\"] || [parseFamily isEqualToString:@\"matplotlib\"] || [parseFamily isEqualToString:@\"salt\"] || [parseFamily isEqualToString:@\"jinja\"] || ([self.platform isEqualToString:@\"ocaml\"] && ([self.type isEqualToString:@\"Type\"] || [self.type isEqualToString:@\"Value\"])) || [parseFamily isEqualToString:@\"mono\"] || [parseFamily isEqualToString:@\"xamarin\"] || [parseFamily isEqualToString:@\"sencha\"] || [parseFamily isEqualToString:@\"extjs\"] || [parseFamily isEqualToString:@\"titanium\"] || [parseFamily isEqualToString:@\"twisted\"] || [parseFamily isEqualToString:@\"unity3d\"] || [parseFamily isEqualToString:@\"django\"] || ([parseFamily isEqualToString:@\"javascript\"] && ![self.type isEqualToString:@\"Function\"] && ![self.type isEqualToString:@\"Keyword\"]) || [parseFamily isEqualToString:@\"actionscript\"] || [parseFamily isEqualToString:@\"yui\"] || [parseFamily isEqualToString:@\"vsphere\"] || ([self.platform isEqualToString:@\"SproutCore\"] && ![self.type isClassType] && ![self.type isEqualToString:@\"Protocol\"] && ![self.type isEqualToString:@\"Delegate\"])) && ![self.type isPackageType])\n    {\n        self.name = [self.name lastPackageComponent:@\".\"];\n    }\n    else if([parseFamily isEqualToString:@\"apple\"])\n    {\n        self.name = [self.name substringFromLastOccurrenceOfString:@\".\"];\n    }\n    else if([parseFamily isEqualToString:@\"jQuery\"] || [parseFamily isEqualToString:@\"jqueryui\"])\n    {\n        if([self.name hasPrefix:@\".\"])\n        {\n            self.name = [self.name substringFromDashIndex:1];\n        }\n        else if([self.name hasPrefix:@\":\"])\n        {\n            self.name = [self.name substringFromDashIndex:1];\n        }\n        else if([self.name hasCaseInsensitivePrefix:@\"jQuery.\"])\n        {\n            self.name = [self.name substringFromDashIndex:@\"jQuery.\".length];\n        }\n    }\n    else if([self.platform isEqualToString:@\"net\"] && ![@[@\"Class\", @\"Delegate\", @\"Interface\", @\"Namespace\", @\"Constructor\", @\"Enum\", @\"Struct\", @\"Conversion\"] containsObject:self.type])\n    {\n        self.name = [self.name substringFromString:@\".\"];\n    }\n    else if([self.platform isEqualToString:@\"matlab\"])\n    {\n        if([self.type isEqualToString:@\"Class\"])\n        {\n            self.name = [self.name lastPackageComponent:@\".\"];\n        }\n    }\n    else if([self.platform isEqualToString:@\"handlebars\"])\n    {\n        if([self.type isEqualToString:@\"Method\"])\n        {\n            self.name = [self.name substringFromLastOccurrenceOfString:@\".\"];\n        }\n    }\n    else if([parseFamily isEqualToString:@\"lodash\"])\n    {\n        if([self.name hasPrefix:@\"_.\"])\n        {\n            self.name = [self.name substringFromIndex:2];\n        }\n    }\n    else if([parseFamily isEqualToString:@\"jquerym\"])\n    {\n        if([self.name hasCaseInsensitivePrefix:@\"jQuery.mobile.\"])\n        {\n            self.name = [self.name substringFromDashIndex:@\"jQuery.mobile.\".length];\n        }\n    }\n    else if([parseFamily isCaseInsensitiveEqual:@\"smarty\"])\n    {\n        self.name = [self.name substringFromString:@\"->\"];\n    }\n    else if(([parseFamily isEqualToString:@\"scala\"] || [parseFamily isEqualToString:@\"scaladoc\"] || [parseFamily isEqualToString:@\"playscala\"] || [parseFamily isEqualToString:@\"akka\"]) && ![self.type isPackageType])\n    {\n        self.name = [self.name lastPackageComponent:@\".\"];\n    }\n    else if([parseFamily isEqualToString:@\"ember\"] && ![self.type isPackageType] && ![self.type isClassType] && ![self.type isEqualToString:@\"Guide\"])\n    {\n        self.name = [self.name lastPackageComponent:@\".\"];\n    }\n    else if([self.platform isEqualToString:@\"erlang\"] || [parseFamily isEqualToString:@\"erlang_shortening\"])\n    {\n        self.name = [self.name lastPackageComponent:@\":\"];\n        NSInteger location = [self.name rangeOfString:@\"/\"].location;\n        if(location != NSNotFound && location != 0)\n        {\n            self.name = [self.name substringToDashIndex:location];\n        }\n    }\n    else if([self.platform isEqualToString:@\"elixir\"] || [self.platform isEqualToString:@\"hex\"] || [parseFamily isEqualToString:@\"elixir_shortening\"])\n    {\n        if(![@[@\"Exception\", @\"Protocol\", @\"Module\"] containsObject:self.type] && ![self.type isPackageType] && ![self.type isClassType] && ![self.type isEqualToString:@\"Guide\"])\n        {\n            self.name = [self.name lastPackageComponent:@\".\"];\n            self.name = [self.name substringToLastOccurrenceOfString:@\"/\"];\n        }\n    }\n    else if(([self.platform isEqualToString:@\"dartlang\"] || [parseFamily isEqualToString:@\"dartlang\"] || [self.platform isEqualToString:@\"polymerdart\"] || [self.platform isEqualToString:@\"angulardart\"]) && ![self.type isPackageType])\n    {\n        if([self.type isEqualToString:@\"Constructor\"])\n        {\n            if([[self.name substringFromLastOccurrenceOfString:@\".\"] firstCharIsLowercase])\n            {\n                self.name = [self.name lastTwoPackageComponents:@\".\"];\n            }\n            else\n            {\n                self.name = [self.name substringFromLastOccurrenceOfString:@\".\"];\n            }\n        }\n        else\n        {\n            self.name = [self.name substringFromLastOccurrenceOfString:@\".\"];\n        }\n    }\n    else if((([parseFamily isEqualToString:@\"go\"] || [self.platform isEqualToString:@\"godoc\"]) && ![self.type isEqualToString:@\"Package\"]) || ([self.platform isEqualToString:@\"zepto\"] && ![self.type isEqualToString:@\"Module\"]))\n    {\n        self.name = [self.name substringFromString:@\".\"];\n    }\n    else if(([parseFamily isEqualToString:@\"compass\"] && ![self.type isEqualToString:@\"Module\"]) || [parseFamily isEqualToString:@\"dojo\"])\n    {\n        self.name = [self.name lastPackageComponent:@\"/\"];\n    }\n    else if([self.platform isEqualToString:@\"ee\"])\n    {\n        self.name = [self.name substringFromString:@\"::\"];\n    }\n    else if([parseFamily isEqualToString:@\"cappuccino\"] || [self.platform isEqualToString:@\"cvcpp\"] || [self.platform isEqualToString:@\"drupal\"] || [self.platform isEqualToString:@\"zend\"] || [self.platform isEqualToString:@\"cocos2dx\"] || [self.platform isEqualToString:@\"doxy\"] || [self.platform isEqualToString:@\"doxygen\"] || [parseFamily isEqualToString:@\"doxy\"] || [parseFamily isEqualToString:@\"doxygen\"])\n    {\n        self.name = [self.name lastPackageComponent:@\"::\"];\n    }\n    else if([self.platform isEqualToString:@\"php\"])\n    {\n        self.name = [self.name lastPackageComponent:@\"::\"];\n        self.isPHP = YES;\n    }\n    else if([self.platform isEqualToString:@\"rust\"])\n    {\n        if(![self.type isEqualToString:@\"Module\"])\n        {\n            self.name = [self.name lastPackageComponent:@\"::\"];\n        }\n        self.isRust = YES;\n    }\n    else if([self.platform isEqualToString:@\"swift\"])\n    {\n        if([@[@\"Method\", @\"Variable\", @\"Constant\", @\"Alias\"] containsObject:self.type])\n        {\n            self.name = [self.name substringFromString:@\".\"];\n        }\n        self.isSwift = YES;\n    }\n    else if([self.platform isEqualToString:@\"wordpress\"] && [self.type isEqualToString:@\"Method\"]&& [self.name contains:@\"::\"])\n    {\n        self.name = [self.name substringFromLastOccurrenceOfString:@\"::\"];\n    }\n    else if([parseFamily isEqualToString:@\"prototype\"] && [self.type isEqualToString:@\"Constructor\"] && [self.name hasCaseInsensitivePrefix:@\"new \"])\n    {\n        self.name = [self.name substringFromDashIndex:4];\n    }\n    else if([parseFamily isEqualToString:@\"cpp\"] || [parseFamily isEqualToString:@\"cocos2dx\"])\n    {\n        self.name = [[self.name lastPackageComponent:@\"::\"] stringByUnescapingFromHTML];\n        self.originalName = [self.originalName stringByUnescapingFromHTML];\n    }\n    else if([self.platform isEqualToString:@\"awsjs\"])\n    {\n        if(![@[@\"Guide\", @\"Section\", @\"Sample\"] containsObject:self.type])\n        {\n            if(![self.type isPackageType] && ![self.type isClassType])\n            {\n                self.name = [self.name substringFromString:@\".\"];\n            }\n        }\n    }\n    else if([parseFamily isEqualToString:@\"ruby\"] || [parseFamily isEqualToString:@\"rubyGems\"] || [parseFamily isEqualToString:@\"rails\"])\n    {\n        if([parseFamily isEqualToString:@\"rails\"])\n        {\n            self.name = [self.name stringByUnescapingFromHTML];\n            self.originalName = [self.originalName stringByUnescapingFromHTML];\n        }\n        if(![@[@\"Guide\", @\"Section\", @\"Sample\"] containsObject:self.type])\n        {\n            if([self.name contains:@\"::\"])\n            {\n                self.name = [self.name lastPackageComponent:@\"::\"];\n            }\n            if(![self.type isPackageType] && ![self.type isClassType])\n            {\n                if([self.name contains:@\"#\"])\n                {\n                    self.name = [self.name substringFromString:@\"#\"];\n                }\n                else\n                {\n                    self.name = [self.name substringFromString:@\".\"];\n                }\n            }\n        }\n    }\n    else if([self.platform isEqualToString:@\"laravel\"] || [self.platform isEqualToString:@\"phpp\"] || [parseFamily isEqualToString:@\"phpShortening\"] || [self.platform isEqualToString:@\"joomla\"] || [self.platform isEqualToString:@\"symfony\"] || [self.platform isEqualToString:@\"cakephp\"] || [self.platform isEqualToString:@\"typo3\"])\n    {\n        if(![self.type isPackageType] && ![self.type isEqualToString:@\"Function\"])\n        {\n            self.name = [self.name lastPackageComponent:@\"\\\\\"];\n            self.name = [self.name lastPackageComponent:@\"::\"];\n        }\n    }\n    else if(([parseFamily isEqualToString:@\"yard\"] || [parseFamily isEqualToString:@\"qt\"] || [parseFamily isEqualToString:@\"yii\"]) && [self.name rangeOfString:@\"::\"].location != NSNotFound)\n    {\n        self.name = [self.name lastPackageComponent:@\"::\"];\n    }\n    else if([parseFamily isEqualToString:@\"manPages\"])\n    {\n        NSInteger loc = [self.name rangeOfString:@\"(\" options:NSBackwardsSearch].location;\n        if(loc != NSNotFound)\n        {\n            self.name = [self.name substringToDashIndex:loc];\n        }\n    }\n    else if([parseFamily isEqualToString:@\"java\"] || [parseFamily isEqualToString:@\"playjava\"] || [parseFamily isEqualToString:@\"javafx\"] || [parseFamily isEqualToString:@\"groovy\"])\n    {\n        self.name = [self.name stringByUnescapingFromHTML];\n        self.originalName = self.name;\n    }\n    \n    if([self.fullPath contains:@\"<dash_entry_name=\"])\n    {\n        NSString *newName = [[self.fullPath substringBetweenString:@\"<dash_entry_name=\" andString:@\">\"] stringByReplacingPercentEscapes];\n        if(newName.length)\n        {\n            self.name = newName;\n        }\n    }\n    if([self.fullPath contains:@\"<dash_entry_originalName=\"])\n    {\n        NSString *newOriginalName = [[self.fullPath substringBetweenString:@\"<dash_entry_originalName=\" andString:@\">\"] stringByReplacingPercentEscapes];\n        if(newOriginalName.length)\n        {\n            self.originalName = newOriginalName;\n        }\n    }\n    if([self.fullPath contains:@\"<dash_entry_menuDescription=\"])\n    {\n        NSString *newMenuDescription = [[self.fullPath substringBetweenString:@\"<dash_entry_menuDescription=\" andString:@\">\"] stringByReplacingPercentEscapes];\n        if(newMenuDescription.length)\n        {\n            self.menuDescription = newMenuDescription;\n        }\n    }\n    if([self.fullPath contains:@\"<dash_entry_objcPath=\"])\n    {\n        NSString *objcPath = [[self.fullPath substringBetweenString:@\"<dash_entry_objcPath=\" andString:@\">\"] stringByReplacingPercentEscapes];\n        if(objcPath.length)\n        {\n            self.appleObjCPath = objcPath;\n        }\n    }\n    if([self.fullPath contains:@\"<dash_entry_swiftPath=\"])\n    {\n        NSString *swift = [[self.fullPath substringBetweenString:@\"<dash_entry_swiftPath=\" andString:@\">\"] stringByReplacingPercentEscapes];\n        if(swift.length)\n        {\n            self.appleSwiftPath = swift;\n        }\n    }\n    while([self.fullPath contains:@\"<dash_entry_\"])\n    {\n        NSString *toRemove = [self.fullPath substringBetweenString:@\"<dash_entry_\" andString:@\">\"];\n        if(toRemove.length)\n        {\n            toRemove = [NSString stringWithFormat:@\"<dash_entry_%@>\", toRemove];\n            self.fullPath = [self.fullPath stringByReplacingOccurrencesOfString:toRemove withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.fullPath.length)];\n            self.relativePath = [self.relativePath stringByReplacingOccurrencesOfString:toRemove withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.relativePath.length)];\n            self.path = [self.path stringByReplacingOccurrencesOfString:toRemove withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.path.length)];\n        }\n        else\n        {\n            break;\n        }\n    }\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:@\"Name: %@, Full Path: %@, Platform: %@, Type: %@, Similars: %@\", self.name, self.fullPath, self.platform, self.type, self.similarResults];\n}\n\n- (BOOL)isEqual:(DHDBResult *)someResult\n{\n    NSString *myFamily = self.docset.parseFamily;\n    NSString *theirFamily = someResult.docset.parseFamily;\n    if(self.isSO && someResult.isSO)\n    {\n        return [self.path isEqualToString:someResult.path];\n    }\n    return ([self.name isEqualToString:someResult.name] && [self.type isEqualToString:someResult.type] && ([self.platform isEqualToString:someResult.platform] || (myFamily.length && [myFamily isEqualToString:@\"cheatsheet\"] && theirFamily.length && [myFamily isEqualToString:theirFamily])));\n}\n\n- (UIImage *)typeImage\n{\n    if(self._typeImage)\n    {\n        return self._typeImage;\n    }\n    UIImage *image = [UIImage imageNamed:self.type];\n    return image;\n}\n\n- (UIImage *)platformImage\n{\n    if(self._platformImage)\n    {\n        return self._platformImage;\n    }\n    return self.docset.icon;\n}\n\n- (NSString *)declaredInPage\n{\n    if(self._declaredInPage)\n    {\n        return self._declaredInPage;\n    }\n    if(self.menuDescription)\n    {\n        self._declaredInPage = [@\" - \" stringByAppendingString:self.menuDescription];\n        return self._declaredInPage;\n    }\n    if(self.isAGuide)\n    {\n        NSString *toAppend = self.originalName;\n        for(NSString *token in @[@\"/Conceptual/\", @\"/GettingStarted/\", @\"/General/\", @\"releasenotes/\", @\"samplecode/\", @\"featuredarticles/\", @\"technotes/\", @\"documentation/\", @\"/\"])\n        {\n            NSRange tokenRange = [self.path rangeOfString:token];\n            if(tokenRange.location != NSNotFound)\n            {\n                NSString *guideName = [[self.path substringFromDashIndex:NSMaxRange(tokenRange)] substringToString:@\"/\"];\n                guideName = [guideName removePrefixIfExists:@\"DevPedia-\"];\n                guideName = [guideName removePrefixIfExists:@\"xcode_guide-\"];\n                guideName = [guideName stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"];\n                toAppend = [guideName stringByAppendingFormat:@\" - %@\", self.originalName];\n                break;\n            }\n        }\n        self._declaredInPage = [@\" - \" stringByAppendingString:toAppend];\n        return self._declaredInPage;\n    }\n    if([self.platform isEqualToString:@\"lisp\"])\n    {\n        self._declaredInPage = [@\" - \" stringByAppendingString:[self.path lastPathComponent]];\n        return self._declaredInPage;\n    }\n    if([self.platform isEqualToString:@\"ee\"] && [self.originalName contains:@\"::\"])\n    {\n        self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n        return self._declaredInPage;\n    }\n    if([self.platform isEqualToString:@\"net\"])\n    {\n        NSString *fqn = [self.relativePath substringFromStringReturningNil:@\"#dashFQN\"];\n        if(fqn && fqn.length)\n        {\n            fqn = [fqn stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n            self._declaredInPage = [@\" - \" stringByAppendingString:fqn];\n            return self._declaredInPage;\n        }\n        else\n        {\n            self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n            return self._declaredInPage;\n        }\n    }\n    if([self.platform isEqualToString:@\"moo\"])\n    {\n        if([[[[self.path lastPathComponent] stringByDeletingPathExtension] stringByDeletingPathFragment] contains:@\"-\"])\n        {\n            self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n            return self._declaredInPage;\n        }\n    }\n    NSString *declaredInStyle = self.docset.declaredInStyle;\n    NSString *parseFamily = self.docset.parseFamily;\n    parseFamily = (declaredInStyle) ? declaredInStyle : parseFamily;\n    if([[DHDBResult commonDeclaredInStylePlatforms] containsObject:self.platform] || ([self.platform isEqualToString:@\"wordpress\"] && [self.originalName contains:@\"::\"] && [self.type isEqualToString:@\"Method\"]) || ([self.platform isEqualToString:@\"matlab\"] && [self.type isEqualToString:@\"Class\"]) || ([self.platform isEqualToString:@\"actionscript\"] && ![self.type isEqualToString:@\"Class\"]) || ([self.platform isEqualToString:@\"grails\"] && [self.type isEqualToString:@\"Guide\"]) || [parseFamily isEqualToString:@\"cheatsheet\"] || [parseFamily isEqualToString:@\"originalName\"])\n    {\n        self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n        return self._declaredInPage;\n    }\n    else if([self.platform isEqualToString:@\"cappuccino\"] || [self.platform isEqualToString:@\"zend\"] || [self.platform isEqualToString:@\"typo3\"] || [self.platform isEqualToString:@\"cocos2dx\"] || [self.platform isEqualToString:@\"doxy\"] || [self.platform isEqualToString:@\"doxygen\"] || [parseFamily isEqualToString:@\"doxy\"] || [parseFamily isEqualToString:@\"doxygen\"])\n    {\n        if([self.type isClassType] || [self.type isPackageType] || [self.type isEqualToString:@\"Interface\"] || [self.type isEqualToString:@\"Exception\"] || [self.type isEqualToString:@\"Union\"] || [self.type isEqualToString:@\"Struct\"] || [self.type isEqualToString:@\"Guide\"] || [self.type isEqualToString:@\"Sample\"] || [self.type isEqualToString:@\"Protocol\"] || [self.type isEqualToString:@\"Delegate\"])\n        {\n            self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n            return self._declaredInPage;\n        }\n        NSString *filename = [[[self.path lastPathComponent] stringByDeletingPathExtension] stringByDeletingPathFragment];\n        if([filename hasCaseInsensitivePrefix:@\"dir_\"])\n        {\n            self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n            return self._declaredInPage;\n        }\n        if(filename.length == 128)\n        {\n            filename = [filename substringToDashIndex:96];\n            NSRange alphaRange = [filename rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet] options:NSBackwardsSearch];\n            if(alphaRange.location != NSNotFound)\n            {\n                filename = [filename substringToDashIndex:alphaRange.location+1];\n                filename = [filename stringByAppendingString:@\"...\"];\n            }\n            else\n            {\n                self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n                return self._declaredInPage;\n            }\n        }\n        if([filename hasCaseInsensitivePrefix:@\"group_\"])\n        {\n            filename = [filename substringFromDashIndex:6];\n        }\n        if([filename hasCaseInsensitivePrefix:@\"category\"])\n        {\n            filename = [filename substringFromDashIndex:8];\n        }\n        else if([filename hasCaseInsensitivePrefix:@\"interface\"])\n        {\n            filename = [filename substringFromDashIndex:9];\n        }\n        else if([filename hasCaseInsensitivePrefix:@\"class\"])\n        {\n            filename = [filename substringFromDashIndex:5];\n        }\n        else if([filename hasCaseInsensitivePrefix:@\"namespace\"])\n        {\n            filename = [filename substringFromDashIndex:9];\n        }\n        else if([filename hasCaseInsensitivePrefix:@\"struct\"])\n        {\n            filename = [filename substringFromDashIndex:6];\n        }\n        else if([filename hasCaseInsensitivePrefix:@\"union\"])\n        {\n            filename = [filename substringFromDashIndex:5];\n        }\n        NSString *declaredName = [[[[[[[[[[[[[[[[[[[[[[[[filename stringByReplacingOccurrencesOfString:@\"_1\" withString:@\":\"] stringByReplacingOccurrencesOfString:@\"_2\" withString:@\"/\"] stringByReplacingOccurrencesOfString:@\"_3\" withString:@\"<\"] stringByReplacingOccurrencesOfString:@\"_4\" withString:@\">\"] stringByReplacingOccurrencesOfString:@\"_5\" withString:@\"*\"] stringByReplacingOccurrencesOfString:@\"_6\" withString:@\"&\"] stringByReplacingOccurrencesOfString:@\"_7\" withString:@\"|\"] stringByReplacingOccurrencesOfString:@\"_9\" withString:@\"!\"] stringByReplacingOccurrencesOfString:@\"_00\" withString:@\",\"] stringByReplacingOccurrencesOfString:@\"_01\" withString:@\" \"] stringByReplacingOccurrencesOfString:@\"_02\" withString:@\"{\"] stringByReplacingOccurrencesOfString:@\"_03\" withString:@\"}\"] stringByReplacingOccurrencesOfString:@\"_04\" withString:@\"?\"] stringByReplacingOccurrencesOfString:@\"_05\" withString:@\"^\"] stringByReplacingOccurrencesOfString:@\"_06\" withString:@\"%\"] stringByReplacingOccurrencesOfString:@\"_07\" withString:@\"(\"] stringByReplacingOccurrencesOfString:@\"_08\" withString:@\")\"] stringByReplacingOccurrencesOfString:@\"_09\" withString:@\"+\"] stringByReplacingOccurrencesOfString:@\"_0A\" withString:@\"=\"] stringByReplacingOccurrencesOfString:@\"_0B\" withString:@\"$\"] stringByReplacingOccurrencesOfString:@\"_0C\" withString:@\"\\\\\"] stringByReplacingOccurrencesOfString:@\"_8\" withString:@\".\"] stringByReplacingOccurrencesOfString:@\"__\" withString:@\" \"] stringByReplacingOccurrencesOfString:@\"::\" withString:@\"\\\\\"];\n        NSRange underRange = [declaredName rangeOfString:@\"_\"];\n        while(underRange.location != NSNotFound)\n        {\n            if(underRange.location+2 <= declaredName.length)\n            {\n                declaredName = [declaredName stringByReplacingCharactersInRange:NSMakeRange(underRange.location, 2) withString:[[declaredName substringWithDashRange:NSMakeRange(underRange.location+1, 1)] uppercaseString]];\n                underRange = [declaredName rangeOfString:@\"_\"];\n            }\n            else\n            {\n                break;\n            }\n        }\n        if(declaredName.length)\n        {\n            self._declaredInPage = [NSString stringWithFormat:@\" - %@ > %@\", [declaredName stringByReplacingOccurrencesOfString:@\" \" withString:@\"_\"], self.originalName];\n            return self._declaredInPage;\n        }\n        self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n        return self._declaredInPage;\n    }\n    else if([self.platform isEqualToString:@\"manPages\"])\n    {\n        NSInteger anchorLoc = [self.fullPath rangeOfString:@\"#\"].location;\n        if(anchorLoc != NSNotFound && anchorLoc+1 < self.fullPath.length)\n        {\n            self._declaredInPage = [@\" - \" stringByAppendingString:[self.fullPath substringFromDashIndex:anchorLoc+1]];\n            return self._declaredInPage;\n        }\n        self._declaredInPage = [@\" - \" stringByAppendingString:self.originalName];\n        return self._declaredInPage;\n    }\n    NSString *thePath = self.path;\n    if([self.platform isEqualToString:@\"clojure\"])\n    {\n        thePath = [thePath stringByReplacingOccurrencesOfString:@\"-api.html\" withString:@\".html\"];\n    }\n    else if([@[@\"ios\", @\"osx\", @\"macosx\", @\"iphoneos\", @\"watchos\", @\"tvos\"] containsObject:self.platform])\n    {\n        thePath = [thePath stringByReplacingOccurrencesOfString:@\"Swift/Reference/Swift_\" withString:@\"Swift/Reference/\"];\n        thePath = [thePath stringByReplacingOccurrencesOfString:@\"Reference/Reference.html\" withString:@\"index.html\"];\n        thePath = [thePath stringByReplacingOccurrencesOfString:@\"Introduction/Introduction.html\" withString:@\"index.html\"];\n    }\n    if([self.platform isEqualToString:@\"android\"])\n    {\n        if([thePath hasCaseInsensitivePrefix:@\"docs/\"])\n        {\n            thePath = [thePath substringFromDashIndex:@\"docs/\".length];\n        }\n        else if([thePath hasCaseInsensitivePrefix:@\"google_play_services_docs/\"])\n        {\n            thePath = [thePath substringFromDashIndex:@\"google_play_services_docs/\".length];\n        }\n    }\n    NSArray *reverseObjects = [[[thePath pathComponents] reverseObjectEnumerator] allObjects];\n    int i = 0;\n    for(__strong NSString *reverseObject in reverseObjects)\n    {\n        if([self.platform isEqualToString:@\"wordpress\"])\n        {\n            reverseObject = [reverseObject stringByReplacingOccurrencesOfString:@\"---\" withString:@\"/\"];\n        }\n        if(![reverseObject isCaseInsensitiveEqual:@\"reference\"] && ![reverseObject isCaseInsensitiveEqual:@\"index.html\"] && ![reverseObject isCaseInsensitiveEqual:@\"description\"] && ![reverseObject isCaseInsensitiveEqual:@\"Introduction\"] && ![reverseObject hasCaseInsensitiveSuffix:@\"_h\"] && ![reverseObject isCaseInsensitiveEqual:@\"package-summary.html\"] && ![reverseObject isCaseInsensitiveEqual:@\"rdoc\"])\n        {\n            NSRange anchorRange = [reverseObject rangeOfString:@\"#\"];\n            if(anchorRange.location != NSNotFound && anchorRange.location != 0)\n            {\n                reverseObject = [reverseObject substringToDashIndex:anchorRange.location];\n            }\n            reverseObject = [reverseObject stringByReplacingOccurrencesOfString:@\".html\" withString:@\"\"];\n            if(![self.platform isEqualToString:@\"wordpress\"] && ![self.platform isEqualToString:@\"nginx\"])\n            {\n                reverseObject = [[reverseObject stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"] stringByReplacingOccurrencesOfString:@\"-\" withString:@\"_\"];\n            }\n            if(([self.platform isEqualToString:@\"android\"] || [self.platform isEqualToString:@\"java\"] || (parseFamily && [parseFamily isEqualToString:@\"java\"]) || [self.platform isEqualToString:@\"playjava\"] || [self.platform isEqualToString:@\"groovy\"] || [self.platform isEqualToString:@\"corona\"] || [self.platform isEqualToString:@\"javafx\"] || [self.platform isEqualToString:@\"rubymotion\"]) && (i == reverseObjects.count || [reverseObjects[i] isCaseInsensitiveEqual:@\"Documents\"]))\n            {\n                break;\n            }\n            if(self._declaredInPage.length > 0)\n            {\n                self._declaredInPage = [reverseObject stringByAppendingFormat:@\"%@%@\", ([self.platform isEqualToString:@\"rubymotion\"]) ? @\"::\" : @\".\", self._declaredInPage];\n            }\n            else\n            {\n                self._declaredInPage = reverseObject;\n            }\n            if(![self.platform isEqualToString:@\"corona\"] && ![self.platform isEqualToString:@\"android\"] && !(parseFamily && [parseFamily isEqualToString:@\"java\"]) && ![self.platform isEqualToString:@\"java\"] && ![self.platform isEqualToString:@\"playjava\"] && ![self.platform isEqualToString:@\"groovy\"] && ![self.platform isEqualToString:@\"javafx\"] && ![self.platform isEqualToString:@\"actionscript\"] && ![self.platform isEqualToString:@\"rubymotion\"])\n            {\n                break;\n            }\n        }\n        ++i;\n    }\n    if(self._declaredInPage.length > 0)\n    {\n        if([self.platform isEqualToString:@\"corona\"])\n        {\n            self._declaredInPage = [self._declaredInPage substringFromString:@\".\"];\n            self._declaredInPage = [self._declaredInPage substringFromString:@\".\"];\n        }\n        else if([self.platform isEqualToString:@\"haskell\"] || [self.platform isEqualToString:@\"hackage\"])\n        {\n            self._declaredInPage = [self._declaredInPage stringByReplacingOccurrencesOfString:@\"_\" withString:@\".\"];\n        }\n        else if([self.platform isEqualToString:@\"elisp\"] || [self.platform isEqualToString:@\"d3\"])\n        {\n            self._declaredInPage = [self._declaredInPage stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"];\n        }\n        else if([self.platform isEqualToString:@\"glib\"])\n        {\n            if([self._declaredInPage hasCaseInsensitivePrefix:@\"glib_\"])\n            {\n                self._declaredInPage = [self._declaredInPage substringFromDashIndex:@\"glib_\".length];\n            }\n            self._declaredInPage = [self._declaredInPage stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"];\n        }\n        self._declaredInPage = [@\" - \" stringByAppendingString:self._declaredInPage];\n        return self._declaredInPage;\n    }\n    self._declaredInPage = @\"\";\n    return @\"\";\n}\n\n- (NSString *)duplicateHash\n{\n    if(self.isApple)\n    {\n        return [NSString stringWithFormat:@\"%@%@%@\", [[[self.originalName stringByReplacingOccurrencesOfString:@\"(_\" withString:@\"\"] stringByReplacingOccurrencesOfString:@\"(\" withString:@\"\"] stringByReplacingOccurrencesOfString:@\")\" withString:@\"\"], self.type, [self.fullPath substringToString:@\"#\"]];\n    }\n    return nil;\n}\n\n- (NSString *)browserDuplicateHash\n{\n    NSString *pathHack = self.fullPath;\n    if(self.isApple)\n    {\n        pathHack = self.path;\n    }\n    return [NSString stringWithFormat:@\"%@%@%@\", self.originalName, self.type, pathHack];\n}\n\n- (void)highlightLabel:(UILabel *)label\n{\n    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:label.attributedText];\n    if(self.highlightRanges.count)\n    {\n        for(NSValue *aValue in self.highlightRanges)\n        {\n            NSRange range = [aValue rangeValue];\n            [string addAttributes:[DHDBResult highlightDictionary] range:range];\n        }\n    }\n    else\n    {\n        // This is needed when the name is not contained within originalName, like the C++ docset\n        // It's a basic workaround that only covers the easiest case\n        NSRange queryRange = [self.name rangeOfString:self.query options:NSCaseInsensitiveSearch];\n        if(queryRange.location != NSNotFound)\n        {\n            [string addAttributes:[DHDBResult highlightDictionary] range:queryRange];\n        }\n    }\n    label.attributedText = string;\n}\n\n- (void)highlightWithQuery:(NSString *)aQuery\n{\n    self.query = aQuery;\n    self.highlightRanges = [NSMutableArray array];\n    if(self.query && [self.query length] > 0)\n    {\n        if((self.matchesQueryAtAll || self.originalMatchesQueryAtAll) && !self.whitespaceMatch)\n        {\n            self.fragmentation = -1;\n            NSString *toHighlight = self.query;\n            NSRange range;\n            NSInteger offset = 0;\n            NSString *substring = [NSString stringWithString:self.originalName];\n            NSRange nameRange = [self.originalName rangeOfString:self.name options:NSCaseInsensitiveSearch|NSBackwardsSearch];\n            while((range = [substring rangeOfString:toHighlight options:NSCaseInsensitiveSearch]).location != NSNotFound)\n            {\n                NSRange originalRange = NSMakeRange(range.location+offset, range.length);\n                NSRange intersectionRange = NSIntersectionRange(originalRange, nameRange);\n                if(intersectionRange.length > 0)\n                {\n                    intersectionRange.location -= nameRange.location;\n                    [self.highlightRanges addObject:[NSValue valueWithRange:intersectionRange]];\n                }\n                substring = [substring substringFromDashIndex:range.location+range.length];\n                offset += range.location+range.length;\n            }\n        }\n        else\n        {\n            // check if whitespace match\n            if([self.originalName rangeOfString:@\" \"].location != NSNotFound)\n            {\n                NSMutableCharacterSet *checkSet = [NSMutableCharacterSet characterSetWithCharactersInString:@\" \"];\n                for(int i = 0; i < 3; i++)\n                {\n                    // for is needed so that matches like \"ftp&\" work with results like \"FTP & SFTP\" (Vagrant docset)\n                    if(i == 1)\n                    {\n                        [checkSet formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]];\n                    }\n                    else if(i == 2)\n                    {\n                        [checkSet formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];\n                    }\n                    NSMutableArray *removedRanges = [NSMutableArray array];\n                    NSString *strippedOriginalName = [self.originalName stringByDeletingCharactersInSet:checkSet removedRanges:removedRanges];\n                    NSString *strippedQuery = [self.query stringByDeletingCharactersInSet:checkSet];\n                    \n                    NSRange queryRange = [strippedOriginalName rangeOfString:strippedQuery options:NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch];\n                    if(queryRange.location != NSNotFound)\n                    {\n                        for(NSValue *removedRangeValue in removedRanges)\n                        {\n                            NSRange removedRange = [removedRangeValue rangeValue];\n                            if(removedRange.location <= queryRange.location)\n                            {\n                                queryRange.location += removedRange.length;\n                            }\n                            else if(NSIntersectionRange(removedRange, queryRange).length == removedRange.length)\n                            {\n                                queryRange.length += removedRange.length;\n                            }\n                        }\n                        if([[self.originalName substringWithDashRange:queryRange] contains:@\" \"])\n                        {\n                            [self setHighlightRanges:[NSMutableArray arrayWithObject:[NSValue valueWithRange:queryRange]] relativeToNameRange:[self.originalName rangeOfString:self.name options:NSCaseInsensitiveSearch|NSBackwardsSearch]];\n                            self.fragmentation = -1;\n                            return;\n                        }\n                    }\n                }\n            }\n            \n            // find all occurences of letters in query\n            NSMutableDictionary *letters = [NSMutableDictionary dictionary];\n            [self.query enumerateLettersUsingBlock:^(NSString *letter) {\n                if(!letters[letter])\n                {\n                    letters[letter] = [self.originalName rangesOfString:letter];\n                }\n            }];\n            \n            // initial seed: add occurences of first letter\n            NSMutableArray *matches = [NSMutableArray array];\n            NSString *firstLetter = [self.query substringWithRange:NSMakeRange(0, 1)];\n            for(NSValue *rangeValue in letters[firstLetter])\n            {\n                [matches addObject:[NSMutableArray arrayWithObject:rangeValue]];\n            }\n            \n            // spread initial seeds to cover all possible occurences of all letters\n            [[self.query substringFromIndex:1] enumerateLettersUsingBlock:^(NSString *letter) {\n                NSArray *letterRangeValues = letters[letter];\n                for(NSMutableArray *match in [NSArray arrayWithArray:matches])\n                {\n                    for(NSValue *letterRangeValue in letterRangeValues)\n                    {\n                        NSRange letterRange = [letterRangeValue rangeValue];\n                        if(NSMaxRange([[match lastObject] rangeValue]) < NSMaxRange(letterRange))\n                        {\n                            NSMutableArray *matchSpread = [NSMutableArray arrayWithArray:match];\n                            [matchSpread addObject:letterRangeValue];\n                            [matches addObject:matchSpread];\n                            if(matches.count >= 80)\n                            {\n                                break;\n                            }\n                        }\n                    }\n                    [matches removeObjectIdenticalTo:match];\n                }\n            }];\n            \n            // remove matches that do not have all letters matched\n            for(NSMutableArray *match in [NSArray arrayWithArray:matches])\n            {\n                if(match.count < self.query.length)\n                {\n                    [matches removeObjectIdenticalTo:match];\n                }\n            }\n            \n            // merge ranges\n            for(NSMutableArray *match in matches)\n            {\n                NSRange lastRange = NSMakeRange(NSNotFound, 0);\n                for(NSUInteger index = 0; index < match.count; index++)\n                {\n                    NSRange range = [match[index] rangeValue];\n                    if(NSMaxRange(lastRange) == range.location)\n                    {\n                        range = NSMakeRange(lastRange.location, lastRange.length+range.length);\n                        match[index-1] = [NSValue valueWithRange:range];\n                        [match removeObjectAtIndex:index];\n                        --index;\n                    }\n                    lastRange = range;\n                }\n            }\n            \n            // remove matches for which the first matched letter is not one of the following: first letter of self.name, preceded by a char in allowedChars, preceded by lowercase and is uppercase, is uppercase and the first match group contains a lowercase letter\n            NSRange nameRange = [self.originalName rangeOfString:self.name options:NSCaseInsensitiveSearch|NSBackwardsSearch];\n            NSCharacterSet *allowedChars = [NSCharacterSet characterSetWithCharactersInString:@\".%_#-\\\\/:$@!*&+()~^=,<>'\\\"{}[]| \"];\n            for(NSMutableArray *match in [NSArray arrayWithArray:matches])\n            {\n                BOOL found = NO;\n                for(NSValue *rangeValue in match)\n                {\n                    NSRange range = [rangeValue rangeValue];\n                    if(range.location <= nameRange.location && NSMaxRange(range) >= nameRange.location+1)\n                    {\n                        found = YES;\n                        break;\n                    }\n                }\n                if(!found)\n                {\n                    BOOL shouldContinue = NO;\n                    for(NSValue *rangeValue in match)\n                    {\n                        NSRange firstRange = [rangeValue rangeValue];\n                        if(NSIntersectionRange(nameRange, firstRange).length > 0)\n                        {\n                            if(firstRange.location >= nameRange.location && firstRange.location+firstRange.length <= nameRange.location+nameRange.length && firstRange.location > 0)\n                            {\n                                NSString *previousChar = [self.originalName substringWithRange:NSMakeRange(firstRange.location-1, 1)];\n                                if([previousChar rangeOfCharacterFromSet:allowedChars].location != NSNotFound)\n                                {\n                                    shouldContinue = YES;\n                                    break;\n                                }\n                                NSString *matchedChar = [self.originalName substringWithRange:NSMakeRange(firstRange.location, 1)];\n                                BOOL matchedIsUpper = [matchedChar isUppercase];\n                                BOOL previousIsUpper = [previousChar isUppercase];\n                                if(matchedIsUpper && !previousIsUpper)\n                                {\n                                    shouldContinue = YES;\n                                    break;\n                                }\n                                if(matchedIsUpper && [[self.originalName substringWithRange:firstRange] rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]].location != NSNotFound)\n                                {\n                                    shouldContinue = YES;\n                                    break;\n                                }\n                            }\n                            break;\n                        }\n                    }\n                    if(shouldContinue)\n                    {\n                        continue;\n                    }\n                    [matches removeObjectIdenticalTo:match];\n                }\n            }\n            \n            // check if camel case\n            for(NSMutableArray *match in matches)\n            {\n                NSRange firstRange = [match[0] rangeValue];\n                NSRange lastRange = [[match lastObject] rangeValue];\n                if(firstRange.location < nameRange.location || NSMaxRange(lastRange) > NSMaxRange(nameRange))\n                {\n                    continue;\n                }\n                BOOL isCamel = YES;\n                for(NSValue *rangeValue in match)\n                {\n                    NSRange range = [rangeValue rangeValue];\n                    if(range.location == nameRange.location)\n                    {\n                        continue;\n                    }\n                    else\n                    {\n                        NSString *previousLetter = [self.originalName substringWithRange:NSMakeRange(range.location-1, 1)];\n                        if([previousLetter isEqualToString:@\" \"])\n                        {\n                            isCamel = NO;\n                            break;\n                        }\n                        NSString *myLetter = [self.originalName substringWithRange:NSMakeRange(range.location, 1)];\n                        BOOL myLetterUpper = [[myLetter uppercaseString] isEqualToString:myLetter];\n                        BOOL myLetterLower = [[myLetter lowercaseString] isEqualToString:myLetter];\n                        BOOL previousLetterUpper = [[previousLetter uppercaseString] isEqualToString:previousLetter];\n                        BOOL previousLetterLower = [[previousLetter lowercaseString] isEqualToString:previousLetter];\n                        if(!((myLetterUpper && !myLetterLower && previousLetterLower) || (!myLetterUpper && myLetterLower && previousLetterLower && previousLetterUpper)))\n                        {\n                            isCamel = NO;\n                            break;\n                        }\n                    }\n                }\n                if(isCamel)\n                {\n                    self.fuzzyCamel = YES;\n                    [self setHighlightRanges:match relativeToNameRange:nameRange];\n                    return;\n                }\n            }\n            \n            // find largest length (relative to self.name) matches\n            NSInteger largestLength = 0;;\n            NSMutableArray *largestLengthMatches = [NSMutableArray array];\n            for(NSMutableArray *match in matches)\n            {\n                NSInteger currentLength = 0;\n                for(NSValue *rangeValue in match)\n                {\n                    currentLength += NSIntersectionRange(nameRange, [rangeValue rangeValue]).length;\n                }\n                if(currentLength > largestLength)\n                {\n                    largestLength = currentLength;\n                    [largestLengthMatches removeAllObjects];\n                }\n                if(currentLength == largestLength)\n                {\n                    [largestLengthMatches addObject:match];\n                }\n            }\n            [matches removeAllObjects];\n            [matches addObjectsFromArray:largestLengthMatches];\n            \n            // find match with lowest fragmentation\n            NSInteger lowestPerceivedFragmentation = NSIntegerMax;\n            NSInteger lowestFragmentation = NSIntegerMax;\n            NSMutableArray *bestMatch = nil;\n            for(NSMutableArray *match in matches)\n            {\n                NSInteger currentFragmentation = match.count;\n                NSInteger currentPerceivedFragmentation = 0;\n                NSRange previousRange = NSMakeRange(NSNotFound, 0);\n                for(NSValue *rangeValue in match)\n                {\n                    NSRange range = [rangeValue rangeValue];\n                    if(previousRange.location != NSNotFound)\n                    {\n                        NSString *between = [self.originalName substringWithRange:NSMakeRange(NSMaxRange(previousRange), range.location-NSMaxRange(previousRange))];\n                        if([between rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]].location == NSNotFound)\n                        {\n                            --currentFragmentation;\n                            continue;\n                        }\n                    }\n                    if(range.length == 1 && [self.query length] > 2)\n                    {\n                        ++currentPerceivedFragmentation;\n                    }\n                    previousRange = range;\n                }\n                if(currentFragmentation == lowestFragmentation)\n                {\n                    if(currentPerceivedFragmentation < lowestPerceivedFragmentation)\n                    {\n                        lowestPerceivedFragmentation = currentPerceivedFragmentation;\n                        bestMatch = match;\n                    }\n                }\n                else if(currentFragmentation < lowestFragmentation)\n                {\n                    lowestFragmentation = currentFragmentation;\n                    lowestPerceivedFragmentation = currentPerceivedFragmentation;\n                    bestMatch = match;\n                }\n            }\n            BOOL isSnippet = NO; //[self isKindOfClass:[DHDBSnippetResult class]];\n            if(!isSnippet && (lowestPerceivedFragmentation > 1 || lowestFragmentation > 4 || !bestMatch))\n            {\n                self.fuzzyShouldIgnore = YES;\n            }\n            else if(bestMatch)\n            {\n                [self setHighlightRanges:bestMatch relativeToNameRange:nameRange];\n                self.fragmentation = lowestPerceivedFragmentation;\n                self.actualFragmentation = lowestFragmentation;\n                if(lowestPerceivedFragmentation <= 1 && lowestFragmentation <= 2)\n                {\n                    self.fuzzyPerfect = YES;\n                }\n                else\n                {\n                    self.fuzzy = YES;\n                }\n            }\n        }\n    }\n}\n\n- (void)setHighlightRanges:(NSMutableArray *)bestRanges relativeToNameRange:(NSRange)nameRange\n{\n    for(NSValue *rangeValue in bestRanges)\n    {\n        NSRange range = [rangeValue rangeValue];\n        NSRange intersection = NSIntersectionRange(range, nameRange);\n        if(intersection.length > 0)\n        {\n            [self.highlightRanges addObject:[NSValue valueWithRange:NSMakeRange(intersection.location-nameRange.location, intersection.length)]];\n        }\n    }\n}\n\n- (NSComparisonResult)compare:(DHDBResult *)aResult\n{\n    if(self.matchesQueryAtAll && aResult.matchesQueryAtAll)\n    {\n        if(self.whitespaceMatch && !aResult.whitespaceMatch)\n        {\n            return NSOrderedDescending;\n        }\n        else if(!self.whitespaceMatch && aResult.whitespaceMatch)\n        {\n            return NSOrderedAscending;\n        }\n    }\n    if(self.score > aResult.score)\n    {\n        return NSOrderedAscending;\n    }\n    else if(self.score < aResult.score)\n    {\n        return NSOrderedDescending;\n    }\n    if(self.queryIsPrefix && aResult.queryIsPrefix)\n    {\n        return [self levenshteinCompare:aResult];\n    }\n    if(self.queryIsSuffix && aResult.queryIsSuffix)\n    {\n        if(self.highlightRanges.count)\n        {\n            if(aResult.highlightRanges.count)\n            {\n                NSRange myFirstRange = [(self.highlightRanges)[0] rangeValue];\n                NSRange theirFirstRange = [(aResult.highlightRanges)[0] rangeValue];\n                if(myFirstRange.location < theirFirstRange.location)\n                {\n                    return NSOrderedAscending;\n                }\n                else if(myFirstRange.location > theirFirstRange.location)\n                {\n                    return NSOrderedDescending;\n                }\n                else if(self.name.length < aResult.name.length)\n                {\n                    return NSOrderedAscending;\n                }\n                else if(self.name.length > aResult.name.length)\n                {\n                    return NSOrderedDescending;\n                }\n                else\n                {\n                    return [self.name localizedCaseInsensitiveCompare:[aResult name]];\n                }\n            }\n            else\n            {\n                return NSOrderedAscending;\n            }\n        }\n        return [self levenshteinCompare:aResult];\n    }\n    else\n    {\n        if(self.matchesQueryAtAll)\n        {\n            if(aResult.matchesQueryAtAll)\n            {\n                return [self.name localizedCaseInsensitiveCompare:[aResult name]];\n            }\n            else\n            {\n                return NSOrderedAscending;\n            }\n        }\n        else if(aResult.matchesQueryAtAll)\n        {\n            return NSOrderedDescending;\n        }\n    }\n    return [self.name localizedCaseInsensitiveCompare:[aResult name]];\n}\n\n- (NSComparisonResult)levenshteinCompare:(DHDBResult *)aResult\n{\n    if(self.matchesQueryAtAll && aResult.matchesQueryAtAll)\n    {\n        if(self.whitespaceMatch && !aResult.whitespaceMatch)\n        {\n            return NSOrderedDescending;\n        }\n        else if(!self.whitespaceMatch && aResult.whitespaceMatch)\n        {\n            return NSOrderedAscending;\n        }\n    }\n    float myDistance = [self levenshteinDistance];\n    float theirDistance = [aResult levenshteinDistance];\n    if(myDistance < theirDistance)\n    {\n        return NSOrderedAscending;\n    }\n    else if(myDistance == theirDistance)\n    {\n        return [self.name localizedCaseInsensitiveCompare:[aResult name]];\n    }\n    else\n    {\n        return NSOrderedDescending;\n    }\n}\n\n- (float)levenshteinDistance\n{\n    if(self.distanceFromQuery != nil)\n    {\n        return [self.distanceFromQuery floatValue];\n    }\n    float distance = [self.name distanceFromString:self.query];\n    self.distanceFromQuery = @(distance);\n    return distance;\n}\n\n- (NSComparisonResult)compareFuziness:(DHDBResult *)aResult\n{\n    if(self.fragmentation == -1 || aResult.fragmentation == -1)\n    {\n        NSInteger resultSortOrder = [self compareResultSortOrder:aResult];\n        if(resultSortOrder != NSOrderedSame)\n        {\n            return resultSortOrder;\n        }\n        return [self compare:aResult];\n    }\n    if(self.highlightRanges.count > aResult.highlightRanges.count)\n    {\n        return NSOrderedDescending;\n    }\n    else if(self.highlightRanges.count < aResult.highlightRanges.count)\n    {\n        return NSOrderedAscending;\n    }\n    else\n    {\n        NSInteger resultSortOrder = [self compareResultSortOrder:aResult];\n        if(resultSortOrder != NSOrderedSame)\n        {\n            return resultSortOrder;\n        }\n        if(self.score > aResult.score)\n        {\n            return NSOrderedAscending;\n        }\n        else if(self.score < aResult.score)\n        {\n            return NSOrderedDescending;\n        }\n        return [self levenshteinCompare:aResult];\n    }\n}\n\n- (NSComparisonResult)compareResultSortOrder:(DHDBResult *)aResult\n{\n    DHDBResultSorter *sorter = [DHDBResultSorter sharedSorter];\n    NSInteger myRank = [sorter rankForResult:self];\n    NSInteger otherRank = [sorter rankForResult:aResult];\n    if(myRank < otherRank)\n    {\n        return NSOrderedDescending;\n    }\n    else if(myRank > otherRank)\n    {\n        return NSOrderedAscending;\n    }\n    return NSOrderedSame;\n}\n\n- (NSString *)sortType\n{\n    if(self.isPHP && [self.type isEqualToString:@\"Function\"])\n    {\n        return @\"Class\";\n    }\n    else if(self.isRust && [self.type isEqualToString:@\"_Struct\"])\n    {\n        return @\"Class\";\n    }\n    else if(self.isSwift && [self.type isEqualToString:@\"Type\"])\n    {\n        return @\"Class\";\n    }\n    else if(self.isGo && [self.type isEqualToString:@\"Type\"])\n    {\n        return @\"Class\";\n    }\n    else if(self.isApple && self.linkIsSwift && [self.type isEqualToString:@\"Struct\"] && [self.path contains:@\"/Swift/Reference/\"])\n    {\n        return @\"Class\";\n    }\n    return self.type;\n}\n\n+ (NSSet *)commonDeclaredInStylePlatforms\n{\n    if(!commonDeclaredInStylePlatforms)\n    {\n        commonDeclaredInStylePlatforms = [NSSet setWithObjects:@\"apache\", @\"python\", @\"zepto\", @\"cvp\", @\"cvc\", @\"mongodb\", @\"cvcpp\", @\"vagrant\", @\"cf\", @\"ansible\", @\"ocaml\", @\"twig\", @\"smarty\", @\"chef\", @\"php\", @\"express\", @\"bash\", @\"swift\", @\"extjs\", @\"titanium\", @\"sencha\", @\"markdown\", @\"latex\", @\"bourbon\", @\"cmake\", @\"awesome\", @\"jade\", @\"SproutCore\", @\"neat\", @\"moment\", @\"elasticsearch\", @\"xojo\", @\"lodash\", @\"statamic\", @\"drupal\", @\"phonegap\", @\"cordova\", @\"laravel\", @\"compass\", @\"haml\", @\"sass\", @\"bootstrap\", @\"ember\", @\"jasmine\", @\"perl\", @\"jquerym\", @\"jQuery\", @\"css\", @\"dartlang\", @\"phpunit\", @\"polymerdart\", @\"angulardart\", @\"xul\", @\"xslt\", @\"javascript\", @\"arduino\",  @\"angularjs\", @\"emmet\", @\"chai\", @\"mongoose\", @\"react\", @\"grunt\", @\"sooffline\", @\"soonline\", @\"rust\", @\"flask\", @\"numpy\", @\"pandas\",  @\"sqlalchemy\", @\"tornado\", @\"matplotlib\", @\"salt\", @\"jinja\", @\"require\", @\"scipy\", @\"go\", @\"godoc\", @\"prototype\", @\"puppet\", @\"stylus\", @\"sinon\", @\"gl2\", @\"gl3\", @\"gl4\", @\"jqueryui\", @\"underscore\", @\"backbone\", @\"marionette\", @\"coffee\", @\"yii\", @\"mono\", @\"xamarin\", @\"yui\", @\"tcl\", @\"erlang\", @\"vsphere\", @\"twisted\", @\"phpp\", @\"joomla\", @\"symfony\", @\"cakephp\", @\"scala\", @\"scaladoc\", @\"playscala\", @\"akka\", @\"sqlite\", @\"boost\", @\"unity3d\", @\"django\", @\"cpp\", @\"c\", @\"qt\", @\"rails\", @\"codeigniter\", @\"yard\", @\"ruby\", @\"awsjs\", @\"rubyGems\",  @\"foundation\", @\"lua\", @\"dojo\", @\"elixir\", @\"knockout\", @\"meteor\", nil];\n    }\n    return commonDeclaredInStylePlatforms;\n}\n\n+ (NSDictionary *)highlightDictionary\n{\n    if(!highlightDictionary)\n    {\n        highlightDictionary = @{NSForegroundColorAttributeName: [[DHAppDelegate sharedDelegate].window.rootViewController.view.tintColor colorWithAlphaComponent:0.8]};\n    }\n    return highlightDictionary;\n}\n\n- (NSUInteger)indexOfActiveItem\n{\n    if([self isActive])\n    {\n        return 0;\n    }\n    else\n    {\n        int index = 1;\n        for(DHDBResult *result in self.similarResults)\n        {\n            if([result isActive])\n            {\n                return index;\n            }\n            ++index;\n        }\n    }\n    [self setIsActive:YES];\n    return 0;\n}\n\n- (void)setActiveItemByIndex:(NSUInteger)index\n{\n    self.isActive = (index == 0) ? YES : NO;\n    int i = 1;\n    for(DHDBResult *result in self.similarResults)\n    {\n        result.isActive = (i == index) ? YES : NO;\n        ++i;\n    }\n}\n\n- (DHDBResult *)activeResult\n{\n    if(self.isActive)\n    {\n        return self;\n    }\n    for(DHDBResult *result in self.similarResults)\n    {\n        if(result.isActive)\n        {\n            return result;\n        }\n    }\n    return self;\n}\n\n- (NSString *)webViewURL\n{\n    NSString *fullPath = nil;\n    if(self.isRemote)\n    {\n        if(self.remoteResultURL)\n        {\n            fullPath = self.remoteResultURL;\n        }\n        return fullPath;\n    }\n    fullPath = self.fullPath;\n    NSInteger currentLanguage = [DHAppleActiveLanguage currentLanguage];\n    if(fullPath.length && [self.platform isEqualToString:@\"apple\"] && currentLanguage != self.appleLanguage)\n    {\n        if(currentLanguage == DHNewActiveAppleLanguageObjC && self.appleObjCPath.length)\n        {\n            return [@\"file://\" stringByAppendingString:[[self.docset.path stringByAppendingPathComponent:@\"Contents/Resources/Documents\"] stringByAppendingPathComponent:self.appleObjCPath]];\n        }\n        else if(currentLanguage == DHNewActiveAppleLanguageSwift && self.appleSwiftPath.length)\n        {\n            return [@\"file://\" stringByAppendingString:[[self.docset.path stringByAppendingPathComponent:@\"Contents/Resources/Documents\"] stringByAppendingPathComponent:self.appleSwiftPath]];\n        }\n        NSString *delimiter = self.docset.plist[@\"DashDocSetAppleObjCDelimiter\"];\n        NSString *delimiterWithExtension = [delimiter stringByAppendingString:@\".html\"];\n        if(delimiter.length)\n        {\n            NSString *currentPath = [[fullPath substringFromStringReturningNil:@\"://\"] substringToString:@\"#\"];\n            if(currentLanguage == DHNewActiveAppleLanguageObjC && ![currentPath contains:delimiterWithExtension] && [[NSFileManager defaultManager] fileExistsAtPathOrInIndex:[[currentPath stringByDeletingPathExtension] stringByAppendingString:delimiterWithExtension]])\n            {\n                NSString *currentAnchor = [fullPath substringFromLastOccurrenceOfStringReturningNil:@\"#\"];\n                NSString *newPath = [fullPath substringToLastOccurrenceOfString:@\"#\"];\n                NSRange extensionRange = [newPath rangeOfString:@\".html\" options:NSCaseInsensitiveSearch|NSBackwardsSearch];\n                if(extensionRange.location != NSNotFound)\n                {\n                    newPath = [newPath stringByReplacingCharactersInRange:extensionRange withString:delimiterWithExtension];\n                    if(currentAnchor.length)\n                    {\n                        newPath = [newPath stringByAppendingFormat:@\"#%@\", currentAnchor];\n                    }\n                    return newPath;\n                }\n            }\n            if(currentLanguage == DHNewActiveAppleLanguageSwift && [currentPath contains:delimiterWithExtension] && [[NSFileManager defaultManager] fileExistsAtPathOrInIndex:[currentPath stringByReplacingOccurrencesOfString:delimiterWithExtension withString:@\".html\"]])\n            {\n                return [fullPath stringByReplacingOccurrencesOfString:delimiterWithExtension withString:@\".html\"];\n            }\n        }\n\n    }\n    return fullPath;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDBResultSorter.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@class DHDBResult;\n\n@interface DHDBResultSorter : NSObject\n\n@property (retain) NSMutableDictionary *ranks;\n@property (retain) NSString *lastIncreasedIdentifier;\n@property (retain) NSTimer *rankIncreaseTimer;\n@property (assign) CGPoint visiblePoint;\n\n+ (DHDBResultSorter *)sharedSorter;\n- (NSInteger)rankForResult:(DHDBResult *)aResult;\n- (void)resultWasSelected:(DHDBResult *)aResult inTableView:(UITableView *)tableView;\n- (void)saveDefaults:(NSMutableDictionary *)entries;\n\n@end\n"
  },
  {
    "path": "Dash/DHDBResultSorter.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDBResultSorter.h\"\n#import \"DHDBResult.h\"\n#import \"DHAppDelegate.h\"\n\n@implementation DHDBResultSorter\n\n+ (DHDBResultSorter *)sharedSorter\n{\n    static dispatch_once_t pred;\n    static DHDBResultSorter *_resultSorter = nil;\n    \n    dispatch_once(&pred, ^{\n        _resultSorter = [[DHDBResultSorter alloc] init];\n        [_resultSorter setUp];\n    });\n    return _resultSorter;\n}\n\n- (void)setUp\n{\n    self.ranks = [[[NSUserDefaults standardUserDefaults] objectForKey:@\"resultSortRanks\"] mutableCopy];\n    if(!self.ranks)\n    {\n        self.ranks = [NSMutableDictionary dictionary];\n    }\n}\n\n- (void)resultWasSelected:(DHDBResult *)aResult inTableView:(UITableView *)tableView\n{\n    if(aResult.isRemote)\n    {\n        return;\n    }\n    if(!isRegularHorizontalClass)\n    {\n        [self increaseRankNow:aResult];\n        return;\n    }\n    if([self.rankIncreaseTimer isValid])\n    {\n        [self.rankIncreaseTimer invalidate];\n        self.rankIncreaseTimer = nil;\n    }\n    self.visiblePoint = tableView.contentOffset;\n    self.rankIncreaseTimer = [NSTimer scheduledTimerWithTimeInterval:6.0f target:self selector:@selector(increaseRankForResult:) userInfo:@[aResult, tableView] repeats:NO];\n}\n\n- (void)increaseRankForResult:(NSTimer *)timer\n{\n    DHDBResult *aResult = [timer userInfo][0];\n    if(aResult.isRemote)\n    {\n        return;\n    }\n    UITableView *tableView = [timer userInfo][1];\n    if(tableView.window && !tableView.isHidden && CGPointEqualToPoint(self.visiblePoint, tableView.contentOffset))\n    {\n        [self increaseRankNow:aResult];\n    }\n}\n\n- (void)increaseRankNow:(DHDBResult *)aResult\n{\n    if(aResult.isRemote)\n    {\n        return;\n    }\n    NSString *identifier = [self identifierForResult:aResult];\n    if(!identifier || !identifier.length || (self.lastIncreasedIdentifier && [identifier isEqualToString:self.lastIncreasedIdentifier]))\n    {\n        return;\n    }\n    self.lastIncreasedIdentifier = identifier;\n    NSMutableDictionary *ranks = self.ranks;\n    if(ranks.count > 1000)\n    {\n        [self purgeDictionary:ranks];\n    }\n    NSNumber *rankNumber = ranks[identifier];\n    NSInteger rank = 0;\n    if(rankNumber)\n    {\n        rank = [rankNumber integerValue];\n    }\n    ++rank;\n    ranks[identifier] = @(rank);\n    [self saveDefaults:ranks];\n}\n\n- (NSInteger)rankForResult:(DHDBResult *)aResult\n{\n    NSNumber *rank = (self.ranks)[[self identifierForResult:aResult]];\n    if(rank)\n    {\n        return [rank integerValue];\n    }\n    return 0;\n}\n\n- (NSString *)identifierForResult:(DHDBResult *)aResult\n{\n    return [[aResult name] stringByAppendingFormat:@\" - %@\", aResult.type];\n}\n\n- (void)saveDefaults:(NSMutableDictionary *)entries\n{\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    [defaults setObject:entries forKey:@\"resultSortRanks\"];\n}\n\n- (void)purgeDictionary:(NSMutableDictionary *)ranks\n{\n    NSInteger threshold = 0;\n    while(ranks.count > 500)\n    {\n        ++threshold;\n        @autoreleasepool {\n            NSMutableArray *ranksToRemove = [NSMutableArray array];\n            [ranks enumerateKeysAndObjectsUsingBlock:^(id rankKey, id rank, BOOL *stop) {\n                if([rank integerValue] <= threshold)\n                {\n                    [ranksToRemove addObject:rankKey];\n                }\n            }];\n            [ranks removeObjectsForKeys:ranksToRemove];\n        }\n    }\n    for(NSString *rank in [ranks allKeys])\n    {\n        ranks[rank] = @([ranks[rank] integerValue]-threshold);\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDBSearchController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHDBSearcher.h\"\n\n@interface DHDBSearchController : NSObject <UISearchDisplayDelegate, UITableViewDataSource, UITableViewDelegate, DHDBSearcherDelegate>\n\n@property (assign) BOOL loading;\n@property (retain) NSArray *docsets;\n@property (retain) NSString *typeLimit;\n@property (retain) NSMutableArray *results;\n@property (retain) NSMutableArray *nextResults;\n@property (weak) UISearchDisplayController *displayController;\n@property (weak) UIViewController *viewController;\n@property (retain) DHDBSearcher *searcher;\n@property (retain) NSString *viewControllerTitle;\n@property (assign) BOOL isRestoring;\n\n+ (DHDBSearchController *)searchControllerWithDocsets:(NSArray *)docsets typeLimit:(NSString *)typeLimit viewController:(UIViewController *)viewController;\n- (void)viewWillAppear;\n- (void)viewDidAppear;\n- (void)viewDidDisappear;\n- (void)viewWillDisappear;\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;\n- (void)hookToSearchDisplayController:(UISearchDisplayController *)displayController;\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder;\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder;\n\n@end\n"
  },
  {
    "path": "Dash/DHDBSearchController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDBSearchController.h\"\n#import \"DHBrowserTableViewCell.h\"\n#import \"DHDBResult.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHDocsetBrowser.h\"\n#import \"DHNestedViewController.h\"\n\n@implementation DHDBSearchController\n\n+ (DHDBSearchController *)searchControllerWithDocsets:(NSArray *)docsets typeLimit:(NSString *)typeLimit viewController:(UIViewController *)viewController;\n{\n    DHDBSearchController *controller = [[DHDBSearchController alloc] init];\n    controller.docsets = docsets;\n    controller.typeLimit = typeLimit;\n    controller.viewController = viewController;\n    controller.displayController = viewController.searchDisplayController;\n    controller.displayController.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;\n    [controller hookToSearchDisplayController:viewController.searchDisplayController];\n    [[NSNotificationCenter defaultCenter] addObserver:controller selector:@selector(traitCollectionDidChange:) name:DHWindowChangedTraitCollection object:nil];\n    return controller;\n}\n\n- (void)viewWillAppear\n{\n    if(self.displayController.active)\n    {\n        \n    }\n}\n\n- (void)viewDidAppear\n{\n    if(self.displayController.active)\n    {\n\n    }\n}\n\n- (void)viewWillDisappear\n{\n    if(self.displayController.active)\n    {\n    \n    }\n}\n\n- (void)viewDidDisappear\n{\n    if(self.displayController.active)\n    {\n\n    }\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(self.results.count && !self.loading)\n    {\n        [self.displayController.searchResultsTableView reloadData];\n    }\n}\n\n- (void)hookToSearchDisplayController:(UISearchDisplayController *)displayController\n{\n    displayController.delegate = self;\n    displayController.searchResultsDataSource = self;\n    displayController.searchResultsDelegate = self;\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView\n{\n    self.loading = YES;\n    tableView.allowsSelection = NO;\n    if(isIOS11)\n    {\n        if(@available(iOS 11.0, *))\n        {\n            tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;\n        }\n    }\n    [tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    [tableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n}\n\n- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller\n{\n    if([self.viewController respondsToSelector:@selector(searchDisplayControllerWillBeginSearch:)])\n    {\n        [(id)self.viewController searchDisplayControllerWillBeginSearch:controller];\n    }\n    self.loading = YES;\n    self.displayController.searchResultsTableView.allowsSelection = NO;\n    [self.displayController.searchResultsTableView reloadData];\n}\n\n- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller\n{\n    if([self.viewController respondsToSelector:@selector(searchDisplayControllerDidBeginSearch:)])\n    {\n        [(id)self.viewController searchDisplayControllerDidBeginSearch:controller];\n    }\n    self.viewControllerTitle = self.viewController.navigationItem.title;\n    self.viewController.navigationItem.title = @\"Search\";\n}\n\n- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller\n{\n    if([self.viewController respondsToSelector:@selector(searchDisplayControllerWillEndSearch:)])\n    {\n        [(id)self.viewController searchDisplayControllerWillEndSearch:controller];\n    }\n    self.viewController.navigationItem.title = self.viewControllerTitle;\n    [self.searcher cancelSearch];\n    self.searcher = nil;\n}\n\n- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller\n{\n    if([self.viewController respondsToSelector:@selector(searchDisplayControllerDidEndSearch:)])\n    {\n        [(id)self.viewController searchDisplayControllerDidEndSearch:controller];\n    }\n}\n\n- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString\n{\n    if(self.isRestoring)\n    {\n        self.displayController.searchResultsTableView.allowsSelection = YES;\n        self.loading = NO;\n        return YES;\n    }\n    [self.searcher cancelSearch];\n    self.nextResults = [NSMutableArray array];\n    BOOL wasEmpty = searchString.length <= 0;\n    searchString = [searchString stringByRemovingWhitespaces];\n    if(searchString.length)\n    {\n        self.searcher = [DHDBSearcher searcherWithDocsets:(self.docsets) ? self.docsets : [(id)self.viewController shownDocsets] query:searchString limitToType:self.typeLimit delegate:self];\n    }\n    else\n    {\n        self.results = [NSMutableArray array];\n        if(wasEmpty)\n        {\n            self.loading = YES;\n            self.displayController.searchResultsTableView.allowsSelection = NO;\n        }\n        else\n        {\n            self.loading = NO;\n            self.displayController.searchResultsTableView.allowsSelection = YES;\n        }\n        return YES;\n    }\n    return NO;\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller willShowSearchResultsTableView:(UITableView *)tableView\n{\n    if([self.viewController isKindOfClass:[UITableViewController class]])\n    {\n        [(UITableViewController*)self.viewController tableView].separatorStyle = UITableViewCellSeparatorStyleNone;\n    }\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView\n{\n    if([self.viewController isKindOfClass:[UITableViewController class]])\n    {\n        [(UITableViewController*)self.viewController tableView].separatorStyle = UITableViewCellSeparatorStyleSingleLine;\n    }\n    [self.searcher cancelSearch];\n    self.searcher = nil;\n}\n\n- (void)searcher:(DHDBSearcher *)searcher foundResults:(NSArray *)results hasMore:(BOOL)hasMore\n{\n    if(searcher == self.searcher)\n    {\n        NSInteger previousSelection = self.displayController.searchResultsTableView.indexPathForSelectedRow.row;\n        BOOL isFirst = self.nextResults.count == 0;\n        self.loading = NO;\n        self.displayController.searchResultsTableView.allowsSelection = YES;\n        [self.nextResults addObjectsFromArray:results];\n        self.results = self.nextResults;\n        [self.displayController.searchResultsTableView reloadData];\n        if(isFirst && isRegularHorizontalClass && self.nextResults.count)\n        {\n            [self.displayController.searchResultsTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];\n            DHDBResult *firstResult = self.results[0];\n            [[DHDBResultSorter sharedSorter] resultWasSelected:firstResult inTableView:self.displayController.searchResultsTableView];\n            [[DHWebViewController sharedWebViewController] loadResult:firstResult];\n        }\n        else if(isRegularHorizontalClass && !isFirst && self.results.count)\n        {\n            [self.displayController.searchResultsTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:previousSelection inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];\n        }\n        if(!hasMore)\n        {\n            self.nextResults = nil;\n        }\n    }\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHNestedSegue\"])\n    {\n        DHNestedViewController *nestedController = [segue destinationViewController];\n        DHDBResult *result = self.results[self.displayController.searchResultsTableView.indexPathForSelectedRow.row];\n        nestedController.result = result;\n    }\n    else if([[segue identifier] isEqualToString:@\"DHSearchWebViewSegue\"])\n    {\n        DHWebViewController *webViewController = [segue destinationViewController];\n        DHDBResult *result = self.results[self.displayController.searchResultsTableView.indexPathForSelectedRow.row];\n        webViewController.result = result;\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(tableView.indexPathForSelectedRow.row < self.results.count)\n    {\n        DHDBResult *result = self.results[tableView.indexPathForSelectedRow.row];\n        if(result.similarResults.count)\n        {\n            if(isRegularHorizontalClass)\n            {\n                [[DHWebViewController sharedWebViewController] loadResult:[result activeResult]];\n            }\n            [self.viewController performSegueWithIdentifier:@\"DHNestedSegue\" sender:self];\n        }\n        else\n        {\n            [[DHDBResultSorter sharedSorter] resultWasSelected:result inTableView:tableView];\n            if(isRegularHorizontalClass)\n            {\n                [[DHWebViewController sharedWebViewController] loadResult:result];\n            }\n            else\n            {\n                [[DHWebViewController sharedWebViewController] loadResult:result];\n                [self.viewController performSegueWithIdentifier:@\"DHSearchWebViewSegue\" sender:self];\n            }\n        }\n    }\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    if(self.loading)\n    {\n        return 3;\n    }\n    return self.results.count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(self.loading)\n    {\n        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHLoadingCell\" forIndexPath:indexPath];\n        cell.userInteractionEnabled = NO;\n        if(indexPath.row == 2)\n        {\n            NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n            [paragraph setAlignment:NSTextAlignmentCenter];\n            UIFont *font = [UIFont boldSystemFontOfSize:20];\n            cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:@\"Searching...\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n        }\n        else\n        {\n            cell.textLabel.text = @\"\";\n        }\n        return cell;\n    }\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHBrowserCell\" forIndexPath:indexPath];\n\n    DHDBResult *result = (indexPath.row) < self.results.count ? self.results[indexPath.row] : nil;\n    [cell makeEntryCell];\n    cell.textLabel.attributedText = nil;\n    cell.textLabel.font = [UIFont fontWithName:@\"Menlo\" size:16];\n    cell.textLabel.text = result.name;\n    cell.typeImageView.image = result.typeImage;\n    cell.platformImageView.image = result.platformImage;\n    [self highlightCell:cell result:result];\n    [cell.titleLabel setRightDetailText:(result.similarResults.count) ? [NSString stringWithFormat:@\"%ld\", (unsigned long)result.similarResults.count+1] : @\"\" adjustMainWidth:YES];\n    cell.accessoryType = (result.similarResults.count || !isRegularHorizontalClass) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;\n    return cell;\n}\n\n- (void)highlightCell:(DHBrowserTableViewCell *)cell result:(DHDBResult *)result\n{\n    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:cell.textLabel.attributedText];\n    BOOL didAddAttributes = NO;\n    for(NSString *key in [DHDBResult highlightDictionary])\n    {\n        [string removeAttribute:key range:NSMakeRange(0, string.length)];\n    }\n    for(NSValue *highlightRangeValue in result.highlightRanges)\n    {\n        NSRange highlightRange = [highlightRangeValue rangeValue];\n        [string addAttributes:[DHDBResult highlightDictionary] range:highlightRange];\n        didAddAttributes = YES;\n    }\n    if(didAddAttributes)\n    {\n        cell.textLabel.attributedText = string;\n    }\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [coder encodeBool:self.displayController.isActive forKey:@\"searchIsActive\"];\n    if(self.displayController.isActive)\n    {\n        [coder encodeObject:[self.displayController.searchBar text] forKey:@\"searchBarText\"];\n        if(self.results)\n        {\n            [coder encodeObject:self.results forKey:@\"searchResults\"];\n        }\n        NSIndexPath *selectedIndexPath = [self.displayController.searchResultsTableView indexPathForSelectedRow];\n        if(selectedIndexPath)\n        {\n            [coder encodeObject:selectedIndexPath forKey:@\"selectedIndexPath\"];\n        }\n        BOOL isFirstResponder = [self.displayController.searchBar isFirstResponder];\n        [coder encodeBool:isFirstResponder forKey:@\"isFirstResponder\"];\n        [coder encodeCGPoint:self.displayController.searchResultsTableView.contentOffset forKey:@\"scrollPoint\"];\n    }\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    BOOL isActive = [coder decodeBoolForKey:@\"searchIsActive\"];\n    if(isActive)\n    {\n        self.isRestoring = YES;\n        self.results = [coder decodeObjectForKey:@\"searchResults\"];\n        NSString *searchBarText = [coder decodeObjectForKey:@\"searchBarText\"];\n        NSIndexPath *selectedIndexPath = [coder decodeObjectForKey:@\"selectedIndexPath\"];\n        BOOL isFirstResponder = [coder decodeBoolForKey:@\"isFirstResponder\"];\n        CGPoint scrollPoint = [coder decodeCGPointForKey:@\"scrollPoint\"];\n        \n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((isRegularHorizontalClass) ? 0.5 * NSEC_PER_SEC : 0)), dispatch_get_main_queue(), ^{\n            [self.displayController setActive:YES animated:isRegularHorizontalClass];\n            if(searchBarText)\n            {\n                [self.displayController.searchBar setText:searchBarText];\n            }\n            if(selectedIndexPath)\n            {\n                [self.displayController.searchResultsTableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n            }\n            if(isFirstResponder)\n            {\n                [self.displayController.searchBar becomeFirstResponder];\n            }\n            self.displayController.searchResultsTableView.contentOffset = scrollPoint;\n            self.isRestoring = NO;\n        });\n    }\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n    [self.searcher cancelSearch];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDBSearcher.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@protocol DHDBSearcherDelegate;\n@interface DHDBSearcher : NSObject\n\n@property (retain) NSThread *currentThread;\n@property (retain) NSString *query;\n@property (retain) NSArray *docsets;\n@property (weak) id<DHDBSearcherDelegate> delegate;\n@property (retain) NSString *typeLimit;\n\n+ (DHDBSearcher *)searcherWithDocsets:(NSArray *)docsets query:(NSString *)query limitToType:(NSString *)typeLimit delegate:(id<DHDBSearcherDelegate>)delegate;\n- (void)cancelSearch;\n+ (void)checkForInterrupt;\n\n@end\n\n\n\n\n@protocol DHDBSearcherDelegate <NSObject>\n\n- (void)searcher:(DHDBSearcher *)searcher foundResults:(NSArray *)results hasMore:(BOOL)hasMore;\n\n@end\n\n"
  },
  {
    "path": "Dash/DHDBSearcher.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDBSearcher.h\"\n#import \"DHQueuedDB.h\"\n#import \"DHTypes.h\"\n#import \"DHDBNestedResultSorter.h\"\n\n@implementation DHDBSearcher\n\n+ (DHDBSearcher *)searcherWithDocsets:(NSArray *)docsets query:(NSString *)query limitToType:(NSString *)typeLimit delegate:(id<DHDBSearcherDelegate>)delegate\n{\n    DHDBSearcher *searcher = [[DHDBSearcher alloc] init];\n    searcher.query = [query copy];\n    searcher.docsets = [NSArray arrayWithArray:docsets];\n    searcher.typeLimit = typeLimit;\n    searcher.delegate = delegate;\n    searcher.currentThread = [[NSThread alloc] initWithTarget:searcher selector:@selector(doSearchThread) object:nil];\n    [searcher.currentThread setThreadPriority:1.0f];\n    [searcher.currentThread start];\n    return searcher;\n}\n\n- (void)doSearchThread\n{\n    @autoreleasepool {\n        NSMutableArray *queue = [NSMutableArray array];\n        NSMutableArray *fuzzyQueue = [NSMutableArray array];\n        NSConditionLock *stepLock = [DHDocset stepLock];\n        @try {\n            for(DHDocset *docset in self.docsets)\n            {\n                DHQueuedDB *db = [DHQueuedDB queueWithDocset:docset query:self.query typeLimit:self.typeLimit isFuzzy:NO];\n                if(db)\n                {\n                    [queue addObject:db];\n                }\n                DHQueuedDB *fuzzyDB = [DHQueuedDB queueWithDocset:docset query:self.query typeLimit:self.typeLimit isFuzzy:YES];\n                if(fuzzyDB)\n                {\n                    [fuzzyQueue addObject:fuzzyDB];\n                }\n            }\n            NSMutableArray *results = nil;\n            NSMutableArray *perfect = [NSMutableArray array];\n            NSMutableArray *perfectOriginal = [NSMutableArray array];\n            NSMutableArray *startsWith = [NSMutableArray array];\n            NSMutableArray *startsWithOriginal = [NSMutableArray array];\n            NSMutableArray *endsWith = [NSMutableArray array];\n            NSMutableArray *endsWithOriginal = [NSMutableArray array];\n            NSMutableArray *matches = [NSMutableArray array];\n            NSMutableArray *originalMatches = [NSMutableArray array];\n            NSMutableArray *fuzzyCamel = [NSMutableArray array];\n            NSMutableArray *fuzzyPerfect = [NSMutableArray array];\n            NSMutableArray *fuzzy = [NSMutableArray array];\n            NSMutableArray *noMatch = [NSMutableArray array];\n            NSMutableArray *allResults = [NSMutableArray array];\n            NSMutableSet *duplicates = [NSMutableSet set];\n\n            BOOL unifiedPerfectPhase = YES;\n            BOOL unifiedPrefixPhase = NO;\n            BOOL unifiedSuffixPhase = NO;\n            BOOL unifiedContainsPhase = NO;\n            BOOL fuzzyPhase = NO;\n            BOOL shouldBreak = NO;\n            BOOL didSendResultsOnce = NO;\n            \n            NSInteger count = 0;\n            NSInteger maxLimit = 200; // you need to change this in DHUnifiedQueuedDB as well\n            \n            NSMutableArray *processingQueues = [NSMutableArray arrayWithArray:queue];\n            while(YES)\n            {\n                if((unifiedPerfectPhase || unifiedPrefixPhase || unifiedSuffixPhase || (unifiedContainsPhase && count < maxLimit) || (fuzzyPhase)) && processingQueues.count)\n                {\n                    NSMutableArray *stepQueue = [NSMutableArray arrayWithArray:processingQueues];\n                    for(int i=0; i < stepQueue.count; i++)\n                    {\n                        [DHDBSearcher checkForInterrupt];\n                        DHQueuedDB *queuedDB = stepQueue[i];\n                        if(![queuedDB step])\n                        {\n                            NSInteger index = [processingQueues indexOfObjectIdenticalTo:queuedDB];\n                            if(index != NSNotFound)\n                            {\n                                [processingQueues removeObjectAtIndex:index];\n                            }\n                            [stepQueue removeObjectAtIndex:i];\n                            --i;\n                        }\n                    }\n                    NSInteger innerCount = 0;\n                    while((unifiedPerfectPhase || (unifiedSuffixPhase && count <= maxLimit*2) || (unifiedPrefixPhase && count <= maxLimit) || (unifiedContainsPhase && count <= maxLimit) || (fuzzyPhase && innerCount <= maxLimit/2)) && stepQueue.count)\n                    {\n                        for(int i=0; i < stepQueue.count; i++)\n                        {\n                            DHQueuedDB *queuedDB = stepQueue[i];\n                            if([queuedDB next])\n                            {\n                                DHDBResult *result = [queuedDB currentDBResult];\n                                if(fuzzyPhase && result.whitespaceMatch)\n                                {\n                                    result = nil;\n                                }\n                                NSString *duplicateHash = [result duplicateHash];\n                                if(duplicateHash)\n                                {\n                                    if([duplicates containsObject:duplicateHash])\n                                    {\n                                        continue;\n                                    }\n                                    [duplicates addObject:duplicateHash];\n                                }\n                                [DHDBSearcher checkForInterrupt];\n                                if(result)\n                                {\n                                    [queuedDB addResultToResultDictionary:result];\n                                    ++count;\n                                    ++innerCount;\n                                }\n                            }\n                            else\n                            {\n                                [stepQueue removeObjectAtIndex:i];\n                                [DHDBSearcher checkForInterrupt];\n                                --i;\n                            }\n                        }\n                    }\n                }\n                else\n                {\n                    shouldBreak = YES;\n                }\n                \n                if((fuzzyPhase && shouldBreak) || unifiedContainsPhase)\n                {\n                    for(DHQueuedDB *queueDB in queue)\n                    {\n                        [queueDB sortResultDictionary];\n                    }\n                    NSArray *types = [[DHTypes sharedTypes] orderedTypes];\n                    if(self.typeLimit)\n                    {\n                        types = @[self.typeLimit];\n                    }\n                    NSArray *fuzzyCamelBackUp = [NSArray arrayWithArray:fuzzyCamel];\n                    NSArray *fuzzyPerfectBackUp = [NSArray arrayWithArray:fuzzyPerfect];\n                    NSArray *fuzzyBackUp = [NSArray arrayWithArray:fuzzy];\n                    NSArray *noMatchBackUp = [NSArray arrayWithArray:noMatch];\n                    [fuzzyCamel removeAllObjects];\n                    [fuzzyPerfect removeAllObjects];\n                    [fuzzy removeAllObjects];\n                    [noMatch removeAllObjects];\n                    \n                    // Step 3: Order results based on priority and order similar results\n                    for(NSString *type in types)\n                    {\n                        [DHDBSearcher checkForInterrupt];\n                        for(DHQueuedDB *queueDB in queue)\n                        {\n                            for(DHDBResult *result in [queueDB resultsForType:type])\n                            {\n                                [DHDBSearcher checkForInterrupt];\n                                NSInteger similar = [allResults indexOfObject:result];\n                                if(similar != NSNotFound)\n                                {\n                                    if(!result.isSO)\n                                    {\n                                        [[allResults[similar] similarResults] addObject:result];\n                                    }\n                                }\n                                else\n                                {\n                                    if(result.perfectMatch)\n                                    {\n                                        [perfect addObject:result];\n                                    }\n                                    else if(result.perfectMatchOriginal)\n                                    {\n                                        [perfectOriginal addObject:result];\n                                    }\n                                    else if(result.queryIsPrefix)\n                                    {\n                                        [startsWith addObject:result];\n                                    }\n                                    else if(result.queryIsSuffix)\n                                    {\n                                        [endsWith addObject:result];\n                                    }\n                                    else if(result.matchesQueryAtAll)\n                                    {\n                                        [matches addObject:result];\n                                    }\n                                    else if(result.queryIsPrefixOfOriginal)\n                                    {\n                                        [startsWithOriginal addObject:result];\n                                    }\n                                    else if(result.queryIsSuffixOfOriginal)\n                                    {\n                                        [endsWithOriginal addObject:result];\n                                    }\n                                    else if(result.originalMatchesQueryAtAll)\n                                    {\n                                        [originalMatches addObject:result];\n                                    }\n                                    else if(result.fuzzyCamel)\n                                    {\n                                        [fuzzyCamel addObject:result];\n                                    }\n                                    else if(result.fuzzyPerfect)\n                                    {\n                                        [fuzzyPerfect addObject:result];\n                                    }\n                                    else if(result.fuzzy)\n                                    {\n                                        [fuzzy addObject:result];\n                                    }\n                                    else\n                                    {\n                                        [noMatch addObject:result];\n                                    }\n                                    [allResults addObject:result];\n                                    [result setIsActive:YES];\n                                }\n                            }\n                        }\n                    }\n                    for(DHQueuedDB *queueDB in queue)\n                    {\n                        [queueDB setResultDictionary:[NSMutableDictionary dictionary]];\n                    }\n                    [fuzzyCamel addObjectsFromArray:fuzzyCamelBackUp];\n                    [fuzzyPerfect addObjectsFromArray:fuzzyPerfectBackUp];\n                    [fuzzy addObjectsFromArray:fuzzyBackUp];\n                    [noMatch addObjectsFromArray:noMatchBackUp];\n                    [DHDBSearcher checkForInterrupt];\n                    results = [NSMutableArray array];\n                    BOOL didSubmitFuzzies = NO;\n                    if(unifiedContainsPhase)\n                    {\n                        [results addObjectsFromArray:perfect];\n                        [results addObjectsFromArray:perfectOriginal];\n                        [results addObjectsFromArray:startsWith];\n                        [results addObjectsFromArray:endsWith];\n                        [results addObjectsFromArray:matches];\n                        [results addObjectsFromArray:startsWithOriginal];\n                        [results addObjectsFromArray:endsWithOriginal];\n                        [results addObjectsFromArray:originalMatches];\n                        \n                        [perfect removeAllObjects];\n                        [perfectOriginal removeAllObjects];\n                        [startsWith removeAllObjects];\n                        [endsWith removeAllObjects];\n                        [matches removeAllObjects];\n                        [startsWithOriginal removeAllObjects];\n                        [endsWithOriginal removeAllObjects];\n                        [originalMatches removeAllObjects];\n                    }\n                    if((fuzzyPhase && shouldBreak) || (count >= maxLimit && unifiedContainsPhase))\n                    {\n                        [results addObjectsFromArray:fuzzyCamel];\n                        [results addObjectsFromArray:fuzzyPerfect];\n                        [results addObjectsFromArray:fuzzy];\n                        [results addObjectsFromArray:noMatch];\n                        \n                        [fuzzyCamel removeAllObjects];\n                        [fuzzyPerfect removeAllObjects];\n                        [fuzzy removeAllObjects];\n                        [noMatch removeAllObjects];\n                        didSubmitFuzzies = YES;\n                    }\n                    \n                    for(int i = 0; i < results.count; i++)\n                    {\n                        DHDBResult *result = results[i];\n                        if(result.similarResults.count)\n                        {\n                            results[i] = [[DHDBNestedResultSorter sharedSorter] sortNestedResults:result];\n                        }\n                    }\n                    \n                    [DHDBSearcher checkForInterrupt];\n                    if(results.count || didSubmitFuzzies || shouldBreak)\n                    {\n                        [DHDBSearcher checkForInterrupt];\n                        if(results.count || (!didSendResultsOnce && (didSubmitFuzzies || shouldBreak)))\n                        {\n                            [DHDBSearcher checkForInterrupt];\n                            \n                            dispatch_sync(dispatch_get_main_queue(), ^{\n                                [self.delegate searcher:self foundResults:[NSArray arrayWithArray:results] hasMore:!(didSubmitFuzzies || shouldBreak)];\n                            });\n                            [DHDBSearcher checkForInterrupt];\n                            [DHDBSearcher checkForInterrupt];\n                        }\n                        didSendResultsOnce = results.count > 0;\n                        if(didSubmitFuzzies || shouldBreak)\n                        {\n                            break;\n                        }\n                        [results removeAllObjects];\n                    }\n                }\n                \n                if(unifiedPerfectPhase)\n                {\n                    unifiedPerfectPhase = NO;\n                    unifiedPrefixPhase = YES;\n                }\n                else if(unifiedPrefixPhase)\n                {\n                    unifiedPrefixPhase = NO;\n                    unifiedSuffixPhase = YES;\n                }\n                else if(unifiedSuffixPhase)\n                {\n                    unifiedSuffixPhase = NO;\n                    unifiedContainsPhase = YES;\n                }\n                if(!processingQueues.count && unifiedContainsPhase && count <= maxLimit)\n                {\n                    unifiedContainsPhase = NO;\n                    fuzzyPhase = YES;\n                    [processingQueues addObjectsFromArray:fuzzyQueue];\n                    [queue removeAllObjects];\n                    [queue addObjectsFromArray:fuzzyQueue];\n                }\n            }\n            [stepLock lock];\n            [stepLock unlockWithCondition:DHLockAllAllowed];\n        }\n        @catch(NSException *exception) {\n            [stepLock lock];\n            [stepLock unlockWithCondition:DHLockAllAllowed];\n            if(![[exception name] isEqualToString:@\"Interrupt\"])\n            {\n                NSLog(@\"FIXME: exception in doSearchThread: %@\", exception);\n                NSLog(@\"%@\", [NSThread callStackSymbols]);\n                [self.delegate searcher:self foundResults:@[] hasMore:NO];\n            }\n        }\n    }\n}\n\n- (void)cancelSearch\n{\n    [self.currentThread cancel];\n    [self.currentThread setThreadPriority:0.00f];\n    self.delegate = nil;\n    self.currentThread = nil;\n}\n\n+ (void)checkForInterrupt\n{\n    if([[NSThread currentThread] isCancelled])\n    {\n        [NSException raise:@\"Interrupt\" format:@\"\"];\n    }\n}\n\n- (void)dealloc\n{\n    [self cancelSearch];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocset.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"FMDatabase.h\"\n#import \"FMDatabaseAdditions.h\"\n\n@interface DHDocset : NSObject\n\n// If you add anything that gets changed by the user (e.g. custom keyword),\n// you should also add it to grabUserDataFromDocset: as well to make it\n// persist when the docset gets replaced during updates\n@property (strong) NSString *relativePath;\n@property (strong) NSString *tempOptimisedIndexPath;\n@property (strong) NSString *name;\n@property (strong) NSString *bundleIdentifier;\n@property (strong) NSString *platform;\n@property (strong) NSString *parseFamily;\n@property (strong) NSString *nameShorteningFamily;\n@property (strong) NSString *declaredInStyle;\n@property (assign) BOOL isJavaScriptEnabled;\n@property (assign) BOOL blocksOnlineResources;\n@property (assign) BOOL isDashDocset;\n@property (assign) BOOL isEnabled;\n@property (strong) NSString *_indexFilePath;\n@property (strong) NSString *pluginKeyword;\n@property (strong) NSString *suggestedKeyword;\n@property (strong) NSNumber *version;\n@property (strong) UIImage *_icon;\n@property (strong) NSString *_path;\n@property (strong) NSNumber *hasCustomIcon;\n@property (strong) NSString *repoIdentifier;\n@property (strong) NSString *feedIdentifier;\n\n- (void)grabUserDataFromDocset:(DHDocset *)docset;\n+ (DHDocset *)docsetAtPath:(NSString *)path;\n+ (DHDocset *)docsetWithDictionaryRepresentation:(NSDictionary *)dictionary;\n- (NSDictionary *)dictionaryRepresentation;\n+ (DHDocset *)firstDocsetInsideFolder:(NSString *)path;\n+ (NSConditionLock *)stepLock;\n- (void)executeBlockWithinDocsetDBConnection:(void (^)(FMDatabase *db))block readOnly:(BOOL)readOnly lockCondition:(int)lockCondition optimisedIndex:(BOOL)optimisedIndex;\n- (NSString *)documentsPath;\n- (NSString *)resourcesPath;\n- (NSString *)contentsPath;\n- (NSString *)tarixPath;\n- (NSString *)tarixIndexPath;\n- (UIImage *)icon;\n- (UIImage *)grabIcon;\n- (NSString *)path;\n- (NSDictionary *)plist;\n- (NSString *)sqlPath;\n- (NSString *)optimisedIndexPath;\n- (NSString *)indexFilePath;\n\n#define DHLockAllAllowed 3\n#define DHLockSearchOnly 2\n#define DHLockDontLock -1\n\n@end\n"
  },
  {
    "path": "Dash/DHDocset.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocset.h\"\n\n@implementation DHDocset\n\n@synthesize _icon = _iconCache;\n@synthesize _path = _pathCache;\n\nstatic NSConditionLock *_stepLock = nil;\n\n- (void)grabUserDataFromDocset:(DHDocset *)docset\n{\n    self.isEnabled = docset.isEnabled;\n}\n\n+ (DHDocset *)docsetWithDictionaryRepresentation:(NSDictionary *)dictionary\n{\n    DHDocset *docset = [[DHDocset alloc] init];\n    docset.relativePath = dictionary[@\"relativePath\"];\n    docset.name = dictionary[@\"name\"];\n    docset.bundleIdentifier = dictionary[@\"bundleIdentifier\"];\n    docset.platform = dictionary[@\"platform\"];\n    docset.parseFamily = dictionary[@\"parseFamily\"];\n    docset.nameShorteningFamily = dictionary[@\"nameShorteningFamily\"];\n    docset.declaredInStyle = dictionary[@\"declaredInStyle\"];\n    docset.isJavaScriptEnabled = [dictionary[@\"isJavaScriptEnabled\"] boolValue];\n    docset.isEnabled = [dictionary[@\"isEnabled\"] boolValue];\n    docset.blocksOnlineResources = [dictionary[@\"blocksOnlineResources\"] boolValue];\n    docset.isDashDocset = [dictionary[@\"isDashDocset\"] boolValue];\n    docset._indexFilePath = dictionary[@\"indexFilePath\"];\n    docset.pluginKeyword = dictionary[@\"pluginKeyword\"];\n    docset.suggestedKeyword = dictionary[@\"suggestedKeyword\"];\n    docset.version = dictionary[@\"version\"];\n    docset.hasCustomIcon = dictionary[@\"hasCustomIcon\"];\n    docset.feedIdentifier = dictionary[@\"feedIdentifier\"];\n    docset.repoIdentifier = dictionary[@\"repoIdentifier\"];\n    return docset;\n}\n\n- (NSDictionary *)dictionaryRepresentation\n{\n    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];\n    if(self.relativePath) { dictionary[@\"relativePath\"] = self.relativePath; }\n    if(self.name) { dictionary[@\"name\"] = self.name; }\n    if(self.bundleIdentifier) { dictionary[@\"bundleIdentifier\"] = self.bundleIdentifier; }\n    if(self.platform) { dictionary[@\"platform\"] = self.platform; }\n    if(self.parseFamily) { dictionary[@\"parseFamily\"] = self.parseFamily; }\n    if(self.nameShorteningFamily) { dictionary[@\"nameShorteningFamily\"] = self.nameShorteningFamily; }\n    if(self.declaredInStyle) { dictionary[@\"declaredInStyle\"] = self.declaredInStyle; }\n    dictionary[@\"isJavaScriptEnabled\"] = @(self.isJavaScriptEnabled);\n    dictionary[@\"blocksOnlineResources\"] = @(self.blocksOnlineResources);\n    dictionary[@\"isDashDocset\"] = @(self.isDashDocset);\n    dictionary[@\"isEnabled\"] = @(self.isEnabled);\n    if(self._indexFilePath) { dictionary[@\"indexFilePath\"] = self._indexFilePath; }\n    if(self.pluginKeyword) { dictionary[@\"pluginKeyword\"] = self.pluginKeyword; }\n    if(self.suggestedKeyword) { dictionary[@\"suggestedKeyword\"] = self.suggestedKeyword; }\n    if(self.version) { dictionary[@\"version\"] = self.version; }\n    if(self.hasCustomIcon) { dictionary[@\"hasCustomIcon\"] = self.hasCustomIcon; }\n    if(self.feedIdentifier) { dictionary[@\"feedIdentifier\"] = self.feedIdentifier; }\n    if(self.repoIdentifier) { dictionary[@\"repoIdentifier\"] = self.repoIdentifier; }\n    return dictionary;\n}\n\n- (NSDictionary *)plist\n{\n    return [NSDictionary dictionaryWithContentsOfFile:[self.path stringByAppendingPathComponent:@\"Contents/Info.plist\"]];\n}\n\n+ (DHDocset *)docsetAtPath:(NSString *)path\n{\n    DHDocset *docset = [[DHDocset alloc] init];\n    docset.relativePath = [path substringFromString:[homePath stringByDeletingLastPathComponent]];\n    NSDictionary *plist = [NSDictionary dictionaryWithContentsOfFile:[path stringByAppendingPathComponent:@\"Contents/Info.plist\"]];\n    if(!plist)\n    {\n        return nil;\n    }\n    NSString *bundle = plist[@\"CFBundleIdentifier\"];\n    if(!bundle)\n    {\n        bundle = @\"\";\n    }\n    docset.bundleIdentifier = bundle;\n    NSString *platform = plist[@\"DocSetPlatformFamily\"];\n    if([platform isEqualToString:@\"macosx\"])\n    {\n        platform = @\"osx\";\n    }\n    else if([platform isEqualToString:@\"iphoneos\"])\n    {\n        platform = @\"ios\";\n    }\n    else if([platform isEqualToString:@\"appletvos\"])\n    {\n        platform = @\"tvos\";\n    }\n    docset.platform = platform ? platform : @\"unknown\";\n    NSString *parseFamily = plist[@\"DashDocSetFamily\"];\n    if(parseFamily)\n    {\n        docset.parseFamily = parseFamily;\n    }\n    NSString *nameShorteningFamily = plist[@\"DashDocSetNameShorteningFamily\"];\n    if(nameShorteningFamily)\n    {\n        docset.nameShorteningFamily = nameShorteningFamily;\n    }\n    NSString *declaredInStyle = plist[@\"DashDocSetDeclaredInStyle\"];\n    if(declaredInStyle)\n    {\n        docset.declaredInStyle = declaredInStyle;\n    }\n    NSNumber *isJavaScriptEnabled = plist[@\"isJavaScriptEnabled\"];\n    BOOL isPlatformJavaScriptEnabled = [platform isEqualToString:@\"doxy\"] || [parseFamily isEqualToString:@\"doxy\"] || [platform isEqualToString:@\"doxygen\"] || [parseFamily isEqualToString:@\"doxygen\"];\n    BOOL isJSEnabled = [isJavaScriptEnabled boolValue] || isPlatformJavaScriptEnabled;\n    docset.isJavaScriptEnabled = isJSEnabled;\n    NSNumber *blocksOnlineResources = plist[@\"DashDocSetBlocksOnlineResources\"];\n    if(blocksOnlineResources)\n    {\n        docset.blocksOnlineResources = [blocksOnlineResources boolValue];\n    }\n    NSString *indexFilePath = plist[@\"dashIndexFilePath\"];\n    if(indexFilePath.length)\n    {\n        docset._indexFilePath = indexFilePath;\n    }\n    NSString *pluginKeyword = plist[@\"DashDocSetPluginKeyword\"];\n    if(pluginKeyword)\n    {\n        docset.pluginKeyword = pluginKeyword;\n    }\n    NSString *suggestedKeyword = plist[@\"DashDocSetKeyword\"];\n    if(suggestedKeyword)\n    {\n        docset.suggestedKeyword = suggestedKeyword;\n    }\n    NSString *versionString = plist[@\"DocSetPlatformVersion\"];\n    versionString = (versionString) ? versionString : plist[@\"CFBundleVersion\"];\n    if(versionString)\n    {\n        NSNumber *version = @([versionString doubleValue]);\n        if(version)\n        {\n            docset.version = version;\n        }\n        else\n        {\n            docset.version = @1.0f;\n        }\n    }\n    else\n    {\n        docset.version = @1.0f;\n    }\n    NSString *name = plist[@\"CFBundleName\"];\n    name = (name == nil) ? @\"Unknown\" : name;\n    if([name hasSuffix:@\" doc set\"])\n    {\n        name = [name substringToLastOccurrenceOfString:@\" doc set\"];\n    }\n    else if([name hasSuffix:@\" Documentation\"])\n    {\n        name = [name substringToLastOccurrenceOfString:@\" Documentation\"];\n    }\n    if([platform isEqualToString:@\"ios\"] || [platform isEqualToString:@\"osx\"] || [platform isEqualToString:@\"watchos\"] || [platform isEqualToString:@\"tvos\"])\n    {\n        if([name hasCaseInsensitiveSuffix:@\" library\"])\n        {\n            name = [name substringToLastOccurrenceOfString:@\" library\"];\n            name = [name substringToLastOccurrenceOfString:@\" Library\"];\n        }\n        name = [name stringByReplacingOccurrencesOfString:@\"OS X v\" withString:@\"OS X \"];\n    }\n    if([bundle isEqualToString:@\"com.apple.adc.documentation\"])\n    {\n        name = @\"Apple Guides and Sample Code\";\n        docset.suggestedKeyword = @\"apple\";\n    }\n    docset.name = name;\n    NSNumber *isDashNumber = plist[@\"isDashDocset\"];\n    BOOL isDash = (isDashNumber) ? [isDashNumber boolValue] : NO;\n    docset.isDashDocset = isDash;\n    docset.isEnabled = YES;\n    return docset;\n}\n\n+ (DHDocset *)firstDocsetInsideFolder:(NSString *)path\n{\n    if([[path pathExtension] isCaseInsensitiveEqual:@\"docset\"])\n    {\n        return [DHDocset docsetAtPath:path];\n    }\n    NSString *docset = [[NSFileManager defaultManager] firstFileWithExtension:@\"docset\" atPath:path ignoreHidden:YES];\n    if(docset)\n    {\n        return [DHDocset docsetAtPath:[path stringByAppendingPathComponent:docset]];\n    }\n    return nil;\n}\n\n+ (void)initLock\n{\n    @synchronized([DHDocset class])\n\t{\n\t\tif(!_stepLock)\n\t\t{\n\t\t\t_stepLock = [[NSConditionLock alloc] initWithCondition:3];\n\t\t}\n\t}\n}\n\n+ (NSConditionLock *)stepLock\n{\n    if(!_stepLock)\n    {\n        [DHDocset initLock];\n    }\n    return _stepLock;\n}\n\n- (void)executeBlockWithinDocsetDBConnection:(void (^)(FMDatabase *db))block readOnly:(BOOL)readOnly lockCondition:(int)lockCondition optimisedIndex:(BOOL)optimisedIndex\n{\n    NSString *docsetSQLPath = (optimisedIndex) ? (self.tempOptimisedIndexPath) ? self.tempOptimisedIndexPath : self.optimisedIndexPath : self.sqlPath;\n    if(!docsetSQLPath)\n    {\n        return;\n    }\n    NSConditionLock *lock = (lockCondition != DHLockDontLock) ? [DHDocset stepLock] : nil;\n    [lock lockWhenCondition:lockCondition];\n    FMDatabase *db = [FMDatabase databaseWithPath:docsetSQLPath];\n    if((readOnly) ? [db openWithFlags:SQLITE_OPEN_READONLY] : [db open])\n    {\n        if(optimisedIndex)\n        {\n            [db registerFTSExtensions];\n        }\n        [lock unlockWithCondition:lockCondition];\n        @try {\n            block(db);\n        }\n        @catch (NSException *exception) {\n            if([[exception name] isEqualToString:@\"Indexing Interrupt\"])\n            {\n                [NSException raise:@\"Indexing Interrupt\" format:@\"\"];\n            }\n            else\n            {\n                NSLog(@\"FIXME: Exception in executeBlockWithinDocsetDB: %@\", exception);\n                NSLog(@\"%@\", [NSThread callStackSymbols]);\n            }\n        }\n        @finally {\n            [lock lockWhenCondition:lockCondition];\n            [db close];\n            [lock unlockWithCondition:DHLockAllAllowed];\n        }\n    }\n    else\n    {\n        [lock unlockWithCondition:DHLockAllAllowed];\n    }\n}\n\n- (UIImage *)icon\n{\n    return (self._icon) ? : [self grabIcon];\n}\n\n- (UIImage *)grabIcon\n{\n    UIImage *icon = nil;\n    if(!self.hasCustomIcon || [self.hasCustomIcon boolValue])\n    {\n        NSString *iconPath = [self.path stringByAppendingPathComponent:@\"icon.png\"];\n        icon = [DHImageCache imageWithContentsOfFile:iconPath fullRefresh:!self.hasCustomIcon];\n        if(!icon)\n        {\n            iconPath = [self.path stringByAppendingPathComponent:@\"icon.tiff\"];\n            icon = [DHImageCache imageWithContentsOfFile:iconPath fullRefresh:!self.hasCustomIcon];\n        }\n        self.hasCustomIcon = [NSNumber numberWithBool:icon != nil];\n    }\n    if([self.bundleIdentifier isEqualToString:@\"com.apple.adc.documentation\"])\n    {\n        icon = [UIImage imageNamed:@\"apple\"];\n    }\n    if(!icon)\n    {\n        NSString *platform = (self.platform) ? self.platform : @\"Other\";\n        if(self.parseFamily && [self.parseFamily isEqualToString:@\"cheatsheet\"])\n        {\n            platform = @\"cheatsheet\";\n        }\n        if([platform isEqualToString:@\"macosx\"] || [platform isEqualToString:@\"osx\"])\n        {\n            icon = [UIImage imageNamed:@\"Mac\"];\n        }\n        else if([platform isEqualToString:@\"iphoneos\"] || [platform isEqualToString:@\"ios\"])\n        {\n            icon = [UIImage imageNamed:@\"iphone\"];\n        }\n        else\n        {\n            icon = [UIImage imageNamed:platform];\n            if(!icon)\n            {\n                icon = [UIImage imageNamed:@\"Other\"];\n            }\n        }\n    }\n    self._icon = icon;\n    return icon;\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:@\"Docset with name: %@, platform: %@, isDashDocset: %d\", self.name, self.platform, self.isDashDocset];\n}\n\n- (NSString *)contentsPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents\"];\n}\n\n- (NSString *)resourcesPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources\"];\n}\n\n- (NSString *)documentsPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources/Documents\"];\n}\n\n- (NSString *)tarixPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources/tarix.tgz\"];\n}\n\n- (NSString *)tarixIndexPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources/tarixIndex.db\"];\n}\n\n- (BOOL)isEqual:(DHDocset *)object\n{\n    return [self.path isCaseInsensitiveEqual:[object path]];\n}\n\n- (NSString *)path\n{\n    if(!self._path)\n    {\n        self._path = [[homePath stringByDeletingLastPathComponent] stringByAppendingPathComponent:self.relativePath];\n    }\n    return self._path;\n}\n\n- (NSString *)sqlPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources/docSet.dsidx\"];\n}\n\n- (NSString *)optimisedIndexPath\n{\n    return [self.path stringByAppendingPathComponent:@\"Contents/Resources/optimisedIndex.dsidx\"];\n}\n\n- (NSString *)indexFilePath\n{\n    NSString *indexFile = self._indexFilePath;\n    NSString *docsetPath = self.documentsPath;\n    NSString *platform = self.platform;\n    NSString *parseFamily = self.parseFamily;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if(indexFile)\n    {\n        if(indexFile.length > 0)\n        {\n            if([indexFile hasPrefix:@\"http://\"] || [indexFile hasPrefix:@\"https://\"] || [indexFile hasPrefix:@\"dash-apple-api://\"])\n            {\n                return indexFile;\n            }\n            if([platform isEqualToString:@\"apple\"] && [DHAppleActiveLanguage currentLanguage] == DHNewActiveAppleLanguageObjC)\n            {\n                indexFile = [indexFile stringByReplacingOccurrencesOfString:@\".html\" withString:@\"1742.html\"];\n            }\n            NSString *fullPath = [docsetPath stringByAppendingPathComponent:[indexFile substringToString:@\"#\"]];\n            if([fileManager fileExistsAtPathOrInIndex:fullPath])\n            {\n                if([indexFile contains:@\"#\"])\n                {\n                    fullPath = [fullPath stringByAppendingFormat:@\"#%@\", [indexFile substringFromString:@\"#\"]];\n                }\n                return fullPath;\n            }\n        }\n    }\n    NSMutableArray *pathsToTry = [NSMutableArray arrayWithObjects:@\"dash-browse-index.html\", @\"prototypejs/index.html\", @\"sqlite/index.html\", @\"documentation/Cocoa/Reference/Foundation/ObjC_classic/_index.html\", @\"documentation/ToolsLanguages/Conceptual/Xcode_User_Guide/000-About_Xcode/about.html\", @\"documentation/IDEs/Conceptual/xcode_quick_start/index.html\", @\"package-detail.html\", @\"docs/reference/packages.html\", @\"Arduino/index.html\", @\"output/en.cppreference.com/w/cpp.html\", @\"output/en/cpp.html\", @\"clojure/api-index.html\", @\"developer.anscamobile.com/reference/index.html\", @\"docs.coronalabs.com/api/index.html\", @\"developer.mozilla.org/en/CSS/CSS_Reference.html\",  @\"developer.mozilla.org/en-US/docs/CSS/CSS_Reference.html\", @\"api/overview-summary.html\", @\"haskell/index.html\", @\"developer.mozilla.org/en/HTML/HTML5.html\", @\"developer.mozilla.org/en/JavaScript/Reference.html\", @\"developer.mozilla.org/en/JavaScript/Reference.html\", @\"www.lua.org/manual/5.2/index.html\", @\"www.lua.org/manual/5.1/index.html\", @\"www.lua.org/manual/5.3/index.html\", @\"nodejs/api/documentation.html\", @\"nodejs/api/api/documentation.html\", @\"perldoc-html/index-functions-by-cat.html\", @\"res/index.html\", @\"genindex-all.html\", @\"topics/introduction.html\", @\"introduction.html\", @\"api.rubyonrails.org/files/RDOC_MAIN_rdoc.html\", @\"scala/package.html\", @\"akka/package.html\", @\"docs/welcome.html\", @\"developer.mozilla.org/en/XSLT/Elements.html\", @\"developer.mozilla.org/en/XUL_Reference.html\", @\"genindex.html\", @\"html/classes.html\", @\"html/qtdoc/classes.html\", @\"api.jquery.com/index.html\", @\"helphelp.html\", @\"partials/guide/index.html\", @\"elisp/index.html\", @\"docs/right-pane.html\", @\"doc/man_index.html\", @\"docs.go-mono.com/monoroot.html\", @\"api/index.html\", @\"mongo/genindex.html\", @\"HyperSpec/HyperSpec/Front/index.htm\", @\"api.jqueryui.com/category/all/index.html\", @\"golang.org/ref/index.html\", @\"documentation/ToolsLanguages/Conceptual/Xcode_Overview/About_Xcode/about.html\", @\"documentation/Cocoa/Reference/Foundation/ObjC_classic/index.html\", @\"documentation/ToolsLanguages/Conceptual/Xcode_Overview/index.html\", nil];\n    if([platform isEqualToString:@\"c\"])\n    {\n        [pathsToTry removeObject:@\"output/en/cpp.html\"];\n        [pathsToTry removeObject:@\"output/en.cppreference.com/w/cpp.html\"];\n        [pathsToTry addObject:@\"output/en/c.html\"];\n        [pathsToTry addObject:@\"output/en.cppreference.com/w/c.html\"];\n    }\n    NSArray *firstIndexPlatforms = @[@\"cappuccino\", @\"cocos2dx\", @\"underscore\", @\"backbone\", @\"coffee\", @\"appledoc\", @\"doxy\", @\"doxygen\", @\"gl2\", @\"gl3\", @\"gl4\", @\"sparrow\", @\"cocos2d\", @\"codeigniter\", @\"django\", @\"joomla\", @\"symfony\", @\"kobold2d\", @\"mysql\", @\"psql\", @\"typo3\", @\"twisted\", @\"zend\", @\"glib\"];\n    if([firstIndexPlatforms containsObject:platform] || (parseFamily && [firstIndexPlatforms containsObject:parseFamily]))\n    {\n        [pathsToTry insertObject:@\"index.html\" atIndex:0];\n    }\n    for(NSString *path in pathsToTry)\n    {\n        NSString *dashIndexPath = [docsetPath stringByAppendingPathComponent:path];\n        if([fileManager fileExistsAtPathOrInIndex:dashIndexPath])\n        {\n            self._indexFilePath = path;\n            return dashIndexPath;\n        }\n    }\n    self._indexFilePath = @\"\";\n    return [[NSBundle mainBundle] pathForResource:@\"home\" ofType:@\"html\"];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetBrowser.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHWebViewController.h\"\n#import \"DHBrowserTableViewCell.h\"\n#import \"DHDBSearchController.h\"\n#import \"DHBrowserTableView.h\"\n\n@interface DHDocsetBrowser : UITableViewController <UINavigationControllerDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate, DHBrowserTableViewDelegate>\n\n@property (assign) BOOL didFirstReload;\n@property (strong) DHDBSearchController *searchController;\n@property (strong, readonly) NSArray<DHDocset *> *shownDocsets;\n@property (assign) BOOL didLoad;\n@property (assign) BOOL isSearching;\n@property (assign) BOOL needsToReloadWhenDoneSearching;\n\n- (IBAction)openSettings:(id)sender;\n+ (NSAttributedString *)titleBarItemAttributedStringTemplate;\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetBrowser.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetBrowser.h\"\n#import \"DHWebViewController.h\"\n#import \"DHPreferences.h\"\n#import \"DHNavigationAnimator.h\"\n#import \"DHRepo.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHDocsetDownloader.h\"\n#import \"DHRemoteBrowser.h\"\n#import \"DHWebView.h\"\n#import \"DHDocsetBrowserViewModel.h\"\n\nstatic NSAttributedString *_titleBarItemAttributedStringTemplate = nil;\n\n@interface DHDocsetBrowser ()\n@property (nonatomic, strong) DHDocsetBrowserViewModel *viewModel;\n@end\n\n@implementation DHDocsetBrowser\n\n- (NSArray<DHDocset *> *)shownDocsets {\n    return self.viewModel.shownDocsets;\n}\n\n- (NSArray *)sections {\n    return self.viewModel.sections;\n}\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    self.viewModel = [[DHDocsetBrowserViewModel alloc] init];\n    self.clearsSelectionOnViewWillAppear = NO;\n    self.searchController = [DHDBSearchController searchControllerWithDocsets:nil typeLimit:nil viewController:self];\n    \n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    \n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reload:) name:DHDocsetsChangedNotification object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reload:) name:DHRemotesChangedNotification object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reload:) name:DHSettingsChangedNotification object:nil];\n    self.tableView.rowHeight = 44;\n    self.navigationController.delegate = self;\n    self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performURLSearch:) name:DHPerformURLSearch object:nil];\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    self.tableView.emptyDataSetSource = self;\n    self.tableView.emptyDataSetDelegate = self;\n    if(!self.didFirstReload)\n    {\n        self.didFirstReload = YES;\n        [self reload:nil];\n    }\n    [self.searchController viewDidAppear];\n    [self grabTitleBarItemAttributedStringTemplate];\n}\n\n- (void)viewDidDisappear:(BOOL)animated\n{\n    [super viewDidDisappear:animated];\n    [self.searchController viewDidDisappear];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [self.navigationItem.leftBarButtonItem setEnabled:YES];\n    [super viewWillAppear:animated];\n    if(!self.isEditing)\n    {\n        [self.tableView deselectAll:YES];        \n    }\n    [self.searchController viewWillAppear];\n    if([DHRemoteServer sharedServer].connectedRemote)\n    {\n        [UIApplication sharedApplication].idleTimerDisabled = NO;\n        [[DHRemoteServer sharedServer].connectedRemote disconnect];\n        if(isRegularHorizontalClass)\n        {\n            DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n            [webViewController loadURL:[[NSBundle mainBundle] pathForResource:@\"home\" ofType:@\"html\"]];\n            [(DHWebView*)webViewController.webView resetHistory];\n            [webViewController updateBackForwardButtonState];\n            webViewController.webView.scrollView.delegate = webViewController;\n            webViewController.navigationController.toolbarHidden = NO;\n        }\n    }\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [self.searchController viewWillDisappear];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.searchController traitCollectionDidChange:previousTraitCollection];\n}\n\n- (void)performURLSearch:(NSNotification *)notification\n{\n    [self.navigationController popToRootViewControllerAnimated:NO];\n    NSString *url = [notification object];\n    NSString *query = nil;\n    NSMutableOrderedSet *keywordDocsets = [NSMutableOrderedSet orderedSet];\n    if([url hasCaseInsensitivePrefix:@\"dash://\"])\n    {\n        query = [url substringFromIndex:@\"dash://\".length];\n    }\n    else if([url hasCaseInsensitivePrefix:@\"dash-plugin://\"])\n    {\n        NSString *all = [[url stringByReplacingOccurrencesOfString:@\"dash-plugin://\" withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, url.length)] trimWhitespace];\n        query = ([all contains:@\"query=\"]) ? [[all substringFromString:@\"query=\"] substringToString:@\"&\"] : @\"\";\n        NSString *keysString = ([all contains:@\"keys=\"]) ? [[all substringFromString:@\"keys=\"] substringToString:@\"&\"] : @\"\";\n        if(keysString.length)\n        {\n            NSMutableArray *docsets = [NSMutableArray arrayWithArray:[DHDocsetManager sharedManager].docsets];\n            NSArray *keys = [keysString componentsSeparatedByString:@\",\"];\n            for(__strong NSString *key in keys)\n            {\n                key = [[key stringByReplacingPercentEscapes] trimWhitespace];\n                BOOL isExact = [key hasPrefix:@\"exact:\"];\n                if(isExact)\n                {\n                    key = [key substringFromIndex:@\"exact:\".length];\n                }\n                if(key.length)\n                {\n                    NSMutableArray *aliasKeys = [NSMutableArray arrayWithObject:key];\n                    if([key isCaseInsensitiveEqual:@\"macosx\"])\n                    {\n                        [aliasKeys addObject:@\"osx\"];\n                    }\n                    else if([key isCaseInsensitiveEqual:@\"osx\"])\n                    {\n                        [aliasKeys addObject:@\"macosx\"];\n                    }\n                    else if([key isCaseInsensitiveEqual:@\"ios\"])\n                    {\n                        [aliasKeys addObject:@\"iphoneos\"];\n                    }\n                    else if([key isCaseInsensitiveEqual:@\"iphoneos\"])\n                    {\n                        [aliasKeys addObject:@\"ios\"];\n                    }\n                    for(NSString *aliasKey in aliasKeys)\n                    {\n                        for(DHDocset *docset in docsets)\n                        {\n                            NSString *platform = [[[docset.platform stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"] lowercaseString] stringByReplacingOccurrencesOfString:@\":\" withString:@\"\"];\n                            NSString *parseFamily = [[[docset.parseFamily stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"] lowercaseString] stringByReplacingOccurrencesOfString:@\":\" withString:@\"\"];\n                            NSString *pluginKeyword = docset.pluginKeyword;\n                            if((platform && platform.length && [platform isCaseInsensitiveEqual:aliasKey]) || (!isExact && parseFamily && parseFamily.length && [parseFamily isCaseInsensitiveEqual:aliasKey]) || (!isExact && pluginKeyword && pluginKeyword.length && [pluginKeyword isCaseInsensitiveEqual:aliasKey]))\n                            {\n                                [keywordDocsets addObject:docset];\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    query = [[query stringByReplacingPercentEscapes] trimWhitespace];\n    self.searchDisplayController.searchBar.text = @\"\";\n    [self.searchDisplayController setActive:NO animated:NO];\n    [self.searchDisplayController.searchBar resignFirstResponder];\n    if((query && query.length) || keywordDocsets.count)\n    {\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.00 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            if(keywordDocsets.count)\n            {\n                self.viewModel.keyDocsets = [NSMutableArray arrayWithArray:[keywordDocsets array]];\n            }\n            [self.searchDisplayController setActive:YES animated:NO];\n            self.searchDisplayController.searchBar.text = query;\n            if(!query.length)\n            {\n                [self.searchDisplayController.searchBar becomeFirstResponder];\n            }\n        });\n    }\n}\n\n- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView\n{\n    NSString *text = @\"No Docsets\";\n    return [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: [UIFont fontWithName:@\"HelveticaNeue-Light\" size:22.0], NSForegroundColorAttributeName: [UIColor colorWithWhite:201.0/255.0 alpha:1.0]}];\n}\n\n- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView {\n    \n    NSString *text = @\"You can download some in Settings.\";\n    NSMutableParagraphStyle *paragraph = [NSMutableParagraphStyle new];\n    paragraph.lineBreakMode = NSLineBreakByWordWrapping;\n    paragraph.alignment = NSTextAlignmentCenter;\n    paragraph.lineSpacing = 4.0;\n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:13.0], NSForegroundColorAttributeName: [UIColor colorWithWhite:207.0/255.0 alpha:1.0], NSParagraphStyleAttributeName: paragraph};\n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];\n}\n\n- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return [UIImage imageNamed:@\"placeholder_docsets\"];\n}\n\n- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state\n{\n    NSString *text = @\"Open Settings\";\n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:16.0], NSForegroundColorAttributeName: [[DHAppDelegate sharedDelegate].window.rootViewController.view.tintColor colorWithAlphaComponent:state == UIControlStateNormal ? 0.7 : 0.2]};\n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];\n}\n\n- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView\n{\n    return NO;\n}\n\n- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return 24;\n}\n\n- (void)emptyDataSetDidTapButton:(UIScrollView *)scrollView\n{\n    [self openSettings:self];\n}\n\n- (void)reload:(NSNotification *)notification\n{\n    if(self.isSearching)\n    {\n        if(!notification || [[notification name] isEqualToString:DHDocsetsChangedNotification])\n        {\n            self.needsToReloadWhenDoneSearching = YES;\n        }\n        return;\n    }\n    NSArray *selected = (self.isEditing) ? [self.tableView indexPathsForSelectedRows] : nil;\n    [self updateSections:YES];\n    self.navigationItem.rightBarButtonItem = ([DHDocsetManager sharedManager].docsets.count > 0) ? self.editButtonItem : nil;\n    self.tableView.tableFooterView = (self.sections.count) ? nil : [UIView new];\n    [self.tableView reloadData];\n    for(NSIndexPath *toSelect in selected)\n    {\n        [self.tableView selectRowAtIndexPath:toSelect animated:NO scrollPosition:UITableViewScrollPositionNone];\n    }\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    [self updateSections:YES];\n    return self.sections.count;\n}\n\n- (void)updateSections:(BOOL)withTitleUpdate\n{\n    [self.viewModel updateSectionsForEditing:self.isEditing andSearching:self.isSearching];\n    if(withTitleUpdate)\n    {\n        [self updateTitle];\n    }\n}\n\n- (void)updateTitle\n{\n    if([DHRemoteServer sharedServer].remotes.count && !self.isEditing)\n    {\n        self.navigationItem.title = (self.sections.count > 1 || [DHDocsetManager sharedManager].docsets.count) ? @\"Docsets & Remotes\" : @\"Remotes\";\n    }\n    else\n    {\n        self.navigationItem.title = @\"Docsets\";\n    }\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    return [self.sections[section] count];\n}\n\n- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section\n{\n    if(self.isEditing)\n    {\n        return ([DHRemoteServer sharedServer].remotes.count) ? @\"Docsets\" : nil;\n    }\n    if(self.sections.count > 1 || ([DHDocsetManager sharedManager].docsets.count && !self.shownDocsets.count))\n    {\n        return (section == 1 && self.shownDocsets.count) ? @\"Docsets\" : @\"Remotes\";\n    }\n    return nil;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHBrowserCell\" forIndexPath:indexPath];\n    \n    DHDocset *docset = self.sections[indexPath.section][indexPath.row];\n    cell.textLabel.text = docset.name;\n    cell.detailTextLabel.text = @\"\";\n    [cell.titleLabel setSubtitle:([docset isKindOfClass:[DHRemote class]]) ? @\"Not Connected\" : @\"\"];\n    cell.imageView.image = docset.icon;\n    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;\n    return cell;\n}\n\n- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath\n{\n    [[DHDocsetManager sharedManager] moveDocsetAtIndex:fromIndexPath.row toIndex:toIndexPath.row];\n}\n\n- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    return self.viewModel.canMoveRows;\n}\n\n- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    return 3;\n}\n\n- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    return YES;\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(self.editing)\n    {\n        [self.shownDocsets[indexPath.row] setIsEnabled:YES];\n        [[DHDocsetManager sharedManager] saveDefaults];\n        return;\n    }\n    if([self.sections[indexPath.section][indexPath.row] isKindOfClass:[DHRemote class]])\n    {\n        [self performSegueWithIdentifier:@\"DHRemoteBrowserSegue\" sender:self];\n    }\n    else\n    {\n        [self performSegueWithIdentifier:@\"DHTypeBrowserSegue\" sender:self];\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(self.editing)\n    {\n        [self.shownDocsets[indexPath.row] setIsEnabled:NO];\n        [[DHDocsetManager sharedManager] saveDefaults];\n        return;\n    }\n}\n\n- (void)tableViewDidBeginEditing:(UITableView *)tableView\n{\n    BOOL remotesWereShown = [DHRemoteServer sharedServer].remotes.count > 0;\n    BOOL docsetsWereShown = (!remotesWereShown && self.sections.count) || (remotesWereShown && self.sections.count > 1);\n    if(docsetsWereShown)\n    {\n        [self.tableView selectRowsInIndexSet:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [self.tableView numberOfRowsInSection:self.sections.count-1])] inSection:self.sections.count-1 animated:NO scrollPosition:UITableViewScrollPositionNone];\n    }\n\n    //    NSArray *current = self.shownDocsets;\n    NSArray *new = [self.viewModel docsetsForEditing:YES];\n    self.viewModel.shownDocsets = new;\n    NSMutableArray *toInsert = [NSMutableArray array];\n    for(NSInteger i = 0; i < new.count; i++)\n    {\n        DHDocset *docset = new[i];\n        if(!docset.isEnabled)\n        {\n            [toInsert addObject:[NSIndexPath indexPathForRow:i inSection:0]];\n        }\n    }\n    [self updateSections:YES];\n    [self.tableView beginUpdates];\n    if(!docsetsWereShown)\n    {\n        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n    }\n    else\n    {\n        [self.tableView insertRowsAtIndexPaths:toInsert withRowAnimation:UITableViewRowAnimationFade];\n    }\n    if(remotesWereShown)\n    {\n        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n    }\n    [self.tableView endUpdates];\n    [self.tableView reloadEmptyDataSet];\n    self.tableView.tableFooterView = (self.sections.count) ? nil : [UIView new];\n}\n\n- (void)tableViewDidEndEditing:(UITableView *)tableView\n{\n    NSArray *current = self.shownDocsets;\n    self.viewModel.shownDocsets = [self.viewModel docsetsForEditing:NO];\n    NSMutableArray *toDelete = [NSMutableArray array];\n    BOOL docsetsShouldBeShown = NO;\n    for(int i = 0; i < current.count; i++)\n    {\n        if(![current[i] isEnabled])\n        {\n            [toDelete addObject:[NSIndexPath indexPathForRow:i inSection:0]];\n        }\n        else\n        {\n            docsetsShouldBeShown = YES;\n        }\n    }\n    BOOL remotesShouldBeShown = [DHRemoteServer sharedServer].remotes.count > 0;\n    [self updateSections:YES];\n    [self.tableView beginUpdates];\n    if(docsetsShouldBeShown)\n    {\n        [self.tableView deleteRowsAtIndexPaths:toDelete withRowAnimation:UITableViewRowAnimationFade];\n    }\n    else\n    {\n        [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n    }\n    if(remotesShouldBeShown)\n    {\n        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n    }\n    [self.tableView endUpdates];\n    [self.tableView reloadEmptyDataSet];\n    self.tableView.tableFooterView = (self.sections.count) ? nil : [UIView new];\n}\n\n- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller\n{\n    if(self.viewModel.keyDocsets)\n    {\n        [self reload:nil];\n    }\n    self.isSearching = YES;\n    BOOL remotesWereShown = [DHRemoteServer sharedServer].remotes.count > 0;\n    if(remotesWereShown)\n    {\n        [self updateSections:YES];\n        [self.tableView beginUpdates];\n        if(remotesWereShown)\n        {\n            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n        }\n        [self.tableView endUpdates];\n        [self.tableView reloadEmptyDataSet];\n        self.tableView.tableFooterView = (self.sections.count) ? nil : [UIView new];\n    }\n}\n\n- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller\n{\n    self.isSearching = NO;\n    if(self.needsToReloadWhenDoneSearching || self.viewModel.keyDocsets)\n    {\n        self.viewModel.keyDocsets = nil;\n        self.needsToReloadWhenDoneSearching = NO;\n        [self reload:nil];\n    }\n    else\n    {\n        BOOL remotesShouldBeShown = [DHRemoteServer sharedServer].remotes.count > 0;\n        if(remotesShouldBeShown)\n        {\n            [self updateSections:YES];\n            [self.tableView beginUpdates];\n            if(remotesShouldBeShown)\n            {\n                [self.tableView insertSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];\n            }\n            [self.tableView endUpdates];\n            [self.tableView reloadEmptyDataSet];\n            self.tableView.tableFooterView = (self.sections.count) ? nil : [UIView new];\n        }\n    }\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [self updateTitle];\n    });\n}\n\n- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller\n{\n    [self updateTitle];\n}\n\n- (void)orientationChanged:(id)sender\n{\n    [self.tableView reloadEmptyDataSet];\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHTypeBrowserSegue\"])\n    {\n        NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;\n        DHDocset *selectedDocset = self.sections[indexPath.section][indexPath.row];\n        id typeBrowser = [segue destinationViewController];\n        [typeBrowser setDocset:selectedDocset];\n    }\n    else if([[segue identifier] isEqualToString:@\"DHRemoteBrowserSegue\"])\n    {\n        if(isRegularHorizontalClass)\n        {\n            [(DHWebView*)[DHWebViewController sharedWebViewController].webView resetHistory];\n        }\n        NSIndexPath *indexPath = self.tableView.indexPathForSelectedRow;\n        DHRemote *selectedRemote = self.sections[indexPath.section][indexPath.row];\n        id remoteBrowser = [segue destinationViewController];\n        [remoteBrowser setRemote:selectedRemote];\n        [selectedRemote connect];\n    }\n    else\n    {\n        [self.searchController prepareForSegue:segue sender:sender];\n    }\n}\n\n- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC\n{\n    // You'll probably never need to modify this, ever!\n    // What you're looking for is inside DHWebViewController\n    if([fromVC isKindOfClass:[DHPreferences class]] || [toVC isKindOfClass:[DHPreferences class]])\n    {\n        if(![fromVC isKindOfClass:[DHRepo class]] && ![toVC isKindOfClass:[DHRepo class]])\n        {\n            return [[DHNavigationAnimator alloc] init];            \n        }\n    }\n    return nil;\n}\n\n- (IBAction)openSettings:(id)sender\n{\n    if(!self.isActive || (isRegularHorizontalClass && [[self.splitViewController.viewControllers.lastObject topViewController] isKindOfClass:[DHDocsetDownloader class]]))\n    {\n        return;\n    }\n    [self performSegueWithIdentifier:@\"DHOpenSettingsSegue\" sender:self];\n    if(isRegularHorizontalClass)\n    {\n        [self performSegueWithIdentifier:@\"DHDocsetDownloaderToDetailSegue\" sender:self];\n        [[self.splitViewController.viewControllers.lastObject navigationItem] setHidesBackButton:YES];\n    }\n    [self.navigationItem.leftBarButtonItem setEnabled:NO];\n}\n\n- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer\n{\n    if(self.navigationController.viewControllers.count > 1)\n    {\n        if([self.navigationController.visibleViewController respondsToSelector:@selector(searchController)] && [[(DHDocsetBrowser*)self.navigationController.visibleViewController searchController] isKindOfClass:[DHDBSearchController class]] && [(DHDocsetBrowser*)self.navigationController.visibleViewController searchController].displayController.active)\n        {\n            return NO;\n        }\n        else if([self.navigationController.visibleViewController isKindOfClass:[DHPreferences class]])\n        {\n            return NO;\n        }\n        return YES;\n    }\n    return NO;\n}\n\n- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer\n{\n    return YES;\n}\n\n- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer\n{\n    return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class];\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [self.searchController encodeRestorableStateWithCoder:coder];\n    [super encodeRestorableStateWithCoder:coder];\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    [self.searchController decodeRestorableStateWithCoder:coder];\n}\n\n- (void)applicationFinishedRestoringState\n{\n    [super applicationFinishedRestoringState];\n}\n\n+ (NSAttributedString *)titleBarItemAttributedStringTemplate\n{\n    return _titleBarItemAttributedStringTemplate;\n}\n\n- (void)grabTitleBarItemAttributedStringTemplate\n{\n    if(_titleBarItemAttributedStringTemplate)\n    {\n        return;\n    }\n    @try {\n        for(UIView *view in self.navigationController.navigationBar.subviews)\n        {\n            for(UILabel *label in view.subviews)\n            {\n                if([label isKindOfClass:[UILabel class]])\n                {\n                    if([label.text isEqualToString:self.navigationItem.title])\n                    {\n                        _titleBarItemAttributedStringTemplate = [label.attributedText copy];\n                        break;\n                    }\n                }\n            }\n            if(_titleBarItemAttributedStringTemplate)\n            {\n                break;\n            }\n        }\n    }\n    @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n}\n\n- (void)dealloc\n{\n    self.navigationController.interactivePopGestureRecognizer.delegate = nil;\n    self.navigationController.delegate = nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetBrowserViewModel.h",
    "content": "\n#import <Foundation/Foundation.h>\n\n@interface DHDocsetBrowserViewModel : NSObject\n@property (nonatomic, strong, readonly) NSArray *sections;\n@property (nonatomic, strong) NSMutableArray *keyDocsets;\n@property (nonatomic, strong) NSArray<DHDocset *> *shownDocsets;\n@property (nonatomic, readonly) BOOL canMoveRows;\n- (void)updateSectionsForEditing:(BOOL)editing andSearching:(BOOL)searching;\n- (NSArray<DHDocset *> *)docsetsForEditing:(BOOL)editing;\n@end\n"
  },
  {
    "path": "Dash/DHDocsetBrowserViewModel.m",
    "content": "\n#import \"DHDocsetBrowserViewModel.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHDocsetDownloader.h\"\n\n@interface DHDocsetBrowserViewModel ()\n@property (nonatomic, strong) NSArray *sections;\n@end\n\n@implementation DHDocsetBrowserViewModel\n\n- (BOOL)alphabetizing {\n    return [NSUserDefaults.standardUserDefaults boolForKey:DHDocsetDownloader.defaultsAlphabetizingKey];\n}\n\n- (BOOL)canMoveRows {\n    return !self.alphabetizing;\n}\n\n- (NSArray *)sort:(NSArray *)array {\n    if (self.alphabetizing) {\n        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@\"name\" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];\n        array = [array sortedArrayUsingDescriptors:@[sortDescriptor]];\n    }\n    return array;\n}\n\n- (NSArray<DHDocset *> *)docsetsForEditing:(BOOL)editing {\n    NSArray<DHDocset *> *docsets = (editing) ? [DHDocsetManager sharedManager].docsets : (self.keyDocsets) ? self.keyDocsets : [DHDocsetManager sharedManager].enabledDocsets;\n    return [self sort:docsets];\n}\n\n- (void)updateSectionsForEditing:(BOOL)editing andSearching:(BOOL)searching\n{\n    NSMutableArray *sections = [NSMutableArray array];\n    if([DHRemoteServer sharedServer].remotes.count)\n    {\n        if(!editing && !searching)\n        {\n            [sections addObject:[self sort:DHRemoteServer.sharedServer.remotes]];\n        }\n    }\n    NSArray<DHDocset *> *docsets = [self docsetsForEditing:editing];\n    self.shownDocsets = docsets;\n    if(docsets.count)\n    {\n        [sections addObject:docsets];\n    }\n    self.sections = sections;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetDownloader.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepo.h\"\n\n@interface DHDocsetDownloader : DHRepo\n\n+ (instancetype)sharedDownloader;\n- (BOOL)canInstallFeed:(DHFeed *)aFeed;\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetDownloader.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetDownloader.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHFeed.h\"\n#import \"DDXML.h\"\n#import \"DHFeedResult.h\"\n#import \"DHDocsetManager.h\"\n\n@implementation DHDocsetDownloader\n\nstatic id singleton = nil;\n\n- (void)setUp // doesn't get called unless you call the singleton from DHAppDelegate\n{    \n    [super setUp];\n    NSMutableArray *dashFeeds = [NSMutableArray arrayWithObjects:[DHFeed feedWithFeed:@\"NET_Framework.xml\" icon:@\"net\" aliases:@[@\"Microsoft .NET Framework\", @\"C#\", @\"f#\", @\"vb\", @\"visual basic\", @\"visualbasic\", @\"vstudio\", @\"visual studio\", @\"msdn\", @\"Microsoft Developer Network\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ActionScript.xml\" icon:@\"actionscript\" aliases:@[@\"adobe flash as3\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Akka.xml\" icon:@\"akka\" aliases:@[@\"scala\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Android.xml\" icon:@\"android\" aliases:@[@\"java\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Angular.xml\" icon:@\"angular\" aliases:@[@\"google angularjs\", @\"google angular.js\", @\"angular2\", @\"angular 2\", @\"angularjs 2\", @\"angular.js 2\", @\"google angularts\", @\"angular.io angular for typescript angular for ts angular.typescript angular.ts angulartypescript\", @\"google angular.ts\", @\"angular2\", @\"angular 2\", @\"angularts 2\", @\"angular.ts 2\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"AngularJS.xml\" icon:@\"angularjs\" aliases:@[@\"google angularjs\", @\"google angular.js\", @\"angular\", @\"angularjs\", @\"angular.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ansible.xml\" icon:@\"ansible\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Apache_HTTP_Server.xml\" icon:@\"apache\" aliases:@[@\"httpd\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Appcelerator_Titanium.xml\" icon:@\"titanium\" aliases:@[@\"Appcelerator Platform\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Apple_API_Reference.xml\" icon:@\"apple\" aliases:@[@\"leopard\", @\"snow leopard\", @\"lion\", @\"mountain lion\", @\"mavericks\", @\"yosemite\", @\"macos sierra\", @\"10.10\", @\"10.8\", @\"10.6\", @\"mac osx\", @\"10.7\", @\"10.9\", @\"10.5\", @\"xcode\", @\"apple\", @\"cocoa\", @\"objective-c\", @\"objc\", @\"macosx\", @\"macos x\", @\"swift\", @\"iphone\", @\"ipad\", @\"cocoa touch\", @\"tvos\", @\"tvservices\", @\"apple tv\", @\"ios\", @\"iphoneos\", @\"watchkit\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"AppleScript.xml\" icon:@\"applescript\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Arduino.xml\" icon:@\"arduino\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"AWS_JavaScript.xml\" icon:@\"awsjs\" aliases:@[@\"aws nodejs\", @\"aws node.js\", @\"amazon\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"BackboneJS.xml\" icon:@\"backbone\" aliases:@[@\"backbone.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Bash.xml\" icon:@\"bash\" aliases:@[@\"bash shell\", @\"terminal\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Boost.xml\" icon:@\"boost\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Bootstrap_2.xml\" icon:@\"bootstrap\" aliases:@[@\"twitter bootstrap\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Bootstrap_3.xml\" icon:@\"bootstrap\" aliases:@[@\"twitter bootstrap\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Bootstrap_4.xml\" icon:@\"bootstrap\" aliases:@[@\"twitter bootstrap\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Bourbon.xml\" icon:@\"bourbon\" aliases:@[@\"ruby gems\", @\"rubygems\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"C.xml\" icon:@\"c\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"C++.xml\" icon:@\"cpp\" aliases:@[@\"cpp\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"CakePHP.xml\" icon:@\"cakephp\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Cappuccino.xml\" icon:@\"cappuccino\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Chai.xml\" icon:@\"chai\" aliases:@[@\"chaijs assertion library\", @\"chai.js assertion library\", @\"chai assertion library\", @\"nodejs\", @\"node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Chef.xml\" icon:@\"chef\" aliases:@[@\"opscode chef\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Clojure.xml\" icon:@\"clojure\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"CMake.xml\" icon:@\"cmake\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Cocos2D.xml\" icon:@\"cocos2d\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Cocos2D-X.xml\" icon:@\"cocos2dx\" aliases:@[@\"cocos2dx\", @\"cocos2d_x\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Cocos3D.xml\" icon:@\"cocos2d\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"CodeIgniter.xml\" icon:@\"codeigniter\" aliases:@[@\"ellislab codeigniter\", @\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"CoffeeScript.xml\" icon:@\"coffee\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ColdFusion.xml\" icon:@\"cf\" aliases:@[@\"adobe coldfusion\", @\"cfml\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Common_Lisp.xml\" icon:@\"lisp\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Compass.xml\" icon:@\"compass\" aliases:@[@\"ruby gems\", @\"rubygems\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Cordova.xml\" icon:@\"cordova\" aliases:@[@\"Apache Cordova\", @\"adobe PhoneGap\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Corona.xml\" icon:@\"corona\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"CouchDB.xml\" icon:@\"couchdb\" aliases:@[@\"Apache CouchDB\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Craft.xml\" icon:@\"craft\" aliases:@[@\"craft cms\", @\"craftcms.com\", @\"buildwithcraft.com\", @\"build with craft cms\", @\"php\", @\"yii2\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"CSS.xml\" icon:@\"css\" aliases:@[@\"mdn\", @\"mozilla developer network\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"D3JS.xml\" icon:@\"d3\" aliases:@[@\"d3.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Dart.xml\" icon:@\"dartlang\" aliases:@[@\"dart.js\", @\"dartjs\", @\"dartlang\", @\"dart.js lang\", @\"dart lang\", @\"dartjs lang\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Django.xml\" icon:@\"django\" aliases:@[@\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Doctrine_ORM.xml\" icon:@\"doctrine\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Docker.xml\" icon:@\"docker\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Dojo.xml\" icon:@\"dojo\" aliases:@\"dojo toolkit\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"DOM.xml\" icon:@\"dom\" aliases:@[@\"dom events\", @\"mdn\", @\"mozilla developer network\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Drupal_7.xml\" icon:@\"drupal\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Drupal_8.xml\" icon:@\"drupal\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ElasticSearch.xml\" icon:@\"elasticsearch\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Elixir.xml\" icon:@\"elixir\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Emacs_Lisp.xml\" icon:@\"elisp\" aliases:@[@\"elisp\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"EmberJS.xml\" icon:@\"ember\" aliases:@[@\"ember-data\", @\"ember data\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Emmet.xml\" icon:@\"emmet\" aliases:@[@\"emmet.io\", @\"emmetio\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Erlang.xml\" icon:@\"erlang\" aliases:@[@\"Erlang OTP\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Express.xml\" icon:@\"express\" aliases:@[@\"expressjs\", @\"nodejs\", @\"node.js\", @\"express.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ExpressionEngine.xml\" icon:@\"ee\" aliases:@[@\"ellislab expressionengine ee\", @\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ExtJS.xml\" icon:@\"extjs\" aliases:@[@\"sencha extjs\", @\"sencha ext.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Flask.xml\" icon:@\"flask\" aliases:@[@\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Font_Awesome.xml\" icon:@\"awesome\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Foundation.xml\" icon:@\"foundation\" aliases:@\"zurb foundation\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"GLib.xml\" icon:@\"glib\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Go.xml\" icon:@\"go\" aliases:@[@\"google golang\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Gradle_DSL.xml\" icon:@\"gradle\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Gradle_Java_API.xml\" icon:@\"gradle\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Gradle_User_Guide.xml\" icon:@\"gradle\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Grails.xml\" icon:@\"grails\" aliases:@[@\"java\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Groovy.xml\" icon:@\"groovy\" aliases:@[@\"java\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Groovy_JDK.xml\" icon:@\"groovy\" aliases:@[@\"java\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Grunt.xml\" icon:@\"grunt\" aliases:@[@\"nodejs\", @\"node.js\", @\"grunt.js\", @\"gruntjs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Gulp.xml\" icon:@\"gulp\" aliases:@[@\"nodejs\", @\"node.js\", @\"gulp.js\", @\"gulpjs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Haml.xml\" icon:@\"haml\" aliases:@[@\"ruby gems\", @\"rubygems\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Handlebars.xml\" icon:@\"handlebars\" aliases:@[@\"nodejs\", @\"node.js\", @\"handlebars.js\", @\"handlebarsjs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Haskell.xml\" icon:@\"haskell\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"HTML.xml\" icon:@\"html\" aliases:@[@\"mdn\", @\"mozilla developer network\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Ionic.xml\" icon:@\"ionic\" aliases:@[@\"ionic framework\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"iOS.xml\" icon:@\"iphone\" aliases:@[@\"iphone\", @\"ipad\", @\"xcode\", @\"apple\", @\"cocoa touch\", @\"objective-c\", @\"objc\", @\"swift\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Jasmine.xml\" icon:@\"jasmine\" aliases:@[@\"jasminejs\", @\"jasmine.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Java_EE6.xml\" icon:@\"jee6\" aliases:@[@\"javaee6\", @\"jee6\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_EE7.xml\" icon:@\"jee7\" aliases:@[@\"javaee7\", @\"jee7\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_EE8.xml\" icon:@\"jee8\" aliases:@[@\"javaee8\", @\"jee8\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE6.xml\" icon:@\"java\" aliases:@[@\"javase6\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE7.xml\" icon:@\"java\" aliases:@[@\"javase7\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE8.xml\" icon:@\"java\" aliases:@[@\"javase8\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE9.xml\" icon:@\"java\" aliases:@[@\"javase9\", @\"javafx\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE10.xml\" icon:@\"java\" aliases:@[@\"javase10\", @\"javafx\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Java_SE11.xml\" icon:@\"java\" aliases:@[@\"javase11\", @\"javafx\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"JavaScript.xml\" icon:@\"javascript\" aliases:@[@\"mdn\", @\"mozilla developer network\", @\"dom events\", @\"canvas\", @\"js\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Jekyll.xml\" icon:@\"jekyll\" aliases:@[@\"jekyllrb jekyll.rb jekyll ruby\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Jinja.xml\" icon:@\"jinja\" aliases:@[@\"python jinja2 template engine jinja 2 template engine\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Joomla.xml\" icon:@\"joomla\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"jQuery.xml\" icon:@\"jQuery\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"jQuery_Mobile.xml\" icon:@\"jquerym\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"jQuery_UI.xml\" icon:@\"jqueryui\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Julia.xml\" icon:@\"julia\" aliases:@[@\"julialang\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"KnockoutJS.xml\" icon:@\"knockout\" aliases:@[@\"knockout.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Kobold2D.xml\" icon:@\"kobold2d\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"LaTeX.xml\" icon:@\"latex\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Laravel.xml\" icon:@\"laravel\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Less.xml\" icon:@\"less\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Lo-Dash.xml\" icon:@\"lodash\" aliases:@[@\"lodash\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Lua_5.1.xml\" icon:@\"lua\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Lua_5.2.xml\" icon:@\"lua\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Lua_5.3.xml\" icon:@\"lua\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"MarionetteJS.xml\" icon:@\"marionette\" aliases:@[@\"backbone marionette.js\", @\"backbone.marionette.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Markdown.xml\" icon:@\"markdown\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"MatPlotLib.xml\" icon:@\"matplotlib\" aliases:@[@\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Meteor.xml\" icon:@\"meteor\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Mocha.xml\" icon:@\"mocha\" aliases:@[@\"mochajs mocha.js\", @\"nodejs\", @\"node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"MomentJS.xml\" icon:@\"moment\" aliases:@[@\"moment.js\", @\"nodejs\", @\"node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"MongoDB.xml\" icon:@\"mongodb\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Mongoose.xml\" icon:@\"mongoose\" aliases:@[@\"nodejs\", @\"node.js\", @\"mongoose.js\", @\"mongoosejs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Mono.xml\" icon:@\"mono\" aliases:@[@\"xamarin\", @\"mono touch\", @\"monotouch\", @\"monoios\", @\"mono for ios\", @\"mono android\", @\"monoandroid\", @\"mono for android\", @\"mono mac\", @\"monomac\", @\"mono for mac\", @\"monoosx\", @\"mono osx\", @\"mono for osx\", @\"xamarin.ios\", @\"xamarin.mac\", @\"xamarin.android\", @\"xamarin.osx\", @\"xamarin ios\", @\"xamarin mac\", @\"xamarin android\", @\"xamarin osx\", @\"xamarin for ios\", @\"xamarin for mac\", @\"xamarin for android\", @\"xamarin for osx\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"MooTools.xml\" icon:@\"moo\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"MySQL.xml\" icon:@\"mysql\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Neat.xml\" icon:@\"neat\" aliases:@[@\"bourbon neat\", @\"ruby gems\", @\"rubygems\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Nginx.xml\" icon:@\"nginx\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"NodeJS.xml\" icon:@\"nodejs\" aliases:@[@\"node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"NumPy.xml\" icon:@\"numpy\" aliases:@[@\"scipy\", @\"sci.py\", @\"num.py\", @\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"OCaml.xml\" icon:@\"ocaml\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"OpenCV.xml\" icon:@\"opencv\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"OpenGL_2.xml\" icon:@\"gl2\" aliases:@[@\"opengl2\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"OpenGL_3.xml\" icon:@\"gl3\" aliases:@[@\"opengl3\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"OpenGL_4.xml\" icon:@\"gl4\" aliases:@[@\"opengl4 glsl openglsl\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"macOS.xml\" icon:@\"Mac\" aliases:@[@\"leopard\", @\"snow leopard\", @\"lion\", @\"mountain lion\", @\"mavericks\", @\"yosemite\", @\"10.10\", @\"10.8\", @\"10.6\", @\"mac osx\", @\"mac os x\", @\"10.7\", @\"10.9\", @\"10.5\", @\"xcode\", @\"apple\", @\"cocoa\", @\"macosx\", @\"macos x\", @\"objective-c\", @\"objc\", @\"swift\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Pandas.xml\" icon:@\"pandas\" aliases:@[@\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Perl.xml\" icon:@\"perl\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Phalcon.xml\" icon:@\"phalcon\" aliases:@[@\"cphalcon\", @\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"PhoneGap.xml\" icon:@\"phonegap\" aliases:@\"Apache Cordova adobe phonegap\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"PHP.xml\" icon:@\"php\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"PHPUnit.xml\" icon:@\"phpunit\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Play_Java.xml\" icon:@\"playjava\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Play_Scala.xml\" icon:@\"playscala\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Polymer.dart.xml\" icon:@\"polymerdart\" aliases:@[@\"polymer.dart.js\", @\"polymer.dartjs\", @\"polymer.dartlang\", @\"polymer.dart.js lang\", @\"polymer.dart lang\", @\"polymer.dartjs lang\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"PostgreSQL.xml\" icon:@\"psql\" aliases:@[@\"psql\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Processing.xml\" icon:@\"processing\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"PrototypeJS.xml\" icon:@\"prototype\" aliases:@[@\"prototype.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Pug.xml\" icon:@\"pug\" aliases:@[@\"jade\", @\"node.js\", @\"nodejs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Puppet.xml\" icon:@\"puppet\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Python_2.xml\" icon:@\"python\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Python_3.xml\" icon:@\"python\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Qt_4.xml\" icon:@\"qt\" aliases:@[@\"qt4\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Qt_5.xml\" icon:@\"qt\" aliases:@[@\"qt5\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"R.xml\" icon:@\"r\" aliases:@[@\"r language\", @\"r project\", @\"gnu s\", @\"rlanguage\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Racket.xml\" icon:@\"racket\" aliases:@[@\"racketlang racket-lang\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"React.xml\" icon:@\"react\" aliases:@[@\"facebook react.js reactjs\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Redis.xml\" icon:@\"redis\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"RequireJS.xml\" icon:@\"require\" aliases:@[@\"require.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ruby.xml\" icon:@\"ruby\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ruby_2.xml\" icon:@\"ruby\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ruby_on_Rails_3.xml\" icon:@\"rails\" aliases:@\"ror\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ruby_on_Rails_4.xml\" icon:@\"rails\" aliases:@\"ror\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Ruby_on_Rails_5.xml\" icon:@\"rails\" aliases:@\"ror\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"RubyMotion.xml\" icon:@\"rubymotion\" aliases:nil doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Rust.xml\" icon:@\"rust\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SailsJS.xml\" icon:@\"sails\" aliases:@[@\"nodejs sails.js node.js sails.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SaltStack.xml\" icon:@\"salt\" aliases:@[@\"python\", @\"salt stack\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Sass.xml\" icon:@\"sass\" aliases:@[@\"ruby gems\", @\"rubygems\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Scala.xml\" icon:@\"scala\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SciPy.xml\" icon:@\"scipy\" aliases:@[@\"numpy\", @\"sci.py\", @\"num.py\", @\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Semantic_UI.xml\" icon:@\"semantic\" aliases:@[@\"Semantic UI\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Sencha_Touch.xml\" icon:@\"sencha\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Sinon.xml\" icon:@\"sinon\" aliases:@[@\"sinonjs nodejs\", @\"sinon.js node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Smarty.xml\" icon:@\"smarty\" aliases:@[@\"Smarty Template Engine\", @\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Sparrow.xml\" icon:@\"sparrow\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Spring_Framework.xml\" icon:@\"spring\" aliases:@[@\"spring.io\", @\"java\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SproutCore.xml\" icon:@\"SproutCore\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SQLAlchemy.xml\" icon:@\"sqlalchemy\" aliases:@[@\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SQLite.xml\" icon:@\"sqlite\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Statamic.xml\" icon:@\"statamic\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Stylus.xml\" icon:@\"stylus\" aliases:@[@\"nodejs\", @\"node.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Susy.xml\" icon:@\"susy\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"SVG.xml\" icon:@\"svg\" aliases:@[@\"mdn\", @\"mozilla developer network\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Swift.xml\" icon:@\"swift\" aliases:@[@\"leopard\", @\"snow leopard\", @\"lion\", @\"mountain lion\", @\"mavericks\", @\"yosemite\", @\"10.10\", @\"10.8\", @\"10.6\", @\"mac osx\", @\"10.7\", @\"10.9\", @\"10.5\", @\"xcode\", @\"apple\", @\"cocoa\", @\"objective-c\", @\"objc\", @\"iphone\", @\"ipad\", @\"cocoa touch\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Symfony.xml\" icon:@\"symfony\" aliases:@[@\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Tcl.xml\" icon:@\"tcl\" aliases:@[@\"tcl/tk\", @\"tcltk\", @\"tcl tk\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Tornado.xml\" icon:@\"tornado\" aliases:@[@\"python\", @\"tornado web server\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"tvOS.xml\" icon:@\"tvos\" aliases:@[@\"tvos\", @\"xcode\", @\"apple\", @\"cocoa\", @\"objective-c\", @\"objc\", @\"swift\", @\"tvservices\", @\"apple tv\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Twig.xml\" icon:@\"twig\" aliases:@[@\"Twig Template Engine\", @\"php\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Twisted.xml\" icon:@\"twisted\" aliases:@[@\"twisted matrix\", @\"python\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"TypeScript.xml\" icon:@\"typescript\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"TYPO3.xml\" icon:@\"typo3\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"UnderscoreJS.xml\" icon:@\"underscore\" aliases:@[@\"underscore.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Unity_3D.xml\" icon:@\"unity3d\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Vagrant.xml\" icon:@\"vagrant\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Vim.xml\" icon:@\"vim\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"VMware_vSphere.xml\" icon:@\"vsphere\" aliases:nil doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"VueJS.xml\" icon:@\"vue\" aliases:@[@\"nodejs vue.js node.js vue.js\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"watchOS.xml\" icon:@\"watchos\" aliases:@[@\"iphoneos\", @\"ios\", @\"ipad\", @\"xcode\", @\"apple\", @\"cocoa touch\", @\"objective-c\", @\"objc\", @\"swift\", @\"watchkit\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"WordPress.xml\" icon:@\"wordpress\" aliases:@[@\"php\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Xamarin.xml\" icon:@\"xamarin\" aliases:@[@\"xamarin.ios\", @\"xamarin.mac\", @\"xamarin.android\", @\"xamarin.osx\", @\"xamarin ios\", @\"xamarin mac\", @\"xamarin android\", @\"xamarin osx\", @\"xamarin for ios\", @\"xamarin for mac\", @\"xamarin for android\", @\"xamarin for osx\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Xojo.xml\" icon:@\"xojo\" aliases:@[@\"realbasic\", @\"real basic\", @\"real studio\", @\"realstudio\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"XSLT.xml\" icon:@\"xslt\" aliases:@[@\"mdn\", @\"mozilla developer network\", @\"exslt\", @\"xpath\"] doesNotHaveVersions:YES],\n                           [DHFeed feedWithFeed:@\"Yii.xml\" icon:@\"yii\" aliases:@\"yii framework yii2 framework php\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"YUI.xml\" icon:@\"yui\" aliases:@\"yui library\" doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Zend_Framework_1.xml\" icon:@\"zend\" aliases:@[@\"zf1\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Zend_Framework_2.xml\" icon:@\"zend\" aliases:@[@\"zf2\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"Zend_Framework_3.xml\" icon:@\"zend\" aliases:@[@\"zf3\"] doesNotHaveVersions:NO],\n                           [DHFeed feedWithFeed:@\"ZeptoJS.xml\" icon:@\"zepto\" aliases:@[@\"Zepto.js\"] doesNotHaveVersions:NO],\n                           nil];\n    NSArray *savedFeeds = [[NSUserDefaults standardUserDefaults] objectForKey:[self defaultsKey]];\n    for(NSDictionary *feedDictionary in savedFeeds)\n    {\n        DHFeed *savedFeed = [DHFeed feedWithDictionaryRepresentation:feedDictionary];\n        if([@[@\"http://kapeli.com/feeds/OS_X.xml\", @\"http://kapeli.com/feeds/watchOS.xml\", @\"http://kapeli.com/feeds/iOS.xml\", @\"http://kapeli.com/feeds/tvOS.xml\", @\"http://kapeli.com/feeds/Jade.xml\", @\"http://kapeli.com/feeds/JavaFX.xml\", @\"http://kapeli.com/feeds/Angular.dart.xml\", @\"http://kapeli.com/feeds/AngularTS.xml\", @\"http://kapeli.com/feeds/Gradle_Groovy_API.xml\", @\"http://kapeli.com/feeds/XUL.xml\", @\"http://kapeli.com/feeds/OpenCV_C.xml\", @\"http://kapeli.com/feeds/OpenCV_C++.xml\", @\"http://kapeli.com/feeds/OpenCV_Java.xml\", @\"http://kapeli.com/feeds/OpenCV_Python.xml\"] containsObject:savedFeed.feedURL])\n        {\n            if(savedFeed.installed)\n            {\n                NSString *trashPath = [self uniqueTrashPath];\n                NSString *feedPath = [self docsetPathForFeed:savedFeed];\n                NSFileManager *fileManager = [NSFileManager defaultManager];\n                [[DHDocsetManager sharedManager] removeDocsetsInFolder:feedPath];\n                [fileManager moveItemAtPath:feedPath toPath:trashPath error:nil];\n                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{\n                    [self emptyTrashAtPath:trashPath];\n                });\n            }\n            savedFeed.installed = NO;\n            savedFeed.installedVersion = nil;\n        }\n        if([@[@\"http://kapeli.com/feeds/OS_X.xml\", @\"http://kapeli.com/feeds/Jade.xml\", @\"http://kapeli.com/feeds/JavaFX.xml\", @\"http://kapeli.com/feeds/Apple_Guides_and_Sample_Code.xml\", @\"http://kapeli.com/feeds/Angular.dart.xml\", @\"http://kapeli.com/feeds/AngularTS.xml\", @\"http://kapeli.com/feeds/Gradle_Groovy_API.xml\", @\"http://kapeli.com/feeds/XUL.xml\", @\"http://kapeli.com/feeds/OpenCV_C.xml\", @\"http://kapeli.com/feeds/OpenCV_C++.xml\", @\"http://kapeli.com/feeds/OpenCV_Java.xml\", @\"http://kapeli.com/feeds/OpenCV_Python.xml\"] containsObject:savedFeed.feedURL])\n        {\n            continue;\n        }\n        NSUInteger index = [dashFeeds indexOfObjectPassingTest:^BOOL(DHFeed *obj, NSUInteger idx, BOOL *stop) {\n            return [[obj feed] isEqualToString:savedFeed.feed];\n        }];\n        if(index != NSNotFound)\n        {\n            DHFeed *dashFeed = dashFeeds[index];\n            dashFeed.installed = savedFeed.installed;\n            dashFeed.installedVersion = savedFeed.installedVersion;\n            dashFeed.size = savedFeed.size;\n        }\n        else\n        {\n            [dashFeeds addObject:savedFeed];\n        }\n    }\n    [dashFeeds sortUsingFunction:compareFeeds context:nil];\n    self.feeds = dashFeeds;\n}\n\n- (NSString *)installFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    NSObject *identifier = [[NSObject alloc] init];\n    feed.identifier = identifier;\n    feed.waiting = YES;\n    BOOL didStallOnce = NO;\n    BOOL didSetStallLabel = NO;\n    while([self shouldStall] && feed.installing && feed.identifier == identifier)\n    {\n        if(didStallOnce && !didSetStallLabel)\n        {\n            didSetStallLabel = YES;\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                [feed setDetailString:@\"Waiting...\"];\n                [[feed cell].titleLabel setRightDetailText:@\"Waiting...\" adjustMainWidth:YES];\n                [feed setMaxRightDetailWidth:[feed cell].titleLabel.maxRightDetailWidth];\n            });\n        }\n        didStallOnce = YES;\n        [NSThread sleepForTimeInterval:1.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    feed.waiting = NO;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *installPath = [self docsetPathForFeed:feed];\n    NSString *tempPath = [self uniqueTempDirAtPath:installPath];\n    NSString *tempFile = [tempPath stringByAppendingPathComponent:@\"dash_temp_docset.tgz\"];\n    NSString *tarixFile = [tempFile stringByAppendingString:@\".tarix\"];\n    \n    __block BOOL shouldWait = NO;\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        shouldWait = [[DHLatencyTester sharedLatency] performTests:NO];\n    });\n    if(shouldWait)\n    {\n        [NSThread sleepForTimeInterval:3.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    NSString *error = nil;\n    DHFeedResult *feedResult = [self loadFeed:feed error:&error];\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    if(feedResult && feed.installing)\n    {\n        feed.feedResult = feedResult;\n        feedResult.feed = feed;\n        NSError *downloadError = nil;\n        if(feedResult.downloadURLs.count)\n        {\n            NSString *downloadURL = feedResult.downloadURLs[0];\n            [self emptyTrashAtPath:tempPath];\n            if(![fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil])\n            {\n                return @\"Couldn't create install directory.\";\n            }\n            if([feedResult isCancelled])\n            {\n                [self emptyTrashAtPath:tempPath];\n                return @\"cancelled\";\n            }\n            NSURL *url = [NSURL URLWithString:downloadURL];\n            if(url)\n            {\n                BOOL result = NO;\n                NSURL *tarixURL = [NSURL URLWithString:[[downloadURL stringByAppendingString:@\".tarix\"] stringByConvertingKapeliHttpURLToHttps]];\n                feedResult.hasTarix = [NSURL URLIsFound:[tarixURL absoluteString] timeoutInterval:120.0f checkForRedirect:YES];\n                downloadError = nil;\n#ifdef DEBUG\n                NSLog(@\"Downloading %@\", url);\n#endif\n                if([DHFileDownload downloadItemAtURL:url toFile:tempFile error:&downloadError delegate:self identifier:feedResult] && !downloadError)\n                {\n                    if([feedResult isCancelled])\n                    {\n                        [self emptyTrashAtPath:tempPath];\n                        return @\"cancelled\";\n                    }\n                    \n                    [feedResult setRightDetail:@\"Waiting...\"];\n                    @synchronized([DHDocsetIndexer class])\n                    {\n                        if(!feedResult.hasTarix)\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            result = [DHUnarchiver unarchiveArchive:tempFile delegate:feedResult];\n                        }\n                        else\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Preparing...\"];\n                            result = [DHFileDownload downloadItemAtURL:tarixURL toFile:tarixFile error:nil delegate:nil identifier:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't download index file.\";\n                            }\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Extracting...\"];\n                            result = [DHUnarchiver unarchiveArchive:tarixFile delegate:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive index file.\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            tarixFile = [fileManager firstFileWithExtension:@\"tarix\" atPath:tempPath ignoreHidden:YES];\n                            if(!tarixFile)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't find index file.\";\n                            }\n                            tarixFile = [tempPath stringByAppendingPathComponent:tarixFile];\n                            result = [DHUnarchiver unpackTarixDocset:tempFile tarixPath:tarixFile delegate:feedResult];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive docset.\";\n                            }\n                        }\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        if(!result)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't unarchive docset.\";\n                        }\n                        \n                        if(!feedResult.hasTarix)\n                        {\n                            [fileManager removeItemAtPath:tempFile error:nil];\n                        }\n                        DHDocset *docset = [DHDocset firstDocsetInsideFolder:tempPath];\n                        if(!docset)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't install docset.\";\n                        }\n                        else if(feedResult.hasTarix)\n                        {\n                            [fileManager moveItemAtPath:tarixFile toPath:docset.tarixIndexPath error:nil];\n                            [fileManager moveItemAtPath:tempFile toPath:docset.tarixPath error:nil];\n                        }\n                        [DHDocsetIndexer indexerForDocset:docset delegate:feedResult];\n                        [fileManager removeItemAtPath:docset.sqlPath error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-shm\"] error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-wal\"] error:nil];\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:installPath];\n                        NSString *file = nil;\n                        while(file = [dirEnum nextObject])\n                        {\n                            [dirEnum skipDescendents];\n                            NSString *filePath = [installPath stringByAppendingPathComponent:file];\n                            if(![filePath isEqualToString:tempPath])\n                            {\n                                NSString *trashPath = [self uniqueTrashPath];\n                                [fileManager moveItemAtPath:filePath toPath:trashPath error:nil];\n                                dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n                                dispatch_async(queue, ^{\n                                    [self emptyTrashAtPath:trashPath];\n                                });\n                            }\n                        }\n                        [fileManager moveItemAtPath:docset.path toPath:[installPath stringByAppendingPathComponent:[docset.path lastPathComponent]] error:nil];\n                        [self emptyTrashAtPath:tempPath];\n                        return nil;\n                    }\n                }\n                else if(downloadError.code == DHDownloadCancelled)\n                {\n                    [self emptyTrashAtPath:tempPath];\n                    return @\"cancelled\";\n                }\n                else\n                {\n                    [self emptyTrashAtPath:tempPath];\n                }\n            }\n        }\n        return @\"Couldn't download docset.\";\n    }\n    else\n    {\n        return error;\n    }\n    return nil;\n}\n\n// This does not modify the feed at all\n- (DHFeedResult *)loadFeed:(DHFeed *)feed error:(NSString **)returnError\n{\n    @try\n    {\n        __block NSError *error = nil;\n        NSString *originalFeedURL = feed.feedURL;\n        NSString *lastPathComponent = [originalFeedURL lastPathComponent];\n        BOOL isDash = !feed.isCustom;\n        if(originalFeedURL)\n        {\n            NSMutableArray *feedURLs = [NSMutableArray arrayWithObject:originalFeedURL];\n            if(isDash)\n            {\n                NSString *cdnFeedURL = [originalFeedURL substringFromStringReturningNil:@\"/feeds/\"];\n                cdnFeedURL = (cdnFeedURL) ? [[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingString:cdnFeedURL] : nil;\n                cdnFeedURL = [cdnFeedURL stringByConvertingKapeliHttpURLToHttps];\n                if(cdnFeedURL)\n                {\n                    feedURLs = [NSMutableArray arrayWithObject:cdnFeedURL];\n                    NSString *secondBest = [[[DHLatencyTester sharedLatency] secondBestMirror] stringByAppendingString:[originalFeedURL substringFromStringReturningNil:@\"/feeds/\"]];\n                    secondBest = [secondBest stringByConvertingKapeliHttpURLToHttps];\n                    [feedURLs addObject:secondBest];\n                }\n                else\n                {\n                    [feedURLs addObject:[@\"https://kapeli.com/feeds/\" stringByAppendingString:lastPathComponent]];\n                }\n            }\n            NSCondition *condition = [[NSCondition alloc] init];\n            NSMutableArray *xmls = [NSMutableArray array];\n            NSLock *workerLock = [[NSLock alloc] init];\n            __block BOOL succeeded = NO;\n            __block NSInteger workerCount = feedURLs.count;\n            for(NSString *feedURL in feedURLs)\n            {\n                dispatch_queue_t myQueue = dispatch_queue_create([feedURL UTF8String], 0);\n                dispatch_async(myQueue, ^{\n                    NSURL *xmlURL = [NSURL URLWithString:feedURL];\n                    BOOL didSucceed = NO;\n                    NSError *workingError = nil;\n                    if(xmlURL)\n                    {\n                        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:xmlURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:90.0f];\n                        [request setValue:[[NSBundle mainBundle] bundleIdentifier] forHTTPHeaderField:@\"User-Agent\"];\n                        NSURLResponse *response = nil;\n                        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&workingError];\n                        if(data && !workingError)\n                        {\n                            NSString *xmlString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n                            if(xmlString && xmlString.length)\n                            {\n                                NSXMLDocument *xml = [[NSXMLDocument alloc] initWithXMLString:xmlString options:0 error:&workingError];\n                                NSXMLElement *root = [xml rootElement];\n                                if([[root name] isCaseInsensitiveEqual:@\"feed\"])\n                                {\n                                    root = [[root elementsForName:@\"entry\"] count] > 0 ? [root elementsForName:@\"entry\"][0] : nil;\n                                }\n                                if(xml && root && ([root elementsForName:@\"version\"].count || [root elementsForName:@\"docset:version\"].count) && ([root elementsForName:@\"url\"].count || [root elementsForName:@\"link\"].count))\n                                {\n                                    [xmls addObject:xml];\n                                    [condition lock];\n                                    [condition signal];\n                                    [condition unlock];\n                                    didSucceed = YES;\n                                }\n                            }\n                        }\n                    }\n                    [workerLock lock];\n                    if(didSucceed)\n                    {\n                        succeeded = YES;\n                    }\n                    BOOL otherSucceeded = succeeded;\n                    --workerCount;\n                    BOOL isLast = workerCount == 0;\n                    [workerLock unlock];\n                    if(isLast && !didSucceed && !otherSucceeded)\n                    {\n                        error = workingError;\n                        [condition lock];\n                        [condition signal];\n                        [condition unlock];\n                    }\n                });\n            }\n            [condition lock];\n            [condition wait];\n            [condition unlock];\n            \n            NSXMLDocument *xml = nil;\n            if(xmls.count)\n            {\n                xml = xmls[0];\n            }\n            if(!xml)\n            {\n                if([error localizedDescription])\n                {\n                    *returnError = @\"Unable to load docset feed.\";\n                }\n                return nil;\n            }\n            else\n            {\n                NSXMLElement *root = [xml rootElement];\n                BOOL isXcode = NO;\n                if([[root name] isCaseInsensitiveEqual:@\"feed\"])\n                {\n                    root = [[root elementsForName:@\"entry\"] count] > 0 ? [root elementsForName:@\"entry\"][0] : nil;\n                    isXcode = YES;\n                }\n                if(root)\n                {\n                    if([[root name] isCaseInsensitiveEqual:@\"entry\"])\n                    {\n                        NSArray *versions = [root elementsForName:(!isXcode) ? @\"version\" : @\"docset:version\"];\n                        NSString *iosVersion = [[[root elementsForName:@\"ios_version\"] firstObject] stringValue];\n                        if(versions.count == 1)\n                        {\n                            if([versions[0] stringValue].length)\n                            {\n                                DHFeedResult *result = [[DHFeedResult alloc] init];\n                                NSString *version = [versions[0] stringValue];\n                                if(iosVersion && iosVersion.length)\n                                {\n                                    version = [version stringByAppendingFormat:@\"/%@\", iosVersion];\n                                }\n                                result.version = version;\n                                NSArray *docsetURLs = [root elementsForName:(!isXcode) ? @\"url\" : @\"link\"];\n                                NSMutableArray *urlResults = [NSMutableArray array];\n                                for(NSXMLElement *docsetURL in docsetURLs)\n                                {\n                                    NSString *urlString = (!isXcode) ? [docsetURL stringValue] : [[docsetURL attributeForName:@\"href\"] stringValue];\n                                    if(urlString.length)\n                                    {\n                                        [urlResults addObject:[urlString trimWhitespace]];\n                                    }\n                                }\n                                if(isDash)\n                                {\n                                    [[DHLatencyTester sharedLatency] sortURLsBasedOnLatency:urlResults];\n                                }\n                                if(urlResults.count)\n                                {\n                                    if(isXcode && [root elementsForName:@\"title\"].count)\n                                    {\n                                        NSString *xcodeName = [[root elementsForName:@\"title\"][0] stringValue];\n                                        if(xcodeName && xcodeName.length)\n                                        {\n//                                            [feed setObject:xcodeName forKey:@\"xcodeName\"];\n                                        }\n                                    }\n                                    result.downloadURLs = urlResults;\n                                    return result;\n                                }\n                                else\n                                {\n                                    *returnError = @\"Unable to load docset feed.\";\n                                }\n                            }\n                        }\n                    }\n                }\n                *returnError = @\"Unable to parse docset feed.\";\n                return nil;\n            }\n        }\n    }\n    @catch (NSException *exception) \n    {\n        NSLog(@\"FIXME: exception in loadFeed: %@\", exception);\n        NSLog(@\"%@\", [NSThread callStackSymbols]);\n    }\n    return nil;\n}\n\n- (NSString *)docsetInstallFolderName\n{\n    return @\"Dash\";\n}\n\n- (BOOL)canInstallFeed:(DHFeed *)feed\n{\n    NSString *title = nil;\n    NSString *message = nil;\n    if([feed.feedURL isEqualToString:@\"http://kapeli.com/feeds/DOM.xml\"])\n    {\n        title = @\"DOM Documentation\";\n        message = @\"There is no DOM docset. DOM documentation can be found in the JavaScript docset. Please install the JavaScript docset instead.\";\n    }\n    else if([feed.feedURL isEqualToString:@\"http://kapeli.com/feeds/RubyMotion.xml\"])\n    {\n        title = @\"RubyMotion Documentation\";\n        message = @\"RubyMotion had to remove its API documentation due to legal reasons. Please contact the RubyMotion team for more details.\\n\\nIn the meantime, you can use the Apple API Reference docset instead.\";\n    }\n    else if([feed.feedURL isEqualToString:@\"http://kapeli.com/feeds/Apple_API_Reference.xml\"])\n    {\n        title = @\"Apple API Reference\";\n        message = @\"To install the Apple API Reference docset you need to:\\n\\n1. Use Dash for macOS to install the Apple API Reference docset from Preferences > Downloads\\n2. Go to Preferences > Docsets, right click the Apple API Reference docset and select \\\"Generate iOS Compatible Docset\\\"\\n3. Transfer the resulting docset using iTunes File Sharing or AirDrop\";\n    }\n    else if([@[@\"http://kapeli.com/feeds/OS_X.xml\", @\"http://kapeli.com/feeds/macOS.xml\", @\"http://kapeli.com/feeds/watchOS.xml\", @\"http://kapeli.com/feeds/iOS.xml\", @\"http://kapeli.com/feeds/tvOS.xml\"] containsObject:feed.feedURL])\n    {\n        title = @\"Apple API Reference\";\n        NSString *name = [[[feed.feedURL lastPathComponent] stringByDeletingPathExtension] stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"];\n        message = [NSString stringWithFormat:@\"There is no %@ docset. The documentation for %@ can be found inside the Apple API Reference docset. \\n\\nTo install the Apple API Reference docset you need to:\\n\\n1. Use Dash for macOS to install the docset from Preferences > Downloads\\n2. Go to Preferences > Docsets, right click the Apple API Reference docset and select \\\"Generate iOS-compatible Docset\\\"\\n3. Transfer the resulting docset using iTunes File Sharing or AirDrop\", name, name];\n    }\n    \n    if(title && message)\n    {\n        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil];\n        [alert show];\n        return NO;\n    }\n    return YES;\n}\n\n+ (instancetype)sharedDownloader\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    id downloader = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];\n    [downloader setUp];\n    return downloader;\n}\n\n+ (id)alloc\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    return [super alloc];\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    self = [super initWithCoder:aDecoder];\n    singleton = self;\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetIndexer.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHDocsetIndexer : NSObject\n\n@property (weak) id delegate;\n@property (strong) DHDocset *docset;\n@property (assign) BOOL hasV2Guides;\n@property (assign) NSInteger progressCount;\n@property (assign) NSInteger currentProgress;\n@property (assign) double lastDisplayedPercent;\n\n+ (DHDocsetIndexer *)indexerForDocset:(DHDocset *)docset delegate:(id)delegate;\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetIndexer.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetIndexer.h\"\n#import \"DHTypes.h\"\n#import \"DHFeedResult.h\"\n\n@implementation DHDocsetIndexer\n\n+ (DHDocsetIndexer *)indexerForDocset:(DHDocset *)docset delegate:(id)delegate\n{\n    DHDocsetIndexer *indexer = [[DHDocsetIndexer alloc] init];\n    indexer.docset = docset;\n    indexer.delegate = delegate;\n    if(![delegate isCancelled])\n    {\n        [delegate setRightDetail:@\"Indexing...\"];\n        [indexer prepare];\n        [indexer index];\n    }\n    return indexer;\n}\n\n- (void)prepare\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    [fileManager removeItemAtPath:self.docset.optimisedIndexPath error:nil];\n    [fileManager removeItemAtPath:[self.docset.optimisedIndexPath stringByAppendingString:@\"-journal\"] error:nil];\n    [fileManager removeItemAtPath:self.docset.tempOptimisedIndexPath error:nil];\n    [fileManager removeItemAtPath:[self.docset.tempOptimisedIndexPath stringByAppendingString:@\"-journal\"] error:nil];\n    [self.docset executeBlockWithinDocsetDBConnection:^(FMDatabase *db) {\n        FMResultSet *rs = [db executeQuery:([self.docset isDashDocset]) ? @\"SELECT COUNT(id) from searchIndex\" : @\"SELECT COUNT(Z_PK) FROM ZTOKEN\"];\n        if([rs next])\n        {\n            self.progressCount = [rs intForColumnIndex:0];\n        }\n#ifdef DEBUG\n        [db setLogsErrors:NO];\n#endif\n        rs = [db executeQuery:@\"SELECT COUNT(Z_PK) FROM ZNODE WHERE ZPRIMARYPARENT IS NOT NULL AND ZKDOCUMENTTYPE < 2 AND ZKNODETYPE = 'folder' AND (ZKPATH NOT LIKE 'navigation%' OR ZKPATH IS NULL)\"];\n        if([rs next])\n        {\n            self.progressCount += [rs intForColumnIndex:0];\n        }\n        else\n        {\n            rs = [db executeQuery:@\"SELECT COUNT(z.Z_PK) FROM ZNODE z, ZNODEURL u WHERE z.Z_PK = u.ZNODE AND z.ZPRIMARYPARENT IS NOT NULL AND z.ZKDOCUMENTTYPE < 2 AND z.ZKNODETYPE = 2 AND (u.ZPATH NOT LIKE 'navigation%' OR u.ZPATH IS NULL)\"];\n            if([rs next])\n            {\n                self.hasV2Guides = YES;\n                self.progressCount += [rs intForColumnIndex:0];\n            }\n        }\n    } readOnly:YES lockCondition:DHLockDontLock optimisedIndex:NO];\n}\n\n- (void)index\n{\n    @autoreleasepool {\n        @try {\n            [self.docset executeBlockWithinDocsetDBConnection:^(FMDatabase *indexDB) {\n                [self.docset executeBlockWithinDocsetDBConnection:^(FMDatabase *db) {\n                    [self checkIfCancelled];\n                    [indexDB beginDeferredTransaction];\n                    [indexDB executeUpdate:@\"CREATE TABLE searchIndex(rowid INTEGER PRIMARY KEY, name TEXT, type TEXT, path TEXT)\"];\n                    [indexDB executeUpdate:@\"CREATE VIRTUAL TABLE queryIndex USING FTS4 (perfect, prefix, suffixes, matchinfo=fts3, compress=dashCompress, uncompress=dashUncompress, tokenize=simple XX [* ])\"];\n                    [indexDB executeUpdate:@\"CREATE VIEW IF NOT EXISTS wholeIndex AS SELECT queryIndex.rowid AS rowid, name, type, path, perfect, prefix, suffixes FROM searchIndex JOIN queryIndex ON searchIndex.rowid = queryIndex.rowid;\"];\n                    [indexDB executeUpdate:@\"CREATE TRIGGER index_insert INSTEAD OF INSERT ON wholeIndex\\n\"\n                                            \"BEGIN\\n\"\n                                            \"INSERT INTO searchIndex (name, type, path) VALUES (NEW.name, NEW.type, NEW.path);\\n\"\n                                            \"INSERT INTO queryIndex (rowid, perfect, prefix, suffixes) VALUES (last_insert_rowid(), NEW.perfect, NEW.prefix, NEW.suffixes);\\n\"\n                                            \"END;\\n\"];\n                    BOOL isDash = self.docset.isDashDocset;\n                    NSString *platform = self.docset.platform;\n                    BOOL isMacOSX = [platform isEqualToString:@\"macosx\"] || [platform isEqualToString:@\"osx\"];\n                    BOOL isApple = isMacOSX || [platform isEqualToString:@\"ios\"] || [platform isEqualToString:@\"iphoneos\"] || [platform isEqualToString:@\"watchos\"] || [platform isEqualToString:@\"tvos\"];\n                    NSString *indexQuery = (isDash) ? @\"SELECT path, 1, name, type, rowid FROM searchIndex \" : @\"SELECT f.ZPATH, m.ZANCHOR, t.ZTOKENNAME, ty.ZTYPENAME, t.rowid FROM ZTOKEN t, ZTOKENTYPE ty, ZFILEPATH f, ZTOKENMETAINFORMATION m WHERE ty.Z_PK = t.ZTOKENTYPE AND f.Z_PK = m.ZFILE AND m.ZTOKEN = t.Z_PK \";\n                    BOOL hasTOKENUSR = NO;\n                    if(!isDash && isApple)\n                    {\n                        hasTOKENUSR = [db columnExists:@\"ZTOKENUSR\" inTableWithName:@\"ZTOKEN\"];\n                        if(hasTOKENUSR)\n                        {\n                            indexQuery = @\"SELECT CASE WHEN m.ZFILE IS NOT NULL THEN f.ZPATH ELSE u.ZPATH END, CASE WHEN m.ZANCHOR IS NOT NULL THEN m.ZANCHOR ELSE u.ZANCHOR END, t.ZTOKENNAME, ty.ZTYPENAME, t.rowid, t.ZTOKENUSR FROM ZTOKEN t, ZTOKENTYPE ty, ZTOKENMETAINFORMATION m LEFT JOIN ZFILEPATH f ON m.ZFILE = f.Z_PK LEFT JOIN ZNODEURL u ON t.ZPARENTNODE = u.ZNODE WHERE ty.Z_PK = t.ZTOKENTYPE AND m.ZTOKEN = t.Z_PK \";\n                        }\n                    }\n                    indexQuery = [indexQuery stringByAppendingString:[[DHTypes sharedTypes] unifiedSQLiteOrder:isDash platform:platform]];\n                    if(hasTOKENUSR)\n                    {\n                        indexQuery = [indexQuery stringByReplacingOccurrencesOfString:@\" ORDER BY \" withString:@\" ORDER BY f.ZPATH is NULL, \"];\n                    }\n                    [self checkIfCancelled];\n\n                    FMResultSet *rs = [db executeQuery:indexQuery];\n                    BOOL next = [rs next];\n                    BOOL isFetchingGuides = NO;\n                    NSMutableSet *duplicates = [NSMutableSet set];\n                    NSMutableDictionary *tokenUsers = [NSMutableDictionary dictionary];\n                    NSInteger count = 0;\n                    BOOL firstLoop = YES;\n                    while(next || firstLoop)\n                    {\n                        @autoreleasepool {\n                            NSString *anchor = nil;\n                            if(!next && firstLoop)\n                            {\n                                firstLoop = NO;\n                                goto next;\n                            }\n                            firstLoop = NO;\n                            [self checkIfCancelled];\n                            [self incrementProgressBy:1];\n                            anchor = (isDash) ? @\"\" : [rs stringForColumnIndex:1];\n                            if(isFetchingGuides || !(isMacOSX && anchor && anchor.length && [anchor rangeOfString:@\"java\" options:NSCaseInsensitiveSearch].location != NSNotFound))\n                            {\n                                NSString *path = [rs stringForColumnIndex:0];\n                                NSString *name = [rs stringForColumnIndex:2];\n                                NSString *type = [rs stringForColumnIndex:3];\n                                type = [DHTypes singularFromEncoded:type notFoundReturn:@\"Variable\"];\n                                if(hasTOKENUSR && !isFetchingGuides)\n                                {\n                                    NSString *tokenUser = [rs stringForColumnIndex:5];\n                                    if(tokenUser && tokenUser.length)\n                                    {\n                                        if(!path)\n                                        {\n                                            NSArray *data = tokenUsers[tokenUser];\n                                            path = data[0];\n                                            anchor = data[1];\n                                        }\n                                        else\n                                        {\n                                            tokenUsers[tokenUser] = @[path, (anchor) ? [anchor stringByAppendingString:@\"-dash-swift-hack\"] : @\"-dash-swift-hack\"];\n                                        }\n                                    }\n                                }\n                                if((!path || !path.length) && hasTOKENUSR && isApple && ([name hasPrefix:@\"WKInterface\"] || [name hasPrefix:@\"WKUserNotificationInterface\"]) && [type isEqualToString:@\"cl\"])\n                                {\n                                    path = [NSString stringWithFormat:@\"documentation/WatchKit/Reference/%@_class/index.html\", name];\n                                }\n                                if(isFetchingGuides)\n                                {\n                                    if(!path || !path.length)\n                                    {\n                                        path = [@\"ghttp://\" stringByAppendingString:type];\n                                    }\n                                    else\n                                    {\n                                        path = [@\"gfile://\" stringByAppendingString:path];\n                                    }\n                                    NSInteger docType = [rs intForColumnIndex:4];\n                                    type = (docType == 0) ? @\"Guide\" : @\"Sample\";\n                                }\n                                if(!path || !path.length || !name || !name.length || !type || !type.length)\n                                {\n                                    goto next;\n                                }\n                                if(anchor && anchor.length)\n                                {\n                                    path = [path stringByAppendingFormat:@\"#%@\", anchor];\n                                }\n                                if(name.length > 200)\n                                {\n                                    name = [name substringToIndex:200];\n                                }\n                                NSString *whitespaceFree = [name stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\n                                if(whitespaceFree.length)\n                                {\n                                    if(isApple)\n                                    {\n                                        if([name isEqualToString:@\"NSMutableAttributedString\"] && [path contains:@\"UIKit/Reference/NSMutableAttributedString_UIKit_Additions/\"])\n                                        {\n                                            path = [path stringByReplacingOccurrencesOfString:@\"UIKit/Reference/NSMutableAttributedString_UIKit_Additions/\" withString:@\"Cocoa/Reference/Foundation/Classes/NSMutableAttributedString_Class/\"];\n                                        }\n                                        else if([name isEqualToString:@\"NSView\"] && [path contains:@\"MacOSXServer/\"])\n                                        {\n                                            NSString *hash = [path substringFromString:@\"#\"];\n                                            path = [[[[path substringToString:@\"MacOSXServer/\"] stringByAppendingString:@\"Cocoa/Reference/ApplicationKit/Classes/NSView_Class/index.html\"] stringByAppendingString:@\"#\"] stringByAppendingString:hash];\n                                        }\n                                        else if([name isEqualToString:@\"NSATSTypesetter\"] && [path contains:@\"Cocoa/Reference/Foundation/Classes/NSXMLDTD_Class/\"])\n                                        {\n                                            path = [path stringByReplacingOccurrencesOfString:@\"Cocoa/Reference/Foundation/Classes/NSXMLDTD_Class/\" withString:@\"Cocoa/Reference/ApplicationKit/Classes/NSATSTypesetter_Class/\"];\n                                        }\n                                        else if([name isEqualToString:@\"NSDockTile\"] && [path contains:@\"Cocoa/Reference/NSTextInputClient_Protocol/\"])\n                                        {\n                                            path = [path stringByReplacingOccurrencesOfString:@\"Cocoa/Reference/NSTextInputClient_Protocol/\" withString:@\"Cocoa/Reference/NSDockTile_Class/\"];\n                                        }\n                                        else if([name isEqualToString:@\"NSFetchRequest\"] && [path contains:@\"Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/\"])\n                                        {\n                                            path = [path stringByReplacingOccurrencesOfString:@\"Cocoa/Reference/CoreDataFramework/Classes/NSEntityDescription_Class/\" withString:@\"Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/\"];\n                                        }\n                                        else if([name isEqualToString:@\"NSManagedObject\"] && [path contains:@\"Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectID_Class/\"])\n                                        {\n                                            path = [path stringByReplacingOccurrencesOfString:@\"Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectID_Class/\" withString:@\"Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/\"];\n                                        }\n                                        else if([@[@\"Menu\", @\"DRBurnRef\", @\"DRFileRef\", @\"DRTrackRef\", @\"CSIdentity\", @\"AXObserver\", @\"DREraseRef\", @\"DRDeviceRef\", @\"DRFolderRef\", @\"CSIdentityQuery\", @\"DRCDTextBlockRef\", @\"CSIdentityAuthority\", @\"DRNotificationCenterRef\"] containsObject:name] && ![path contains:@\"#\"] && [type isCaseInsensitiveEqual:@\"cl\"])\n                                        {\n                                            NSString *fixName = name;\n                                            if(![name hasSuffix:@\"Ref\"])\n                                            {\n                                                fixName = [name stringByAppendingString:@\"Ref\"];\n                                            }\n                                            path = [path stringByAppendingFormat:@\"#//apple_ref/c/tdef/%@\", fixName];\n                                        }\n                                    }\n                                    NSString *duplicateHash = [NSString stringWithFormat:@\"%@%@%@\", name, type, path];\n                                    if(![duplicates containsObject:duplicateHash])\n                                    {\n                                        [duplicates addObject:duplicateHash];\n                                        [indexDB executeUpdate:@\"INSERT INTO wholeIndex(name, type, path, perfect, prefix, suffixes) VALUES(?, ?, ?, ?, ?, ?);\", name, type, path, [whitespaceFree stringByReplacingSpecialFTSCharacters], [whitespaceFree FTSPrefix], [whitespaceFree allFTSSuffixes]];\n                                        ++count;\n                                        if(count % 2500 == 0)\n                                        {\n                                            [indexDB commit];\n                                            [indexDB beginDeferredTransaction];\n                                        }\n                                        [self checkIfCancelled];\n                                    }\n                                }\n                            }\n                        next:\n                            if(next)\n                            {\n                                next = [rs next];\n                            }\n                            if(!next && !isFetchingGuides)\n                            {\n#ifdef DEBUG\n                                [db setLogsErrors:NO];\n#endif\n                                rs = [db executeQuery:(!self.hasV2Guides) ? @\"SELECT ZKPATH, ZKANCHOR, ZKNAME, ZKURL, ZKDOCUMENTTYPE, rowid FROM ZNODE WHERE ZPRIMARYPARENT IS NOT NULL AND ZKDOCUMENTTYPE < 2 AND ZKNODETYPE = 'folder' AND (ZKPATH NOT LIKE 'navigation%' OR ZKPATH IS NULL)\" : @\"SELECT u.ZPATH, u.ZANCHOR, z.ZKNAME, u.ZBASEURL, z.ZKDOCUMENTTYPE, z.rowid FROM ZNODE z, ZNODEURL u WHERE z.Z_PK = u.ZNODE AND z.ZPRIMARYPARENT IS NOT NULL AND z.ZKDOCUMENTTYPE < 2 AND z.ZKNODETYPE = 2 AND (u.ZPATH NOT LIKE 'navigation%' OR u.ZPATH IS NULL)\"];\n                                next = [rs next];\n                                isFetchingGuides = YES;\n                            }\n                        }\n                    }\n                    [self checkIfCancelled];\n                    [indexDB executeUpdate:[NSString stringWithFormat:@\"INSERT INTO queryIndex(queryIndex) VALUES('optimize');\"]];\n                    [self checkIfCancelled];\n                    [indexDB commit];\n                } readOnly:YES lockCondition:DHLockDontLock optimisedIndex:NO];\n            } readOnly:NO lockCondition:DHLockDontLock optimisedIndex:YES];\n        }\n        @catch(NSException *exception) {\n            if(![[exception name] isEqualToString:@\"Indexing Interrupt\"])\n            {\n                NSLog(@\"FIXME: exception in index\");\n                NSLog(@\"%@\", exception);\n                NSLog(@\"%@\", [NSThread callStackSymbols]);\n            }\n        }\n        @finally {\n            if(![self.delegate isCancelled])\n            {\n                if(self.currentProgress < self.progressCount && self.progressCount > 0)\n                {\n                    [self incrementProgressBy:self.progressCount-self.currentProgress];\n                }\n            }\n        }\n    }\n}\n\n- (void)incrementProgressBy:(NSUInteger)increment;\n{\n    self.currentProgress += increment;\n    if(self.currentProgress > self.progressCount)\n    {\n        self.currentProgress = self.progressCount;\n    }\n    double currentPercent = (double)self.currentProgress/self.progressCount;\n    double delta = currentPercent - self.lastDisplayedPercent;\n    if(delta > 0.005f || delta < -0.005f || (self.currentProgress == self.progressCount && self.lastDisplayedPercent < 1.0))\n    {\n        self.lastDisplayedPercent = currentPercent;\n        [self.delegate setIndexingProgress:currentPercent];\n    }\n}\n\n- (void)checkIfCancelled\n{\n    if([self.delegate isCancelled])\n    {\n        [NSException raise:@\"Indexing Interrupt\" format:@\"\"];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetManager.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHDocsetManager : NSObject\n\n@property (strong) NSMutableArray *docsets;\n\n+ (DHDocsetManager *)sharedManager;\n- (void)addDocset:(DHDocset *)docset andRemoveOthers:(BOOL)shouldRemove removeOnlyEqualPaths:(BOOL)removeOnlyEqualPaths;\n- (void)removeDocsetsInFolder:(NSString *)path;\n- (void)moveDocsetAtIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;\n- (DHDocset *)docsetForDocumentationPage:(NSString *)url;\n- (NSMutableArray *)enabledDocsets;\n- (void)saveDefaults;\n- (DHDocset *)docsetWithRelativePath:(NSString *)relativePath;\n- (DHDocset *)appleAPIReferenceDocset;\n\n@end\n\n#define DHDocsetsChangedNotification @\"DHDocsetsChangedNotification\"\n"
  },
  {
    "path": "Dash/DHDocsetManager.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetManager.h\"\n\n@implementation DHDocsetManager\n\n+ (DHDocsetManager *)sharedManager\n{\n    static dispatch_once_t pred;\n    static DHDocsetManager *_docsetManager = nil;\n    \n    dispatch_once(&pred, ^{\n        _docsetManager = [[DHDocsetManager alloc] init];\n        [_docsetManager setUp];\n    });\n    return _docsetManager;\n}\n\n- (void)setUp\n{\n    NSMutableArray *docsets = [NSMutableArray array];\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    for(NSDictionary *dictionary in [[NSUserDefaults standardUserDefaults] objectForKey:@\"docsets\"])\n    {\n        DHDocset *docset = [DHDocset docsetWithDictionaryRepresentation:dictionary];\n        if([fileManager fileExistsAtPath:docset.path])\n        {\n            [docsets addObject:docset];            \n        }\n    }\n    self.docsets = docsets;\n}\n\n- (void)saveDefaults\n{\n    NSMutableArray *dictionaries = [NSMutableArray array];\n    for(DHDocset *docset in self.docsets)\n    {\n        [dictionaries addObject:[docset dictionaryRepresentation]];\n    }\n    [[NSUserDefaults standardUserDefaults] setObject:dictionaries forKey:@\"docsets\"];\n}\n\n- (void)addDocset:(DHDocset *)docset andRemoveOthers:(BOOL)shouldRemove removeOnlyEqualPaths:(BOOL)removeOnlyEqualPaths\n{\n    NSString *folder = [docset.path stringByDeletingLastPathComponent];\n    if(!docset)\n    {\n        return;\n    }\n    NSInteger index = [self.docsets indexOfObject:docset];\n    DHDocset *replaced = nil;\n    if(index != NSNotFound)\n    {\n        replaced = self.docsets[index];\n        [self.docsets removeObjectAtIndex:index];\n    }\n    if(shouldRemove)\n    {\n        NSIndexSet *toRemove = [self.docsets indexesOfObjectsPassingTest:^BOOL(DHDocset *obj, NSUInteger idx, BOOL *stop) {\n            if(!removeOnlyEqualPaths)\n            {\n                if([[obj.path stringByDeletingLastPathComponent] isCaseInsensitiveEqual:folder])\n                {\n                    return YES;\n                }\n            }\n            else if([obj.path isCaseInsensitiveEqual:docset.path])\n            {\n                return YES;\n            }\n            return NO;\n        }];\n        if(index == NSNotFound && toRemove.count)\n        {\n            index = toRemove.firstIndex;\n            replaced = self.docsets[index];\n        }\n        [self.docsets removeObjectsAtIndexes:toRemove];\n    }\n    if(replaced)\n    {\n        [docset grabUserDataFromDocset:replaced];\n        [self.docsets insertObject:docset atIndex:index];\n    }\n    else\n    {\n        [self.docsets addObject:docset];\n    }\n    [self saveDefaults];\n    [[NSNotificationCenter defaultCenter] postNotificationName:DHDocsetsChangedNotification object:self];\n}\n\n- (void)removeDocsetsInFolder:(NSString *)path\n{\n    [self.docsets removeObjectsAtIndexes:[self.docsets indexesOfObjectsPassingTest:^BOOL(DHDocset *obj, NSUInteger idx, BOOL *stop) {\n        if([[obj.path stringByDeletingLastPathComponent] isCaseInsensitiveEqual:path] || [obj.path isCaseInsensitiveEqual:path])\n        {\n            return YES;\n        }\n        return NO;\n    }]];\n    [self saveDefaults];\n    [[NSNotificationCenter defaultCenter] postNotificationName:DHDocsetsChangedNotification object:self];\n}\n\n- (void)moveDocsetAtIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex\n{\n    DHDocset *toMove = self.docsets[fromIndex];\n    [self.docsets removeObjectAtIndex:fromIndex];\n    [self.docsets insertObject:toMove atIndex:toIndex];\n    [self saveDefaults];\n}\n\n- (DHDocset *)docsetForDocumentationPage:(NSString *)url\n{\n    if([url hasPrefix:@\"dash-apple-api://\"])\n    {\n        return [self appleAPIReferenceDocset];\n    }\n    url = [[url stringByDeletingPathFragment] stringByReplacingPercentEscapes];\n    for(DHDocset *docset in [NSArray arrayWithArray:self.docsets])\n    {\n        NSString *path = docset.path;\n        if(path && [url rangeOfString:path].location != NSNotFound)\n        {\n            return docset;\n        }\n    }\n    return nil;\n}\n\n- (DHDocset *)docsetWithRelativePath:(NSString *)relativePath\n{\n    for(DHDocset *docset in self.docsets)\n    {\n        if([docset.relativePath isEqualToString:relativePath])\n        {\n            return docset;\n        }\n    }\n    return nil;\n}\n\n- (NSMutableArray *)enabledDocsets\n{\n    NSMutableArray *enabled = [NSMutableArray array];\n    for(DHDocset *docset in self.docsets)\n    {\n        if(docset.isEnabled)\n        {\n            [enabled addObject:docset];\n        }\n    }\n    return enabled;\n}\n\n- (DHDocset *)appleAPIReferenceDocset\n{\n    NSMutableOrderedSet *toCheck = [NSMutableOrderedSet orderedSet];\n    [toCheck addObjectsFromArray:self.enabledDocsets];\n    [toCheck addObjectsFromArray:self.docsets];\n    for(DHDocset *docset in toCheck)\n    {\n        if([[[docset relativePath] lastPathComponent] isEqualToString:@\"Apple_API_Reference.docset\"] && [[NSFileManager defaultManager] fileExistsAtPath:[[docset documentsPath] stringByAppendingPathComponent:@\"Apple Docs Helper\"]] && ![[[docset plist] objectForKey:@\"DashDocSetIsGeneratedForiOSCompatibility\"] boolValue])\n        {\n            return docset;\n        }\n    }\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetTransferrer.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHRepo.h\"\n\n@interface DHDocsetTransferrer : DHRepo\n\n@property (retain) NSTimer *pollTimer;\n@property (retain) NSString *loadedFeedsHash;\n@property (assign) NSInteger pollCounter;\n@property (assign) BOOL ignoreReload;\n\n+ (instancetype)sharedTransferrer;\n- (IBAction)refreshFeeds:(id)sender;\n\n@end\n"
  },
  {
    "path": "Dash/DHDocsetTransferrer.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetTransferrer.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHTransferFeed.h\"\n\n@implementation DHDocsetTransferrer\n\nstatic id singleton = nil;\n\n- (void)setUp // doesn't get called unless you call the singleton from DHAppDelegate\n{\n    [super setUp];\n}\n\n- (void)feedWillInstall:(DHTransferFeed *)feed\n{\n    feed.feedResult = [[DHFeedResult alloc] init];\n    feed.feedResult.feed = feed;\n    NSString *sourcePath = [transfersPath stringByAppendingPathComponent:feed.feed];\n    @synchronized([DHDocsetTransferrer class])\n    {\n        feed.feedURL = [self docsetPathForFeed:feed];\n        NSFileManager *fileManager = [NSFileManager defaultManager];\n        if([fileManager fileExistsAtPath:feed.feedURL])\n        {\n            NSString *trashPath = [self uniqueTrashPath];\n            [fileManager moveItemAtPath:feed.feedURL toPath:trashPath error:nil];\n            dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n            dispatch_async(queue, ^{\n                [[NSFileManager defaultManager] removeItemAtPath:trashPath error:nil];\n            });\n        }\n        [fileManager createDirectoryAtPath:feed.feedURL.stringByDeletingLastPathComponent withIntermediateDirectories:YES attributes:nil error:nil];\n        [fileManager moveItemAtPath:sourcePath toPath:feed.feedURL error:nil];\n        feed.docset = nil;\n        [feed loadDocset];\n    }\n}\n\n- (NSString *)installFeed:(DHTransferFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    DHFeedResult *result = feed.feedResult;\n    DHDocset *docset = feed.docset;\n    if(!result || result.isCancelled)\n    {\n        return @\"cancelled\";\n    }\n    if(!docset || !docset.optimisedIndexPath)\n    {\n        return @\"Couldn't load docset. Either iTunes did not finish transferring it or the docset is corrupt.\";\n    }\n    CGFloat maxWidth = [DHRightDetailLabel calculateMaxDetailWidthBasedOnLongestPossibleString:@\"Indexing...\"];\n    [feed setMaxRightDetailWidth:maxWidth];\n    [[[feed cell] titleLabel] setMaxRightDetailWidth:maxWidth];\n    NSString *tempPath = [docset.optimisedIndexPath stringByAppendingString:@\"_temp\"];\n    docset.tempOptimisedIndexPath = tempPath;\n    [feed.feedResult setRightDetail:@\"Waiting...\"];\n    @synchronized([DHDocsetIndexer class])\n    {\n        [DHDocsetIndexer indexerForDocset:docset delegate:feed.feedResult];\n    }\n    if(result.isCancelled)\n    {\n        return @\"cancelled\";\n    }\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    [fileManager moveItemAtPath:tempPath toPath:docset.optimisedIndexPath error:nil];\n    feed.docset.tempOptimisedIndexPath = nil;\n    return nil;\n}\n\n- (void)feedWasStopped:(DHTransferFeed *)feed\n{\n    @synchronized([DHDocsetTransferrer class])\n    {\n        [feed cancelInstall];\n    }\n}\n\n- (void)feedDidUninstall:(DHTransferFeed *)feed\n{\n    NSInteger row = [self.feeds indexOfObjectIdenticalTo:feed];\n    if(row != NSNotFound)\n    {\n        [self.feeds removeObjectAtIndex:row];\n        [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationFade];\n        for(NSInteger i = row; i < self.feeds.count; i++)\n        {\n            DHTransferFeed *nextFeed = self.feeds[i];\n            [nextFeed.cell setTagsToIndex:i];\n        }\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            if(!self.feeds.count)\n            {\n                [self reload];\n            }\n        });\n    }\n    else\n    {\n        [self refreshFeeds:nil];\n    }\n}\n\n- (IBAction)refreshFeeds:(id)sender\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *waitingPath = transfersPath;\n    NSArray *waiting = [fileManager contentsOfDirectoryAtPath:waitingPath error:nil];\n    self.loadedFeedsHash = [waiting componentsJoinedByString:@\"xx\"];\n    NSMutableArray *newFeeds = [NSMutableArray array];\n    for(NSString *docset in waiting)\n    {\n        if([docset hasCaseInsensitiveSuffix:@\".docset\"])\n        {\n            DHTransferFeed *feed = [DHTransferFeed feedWithPath:[waitingPath stringByAppendingPathComponent:docset] isInstalled:NO];\n            [newFeeds addObject:feed];\n        }\n    }\n    NSString *installedPath = [self docsetInstallFolderPath];\n    for(NSString *docset in [fileManager contentsOfDirectoryAtPath:installedPath error:nil])\n    {\n        if([docset hasCaseInsensitiveSuffix:@\".docset\"])\n        {\n            DHTransferFeed *feed = [DHTransferFeed feedWithPath:[installedPath stringByAppendingPathComponent:docset] isInstalled:YES];\n            if(![newFeeds containsObject:feed])\n            {\n                if(!self.feeds && ![feed isProperlyInstalled])\n                {\n                    [feed cancelInstall];\n                }\n                [newFeeds addObject:feed];\n            }\n        }\n    }\n    if(!self.feeds)\n    {\n        self.feeds = [NSMutableArray array];\n    }\n    NSMutableArray *oldFeeds = [NSMutableArray arrayWithArray:self.feeds];\n    @synchronized([DHDocsetTransferrer class])\n    {\n        for(DHTransferFeed *newFeed in newFeeds)\n        {\n            NSInteger index = [oldFeeds indexOfObject:newFeed];\n            if(index != NSNotFound)\n            {\n                DHTransferFeed *feed = oldFeeds[index];\n                if((feed.installed || feed.installing) && !newFeed.installed)\n                {\n                    if(feed.installing)\n                    {\n                        [feed cancelInstall];\n                    }\n                    if(!newFeed.docset)\n                    {\n                        [newFeed loadDocset];\n                    }\n                    oldFeeds[index] = newFeed;\n                }\n                else\n                {\n                    [oldFeeds[index] refreshIcon];\n                }\n            }\n            else\n            {\n                if(!newFeed.docset)\n                {\n                    [newFeed loadDocset];\n                }\n                [oldFeeds addObject:newFeed];\n            }\n        }\n        for(DHTransferFeed *feed in [NSMutableArray arrayWithArray:oldFeeds])\n        {\n            if(![newFeeds containsObject:feed])\n            {\n                [oldFeeds removeObjectIdenticalTo:feed];\n            }\n        }\n    }\n    [oldFeeds sortUsingFunction:compareFeeds context:nil];\n    self.feeds = oldFeeds;\n    [self reload];\n}\n\n- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView\n{\n    NSString *text = @\"Transfer Docsets\";\n    return [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: [UIFont fontWithName:@\"HelveticaNeue-Light\" size:22.0], NSForegroundColorAttributeName: [UIColor colorWithWhite:201.0/255.0 alpha:1.0]}];\n}\n\n- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView {\n    \n    NSString *text = @\"You can transfer docsets using iTunes File Sharing or AirDrop.\\n\\nFor best results, docsets that are available for download should always be downloaded instead of transferred.\";\n    NSMutableParagraphStyle *paragraph = [NSMutableParagraphStyle new];\n    paragraph.lineBreakMode = NSLineBreakByWordWrapping;\n    paragraph.alignment = NSTextAlignmentCenter;\n    paragraph.lineSpacing = 4.0;\n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:13.0], NSForegroundColorAttributeName: [UIColor colorWithWhite:207.0/255.0 alpha:1.0], NSParagraphStyleAttributeName: paragraph};\n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];\n}\n\n- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return [UIImage imageNamed:@\"placeholder_transfer\"];\n}\n\n- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state\n{\n    NSString *text = @\"Open Help\";\n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:16.0], NSForegroundColorAttributeName: [[DHAppDelegate sharedDelegate].window.rootViewController.view.tintColor colorWithAlphaComponent:state == UIControlStateNormal ? 0.7 : 0.2]};\n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];\n}\n\n- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView\n{\n    return NO;\n}\n\n- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return 24;\n}\n\n- (void)emptyDataSetWillAppear:(UIScrollView *)scrollView\n{\n    [self.tableView setContentOffset:CGPointMake(0, -self.tableView.contentInset.top)];\n}\n\n- (void)emptyDataSetDidTapButton:(UIScrollView *)scrollView\n{\n    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\"https://kapeli.com/dash_itunes_file_sharing\"]];\n}\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    self.tableView.tableFooterView = [UIView new];\n    self.tableView.emptyDataSetSource = self;\n    self.tableView.emptyDataSetDelegate = self;\n    self.ignoreReload = YES;\n    [self poll];\n    self.ignoreReload = NO;\n    if(self.feeds.count)\n    {\n        [self reload];\n    }\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];\n}\n\n- (void)orientationChanged:(id)sender\n{\n    [self.tableView reloadEmptyDataSet];\n}\n\n- (void)poll\n{\n    ++self.pollCounter;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if(!self.loadedFeedsHash || ![[[fileManager contentsOfDirectoryAtPath:transfersPath error:nil] componentsJoinedByString:@\"xx\"] isEqualToString:self.loadedFeedsHash])\n    {\n        [self refreshFeeds:nil];\n    }\n    else\n    {\n        if(self.pollCounter % 3 == 0)\n        {\n            BOOL shouldReload = NO;\n            for(DHTransferFeed *feed in self.feeds)\n            {\n                if(!feed.docset && [feed loadDocset])\n                {\n                    shouldReload = YES;\n                }\n                else if(feed.docset)\n                {\n                    shouldReload |= [feed refreshIcon];\n                }\n            }\n            if(shouldReload)\n            {\n                [self.feeds sortUsingFunction:compareFeeds context:nil];\n                [self reload];\n            }\n            self.pollCounter = 0;\n        }\n    }\n}\n\n- (void)reload\n{\n    if(self.ignoreReload)\n    {\n        return;\n    }\n    NSInteger count = [self tableView:self.tableView numberOfRowsInSection:0];\n    self.tableView.tableFooterView = (count) ? nil : [UIView new];\n    [self.tableView reloadData];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(stopPollTimer) name:UIApplicationWillResignActiveNotification object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startPollTimer) name:UIApplicationDidBecomeActiveNotification object:nil];\n    [self poll];\n    [self startPollTimer];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];\n    [super viewWillDisappear:animated];\n    [self stopPollTimer];\n    self.pollTimer = [self.pollTimer invalidateTimer];\n}\n\n- (void)startPollTimer\n{\n    [self stopPollTimer];\n    self.pollTimer = [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(poll) userInfo:nil repeats:YES];\n}\n\n- (void)stopPollTimer\n{\n    self.pollTimer = [self.pollTimer invalidateTimer];\n}\n\n- (NSString *)docsetInstallFolderName\n{\n    return @\"Transfers\";\n}\n\n- (NSString *)docsetPathForFeed:(DHFeed *)feed\n{\n    return [[self docsetInstallFolderPath] stringByAppendingPathComponent:feed.feed];\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return 1;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHRepoTableViewCell *cell = (id)[super tableView:tableView cellForRowAtIndexPath:indexPath];\n    [cell.downloadButton setImage:[UIImage imageNamed:@\"transfer_button\"] forState:UIControlStateNormal];\n    [cell.downloadButton setBackgroundImage:nil forState:UIControlStateNormal];\n    return cell;\n}\n\n- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView\n{\n    return nil;\n}\n\n- (IBAction)errorButtonPressed:(id)sender\n{\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    [[[UIAlertView alloc] initWithTitle:@\"Docset Install Failed\" message:feed.error delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n}\n\n+ (instancetype)sharedTransferrer\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    id transferrer = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];\n    [transferrer setUp];\n    return transferrer;\n}\n\n+ (id)alloc\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    return [super alloc];\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    self = [super initWithCoder:aDecoder];\n    singleton = self;\n    return self;\n}\n\n\n@end\n"
  },
  {
    "path": "Dash/DHEntryBrowser.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetBrowser.h\"\n\n@interface DHEntryBrowser : UITableViewController\n\n@property (strong) DHDocset *docset;\n@property (strong) NSString *type;\n@property (strong) NSMutableArray *entries;\n@property (assign) BOOL isLoading;\n@property (assign) BOOL isEmpty;\n@property (strong) DHDBSearchController *searchController;\n@property (strong) NSCoder *decoder;\n@property (assign) BOOL isRestoring;\n@property (assign) BOOL didLoad;\n\n@end\n"
  },
  {
    "path": "Dash/DHEntryBrowser.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHEntryBrowser.h\"\n#import \"DHTypes.h\"\n#import \"DHDBResult.h\"\n#import \"DHDocsetManager.h\"\n\n@implementation DHEntryBrowser\n\n- (void)viewDidLoad\n{\n    if(!self.docset)\n    {\n        // happens during state restoration\n        return;\n    }\n    [super viewDidLoad];\n    self.clearsSelectionOnViewWillAppear = NO;\n    self.searchController = [DHDBSearchController searchControllerWithDocsets:@[self.docset] typeLimit:self.type viewController:self];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n    \n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n    \n    self.tableView.rowHeight = 44;\n\n    if(self.isRestoring)\n    {\n        return;\n    }\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    if(!self.didLoad && self.docset)\n    {\n        self.didLoad = YES;\n        self.tableView.allowsSelection = NO;\n        self.isLoading = YES;\n        dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n        dispatch_async(queue, ^{\n            [self.docset executeBlockWithinDocsetDBConnection:^(FMDatabase *db) {\n                NSMutableSet *duplicates = [NSMutableSet set];\n                NSMutableArray *entries = [NSMutableArray array];\n                NSConditionLock *lock = [DHDocset stepLock];\n                [lock lockWhenCondition:DHLockAllAllowed];\n                FMResultSet *rs = [db executeQuery:@\"SELECT path, name, type FROM searchIndex WHERE type = ? ORDER BY LOWER(name)\", self.type];\n                BOOL next = [rs next];\n                [lock unlock];\n                while(next)\n                {\n                    DHDBResult *result = [DHDBResult resultWithDocset:self.docset resultSet:rs];\n                    if(result)\n                    {\n                        NSString *duplicateHash = [result browserDuplicateHash];\n                        if(!duplicateHash || ![duplicates containsObject:duplicateHash])\n                        {\n                            if(duplicateHash)\n                            {\n                                [duplicates addObject:duplicateHash];\n                            }\n                            [entries addObject:result];\n                        }\n                    }\n                    [lock lockWhenCondition:DHLockAllAllowed];\n                    next = [rs next];\n                    [lock unlock];\n                }\n                dispatch_sync(dispatch_get_main_queue(), ^{\n                    self.isLoading = NO;\n                    self.isEmpty = entries.count <= 0;\n                    if(!self.isEmpty)\n                    {\n                        self.tableView.allowsSelection = YES;\n                    }\n                    self.entries = entries;\n                    [self.tableView reloadData];\n                });\n            } readOnly:YES lockCondition:DHLockAllAllowed optimisedIndex:YES];\n        });\n    }\n    [self.tableView deselectAll:YES];\n    [self.searchController viewWillAppear];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.tableView reloadData];\n    [self.searchController traitCollectionDidChange:previousTraitCollection];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [self.searchController viewWillDisappear];\n}\n\n- (void)viewDidDisappear:(BOOL)animated\n{\n    [super viewDidDisappear:animated];\n    [self.searchController viewDidDisappear];\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    [self.searchController viewDidAppear];\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return 1;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    if(self.isLoading || self.isEmpty)\n    {\n        return 3;\n    }\n    NSInteger count = self.entries.count;\n    return count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:(self.isLoading || self.isEmpty) ? @\"DHLoadingCell\" : @\"DHBrowserCell\" forIndexPath:indexPath];\n    \n    if((self.isLoading || self.isEmpty) && indexPath.row == 2)\n    {\n        cell.userInteractionEnabled = NO;\n        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n        [paragraph setAlignment:NSTextAlignmentCenter];\n        UIFont *font = [UIFont boldSystemFontOfSize:20];\n        cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:(self.isEmpty) ? @\"Nothing Here\" : @\"Loading...\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n    }\n    else if(self.isLoading || self.isEmpty)\n    {\n        cell.userInteractionEnabled = NO;\n        cell.textLabel.text = @\"\";\n    }\n    else\n    {\n        cell.userInteractionEnabled = YES;\n        DHDBResult *entry = self.entries[indexPath.row];\n        cell.textLabel.font = [UIFont fontWithName:@\"Menlo\" size:16];\n        cell.textLabel.text = entry.originalName;\n        cell.imageView.image = [UIImage imageNamed:self.type];\n        cell.accessoryType = (entry.similarResults.count || !isRegularHorizontalClass) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;\n    }\n    return cell;\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHDBResult *result = self.entries[indexPath.row];\n    [[DHDBResultSorter sharedSorter] resultWasSelected:result inTableView:tableView];\n    if(isRegularHorizontalClass)\n    {\n        [[DHWebViewController sharedWebViewController] loadResult:result];\n    }\n    else\n    {\n        [[DHWebViewController sharedWebViewController] loadResult:result];\n        [self performSegueWithIdentifier:@\"DHWebViewSegue\" sender:self];\n    }\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHWebViewSegue\"])\n    {\n        DHWebViewController *webViewController = [segue destinationViewController];\n        DHDBResult *selectedEntry = self.entries[self.tableView.indexPathForSelectedRow.row];\n        webViewController.result = selectedEntry;\n    }\n    else\n    {\n        [self.searchController prepareForSegue:segue sender:sender];\n    }\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    [self.searchDisplayController setActive:NO animated:NO];\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [coder encodeObject:self.docset.relativePath forKey:@\"docsetRelativePath\"];\n    [coder encodeObject:self.type forKey:@\"type\"];\n    [coder encodeObject:self.title forKey:@\"title\"];\n    [coder encodeObject:self.entries forKey:@\"entries\"];\n    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];\n    if(selectedIndexPath != nil)\n    {\n        [coder encodeObject:selectedIndexPath forKey:@\"selectedIndexPath\"];\n    }\n    [self.searchController encodeRestorableStateWithCoder:coder];\n    [super encodeRestorableStateWithCoder:coder];\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    NSString *docsetRelativePath = [coder decodeObjectForKey:@\"docsetRelativePath\"];\n    self.docset = [[DHDocsetManager sharedManager] docsetWithRelativePath:docsetRelativePath];\n    self.type = [coder decodeObjectForKey:@\"type\"];\n    self.title = [coder decodeObjectForKey:@\"title\"];\n    self.isRestoring = YES;\n    [self viewDidLoad];\n    self.isRestoring = NO;\n    self.entries = [coder decodeObjectForKey:@\"entries\"];\n    for (int i = 0; i < self.entries.count; i++) {\n        if ([self.entries[i] isKindOfClass:[DHDBResult class]]) {\n            DHDBResult *result = (DHDBResult *)self.entries[i];\n            NSArray *components = [result.fullPath componentsSeparatedByString:@\"/Library/Docsets\"];\n            if (components.count == 2) {\n                result.fullPath = [@\"file://\" stringByAppendingFormat:@\"%@%@%@\",homePath,@\"/Docsets\",components[1]];\n            }\n        }\n    }\n    NSIndexPath *selectedIndexPath = [coder decodeObjectForKey:@\"selectedIndexPath\"];\n    if(selectedIndexPath != nil)\n    {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n        });\n    }\n    [self.searchController decodeRestorableStateWithCoder:coder];\n    [super decodeRestorableStateWithCoder:coder];\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHFeed.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHRepoTableViewCell.h\"\n#import \"DHFeedResult.h\"\n\n@interface DHFeed : NSObject\n\n@property (strong) NSString *name;\n@property (strong) NSString *_uniqueIdentifier;\n@property (strong) NSString *feed;\n@property (strong) NSString *feedURL;\n@property (strong) NSString *iconName;\n@property (strong) NSArray *aliases;\n@property (strong) NSString *size;\n@property (strong) NSString *platform;\n@property (strong) NSString *authorLinkText;\n@property (strong) NSString *authorLinkHref;\n@property (assign) BOOL doesNotHaveVersions;\n@property (assign) BOOL waiting;\n@property (assign) BOOL isCustom;\n@property (assign) BOOL progressShown;\n@property (assign) BOOL checkingForUpdates;\n@property (assign) BOOL installing, installed;\n@property (assign) BOOL _isMajorVersioned;\n@property (strong) NSString *installedVersion;\n@property (assign) float progress;\n@property (retain) NSString *detailString;\n@property (strong) NSString *error;\n@property (strong) DHFeedResult *feedResult;\n@property (retain) NSObject *identifier;\n@property (weak) DHRepoTableViewCell *cell;\n@property (assign) CGFloat maxRightDetailWidth;\n@property (strong) UIImage *_icon;\n\n+ (instancetype)entryWithName:(NSString *)name platform:(NSString *)platform icon:(UIImage *)icon;\n+ (instancetype)feedWithFeed:(NSString *)aFeed icon:(NSString *)aIcon aliases:(id)someAliases doesNotHaveVersions:(BOOL)doesNotHaveVersions;\n+ (DHFeed *)feedWithDictionaryRepresentation:(NSDictionary *)dictionary;\n- (NSDictionary *)dictionaryRepresentation;\n- (NSString *)docsetNameWithVersion:(BOOL)withVersion;\n- (NSString *)stringValue;\n- (void)prepareCell:(DHRepoTableViewCell *)cell;\n- (NSString *)sortName;\n- (void)adjustTitleLabelWidthBasedOnButtonsShown;\n- (UIImage *)icon;\n- (NSString *)uniqueIdentifier; // Used to find a corresponding feed from a installed docset\n- (NSString *)installFolderName;\n\n@end\n"
  },
  {
    "path": "Dash/DHFeed.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHFeed.h\"\n\n@implementation DHFeed\n\n+ (instancetype)entryWithName:(NSString *)name platform:(NSString *)platform icon:(UIImage *)icon\n{\n    DHFeed *feed = [[DHFeed alloc] init];\n    feed._icon = icon;\n    feed.name = name;\n    feed.platform = platform;\n    return feed;\n}\n\n// For Dash provided feeds only\n+ (instancetype)feedWithFeed:(NSString *)aFeed icon:(NSString *)aIcon aliases:(id)someAliases doesNotHaveVersions:(BOOL)doesNotHaveVersions\n{\n    DHFeed *feed = [[DHFeed alloc] init];\n    feed.detailString = @\"\";\n    feed.feed = aFeed;\n    feed.iconName = aIcon;\n    NSString *feedURL = [@\"http://kapeli.com/feeds/\" stringByAppendingString:aFeed];\n    if([aFeed isEqualToString:@\"SproutCore.xml\"])\n    {\n        feed.isCustom = YES;\n        feedURL = [@\"http://docs.sproutcore.com/feeds/\" stringByAppendingString:aFeed];\n    }\n    feed.feedURL = feedURL;\n    feed.aliases = ([someAliases isKindOfClass:[NSArray class]]) ? someAliases : (someAliases) ? @[someAliases] : nil;\n    feed.doesNotHaveVersions = doesNotHaveVersions;\n    return feed;\n}\n\n- (NSDictionary *)dictionaryRepresentation\n{\n    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];\n    dictionary[@\"feed\"] = self.feed ?: @\"\";\n    dictionary[@\"platform\"] = self.platform ?: @\"\";\n    dictionary[@\"name\"] = self.name ?: @\"\";\n    dictionary[@\"feedURL\"] = self.feedURL ?: @\"\";\n    dictionary[@\"_uniqueIdentifier\"] = self._uniqueIdentifier ?: @\"\";\n    dictionary[@\"icon\"] = self.iconName ?: @\"\";\n    dictionary[@\"size\"] = self.size ?: @\"\";\n    dictionary[@\"aliases\"] = self.aliases ?: @[];\n    dictionary[@\"doesNotHaveVersions\"] = self.doesNotHaveVersions ? @YES : @NO;\n    dictionary[@\"installed\"] = self.installed ? @YES : @NO;\n    dictionary[@\"isCustom\"] = self.isCustom ? @YES : @NO;\n    dictionary[@\"_isMajorVersioned\"] = self._isMajorVersioned ? @YES : @NO;\n    if(self.installedVersion) { dictionary[@\"installedVersion\"] = self.installedVersion; }\n    dictionary[@\"authorLinkHref\"] = self.authorLinkHref ?: @\"\";\n    dictionary[@\"authorLinkText\"] = self.authorLinkText ?: @\"\";\n    return dictionary;\n}\n\n+ (DHFeed *)feedWithDictionaryRepresentation:(NSDictionary *)dictionary\n{\n    DHFeed *feed = [[DHFeed alloc] init];\n    feed.detailString = @\"\";\n    feed.platform = dictionary[@\"platform\"];\n    feed.name = dictionary[@\"name\"];\n    feed.feed = dictionary[@\"feed\"];\n    feed.feedURL = dictionary[@\"feedURL\"];\n    feed._uniqueIdentifier = dictionary[@\"_uniqueIdentifier\"];\n    feed.size = dictionary[@\"size\"];\n    feed.iconName = dictionary[@\"icon\"];\n    feed.aliases = dictionary[@\"aliases\"];\n    feed.doesNotHaveVersions = [dictionary[@\"doesNotHaveVersions\"] boolValue];\n    feed.installed = [dictionary[@\"installed\"] boolValue];\n    feed._isMajorVersioned = [dictionary[@\"_isMajorVersioned\"] boolValue];\n    feed.installedVersion = dictionary[@\"installedVersion\"];\n    feed.authorLinkHref = dictionary[@\"authorLinkHref\"];\n    feed.authorLinkText = dictionary[@\"authorLinkText\"];\n    feed.isCustom = [dictionary[@\"isCustom\"] boolValue];\n    return feed;\n}\n\n- (NSString *)docsetNameWithVersion:(BOOL)withVersion\n{\n    NSString *docsetName = (self.name) ? self.name : [NSString stringWithFormat:@\"%@\", [[[[self.feedURL lastPathComponent] stringByDeletingPathExtension] stringByReplacingOccurrencesOfString:@\"_\" withString:@\" \"] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];\n    if([docsetName isEqualToString:@\"NET Framework\"])\n    {\n        docsetName = @\".NET Framework\";\n    }\n    else if([docsetName isEqualToString:@\"Angular.dart\"])\n    {\n        docsetName = @\"AngularDart\";\n    }\n    else if([docsetName isEqualToString:@\"MatPlotLib\"])\n    {\n        docsetName = @\"Matplotlib\";\n    }\n    else if([docsetName isEqualToString:@\"Lo-Dash\"])\n    {\n        docsetName = @\"Lodash\";\n    }\n    if(withVersion && self.installed && ![self.platform isEqualToString:@\"cheatsheet\"])\n    {\n        NSString *version = self.installedVersion;\n        version = [version substringToString:@\"/\"];\n        if([version length])\n        {\n            if([self isMajorVersioned:self.feedURL])\n            {\n                docsetName = [docsetName stringByAppendingFormat:@\"%@\", version];\n            }\n            else\n            {\n                docsetName = [docsetName stringByAppendingFormat:@\" %@\", version];\n            }\n        }\n    }\n    return docsetName;\n}\n\n- (BOOL)isMajorVersioned:(NSString *)feedURL\n{\n    if(self._isMajorVersioned)\n    {\n        return YES;\n    }\n    return [feedURL isEqualToString:@\"http://kapeli.com/feeds/Drupal_7.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Drupal_8.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Zend_Framework_1.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Zend_Framework_2.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Zend_Framework_3.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Bootstrap_2.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Bootstrap_3.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Bootstrap_4.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Python_2.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Python_3.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE6.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE7.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE8.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE9.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE10.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Java_SE11.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Ruby_on_Rails_3.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Ruby_on_Rails_4.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Ruby_on_Rails_5.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Qt_4.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Qt_5.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Lua_5.1.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Lua_5.2.xml\"] || [feedURL isEqualToString:@\"http://kapeli.com/feeds/Ruby_2.xml\"];\n}\n\n- (NSString *)sortName\n{\n    NSString *name = [self docsetNameWithVersion:YES];\n    if([name hasPrefix:@\"Angular.dart\"])\n    {\n        return [name stringByReplacingOccurrencesOfString:@\"Angular.dart\" withString:@\"Angularz.dart\"];\n    }\n    else if([name hasPrefix:@\"Java SE10\"])\n    {\n        return [name stringByReplacingOccurrencesOfString:@\"Java SE10\" withString:@\"Java SEz\"];\n    }\n    return name;\n}\n\n- (NSString *)stringValue\n{\n    return [self docsetNameWithVersion:NO];\n}\n\n- (void)prepareCell:(DHRepoTableViewCell *)cell\n{\n    self.cell = cell;\n    if(self.progressShown)\n    {\n        cell.progressView.alpha = 1.0;\n        cell.downloadButton.alpha = 0.0;\n        cell.uninstallButton.alpha = 0.0;\n        cell.checkmark.alpha = 0.0;\n        cell.progressView.progress = self.progress;\n    }\n    else\n    {\n        cell.progressView.alpha = 0.0;\n        if(self.installed)\n        {\n            cell.downloadButton.alpha = 0.0;\n            cell.uninstallButton.alpha = 1.0;\n            cell.checkmark.alpha = 1.0;\n        }\n        else\n        {\n            cell.downloadButton.alpha = 1.0;\n            cell.uninstallButton.alpha = 0.0;\n            cell.checkmark.alpha = 0.0;\n        }\n    }\n    if(self.error.length && !self.installing && !self.installed)\n    {\n        cell.errorButton.alpha = 1.0;\n    }\n    else\n    {\n        cell.errorButton.alpha = 0.0;\n    }\n    [self adjustTitleLabelWidthBasedOnButtonsShown];\n}\n\n- (void)adjustTitleLabelWidthBasedOnButtonsShown\n{\n    CGFloat endX = self.cell.downloadButton.frame.origin.x;\n    if(self.cell.errorButton.alpha > 0.0)\n    {\n        endX = self.cell.errorButton.frame.origin.x;\n    }\n    else if(self.cell.uninstallButton.alpha > 0.0)\n    {\n        int offset = (isRegularHorizontalClass) ? 3 : 0;\n        endX = self.cell.errorButton.frame.origin.x+offset;\n    }\n    endX -= 6;\n    CGRect frame = self.cell.titleLabel.frame;\n    self.cell.titleLabel.frame = CGRectMake(frame.origin.x, frame.origin.y, endX-frame.origin.x, frame.size.height);\n}\n\n- (UIImage *)icon\n{\n    if(self._icon)\n    {\n        return self._icon;\n    }\n    UIImage *image = [UIImage imageNamed:self.iconName];\n    return (image) ? image : [UIImage imageNamed:@\"Other\"];\n}\n\n- (BOOL)isEqual:(id)object\n{\n    return [self.uniqueIdentifier isEqualToString:[object uniqueIdentifier]];\n}\n\n- (NSString *)uniqueIdentifier // Used to find a corresponding feed from a installed docset\n{\n    if(self._uniqueIdentifier.length)\n    {\n        return self._uniqueIdentifier;\n    }\n    return self.feedURL;\n}\n\n- (NSString *)installFolderName\n{\n    return (self._uniqueIdentifier.length) ? self._uniqueIdentifier.lastPathComponent : self.feed.lastPathComponent.stringByDeletingPathExtension;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHFeedResult.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHFileDownload.h\"\n\n@interface DHFeedResult : NSObject\n\n@property (strong) NSArray *downloadURLs;\n@property (strong) NSString *version;\n@property (assign) NSUInteger expectedContentLength;\n@property (assign) NSUInteger receivedContentLength;\n@property (strong) DHFileDownload *fileDownload;\n@property (weak) id feed;\n@property (strong) NSDate *lastDownloadProgressUpdate;\n@property (assign) double lastProgress;\n@property (assign, nonatomic) BOOL hasTarix;\n\n- (BOOL)isCancelled;\n- (void)setUnarchiveProgress:(double)progress;\n- (void)setIndexingProgress:(double)progress;\n- (void)setDownloadProgress:(double)progress receivedBytes:(long long)length outOf:(long long)expectedLength;\n- (void)setRightDetail:(NSString *)rightDetail;\n\n@end\n"
  },
  {
    "path": "Dash/DHFeedResult.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHFeedResult.h\"\n#import \"DHFeed.h\"\n#import \"DHTransferFeed.h\"\n\n@implementation DHFeedResult\n\n- (void)setUnarchiveProgress:(double)progress\n{\n    if(![self isCancelled])\n    {\n        progress = (self.hasTarix) ? 0.75 : 0.4+progress/2.0/1.25;\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            [self.feed setProgress:progress];\n            [[[self.feed cell] progressView] setProgress:progress animated:YES];\n        });\n    }\n}\n\n- (void)setIndexingProgress:(double)progress\n{\n    if(![self isCancelled])\n    {\n        progress = ([self.feed isKindOfClass:[DHTransferFeed class]]) ? progress : (self.hasTarix) ? 0.75 + progress/4 : 0.8+progress/5;\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            [self.feed setProgress:progress];\n            [[[self.feed cell] progressView] setProgress:progress animated:YES];\n        });\n    }\n}\n\n- (void)setDownloadProgress:(double)progress receivedBytes:(long long)length outOf:(long long)expectedLength\n{\n    if(![self isCancelled])\n    {\n        double unalteredProgress = progress;\n        progress = (self.hasTarix) ? progress/2*1.5 : progress/2/1.25;\n        [self.feed setProgress:progress];\n        [[[self.feed cell] progressView] setProgress:progress animated:YES];\n        if(expectedLength != -1)\n        {\n            NSDate *lastNameUpdate = self.lastDownloadProgressUpdate;\n            NSDate *now = [NSDate date];\n            if(!lastNameUpdate || [now timeIntervalSinceDate:lastNameUpdate] > 1.0 || fabs(self.lastProgress - unalteredProgress) > 0.05 || unalteredProgress == 1.0)\n            {\n                if(!lastNameUpdate)\n                {\n                    NSString *maxString = [NSString stringByFormattingDownloadProgress:expectedLength totalBytes:expectedLength];\n                    CGFloat maxWidth = [DHRightDetailLabel calculateMaxDetailWidthBasedOnLongestPossibleString:maxString];\n                    [self.feed setMaxRightDetailWidth:maxWidth];\n                    [(DHFeed*)self.feed setSize:[maxString substringFromString:@\"/\"]];\n                    [[[self.feed cell] titleLabel] setMaxRightDetailWidth:maxWidth];\n                }\n                self.lastDownloadProgressUpdate = now;\n                self.lastProgress = unalteredProgress;\n                if(expectedLength > 0)\n                {\n                    NSString *progressString = [NSString stringByFormattingDownloadProgress:length totalBytes:expectedLength];\n                    [self setRightDetail:progressString];\n                }\n            }            \n        }\n    }\n}\n\n- (void)setRightDetail:(NSString *)rightDetail\n{\n    if(![NSThread isMainThread])\n    {\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            [self setRightDetail:rightDetail];\n        });\n        return;\n    }\n    [self.feed setDetailString:rightDetail];\n    [self.feed cell].titleLabel.rightDetailText = rightDetail;\n}\n\n- (BOOL)isCancelled\n{\n    return ![self.feed installing] || [self.feed feedResult] != self;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHFileDownload.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHFileDownload : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate>\n\n@property (nonatomic) NSURLSession *session;\n@property (nonatomic) NSURLSessionTask *downloadTask;\n@property (retain) NSError *error;\n@property (retain) NSString *filePath;\n@property (assign) BOOL isDone;\n@property (retain) id delegate;\n@property (retain) id identifier;\n@property (assign) BOOL cancelled;\n\n+ (BOOL)downloadItemAtURL:(NSURL *)url toFile:(NSString *)localPath error:(NSError **)error delegate:(id)delegate identifier:(id)identifier;\n- (void)cancelDownload;\n\n@end\n\n#define DHDownloadCancelled 2481939\n"
  },
  {
    "path": "Dash/DHFileDownload.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHFileDownload.h\"\n#import \"DHFeedResult.h\"\n\n@implementation DHFileDownload\n\n+ (BOOL)downloadItemAtURL:(NSURL *)url toFile:(NSString *)localPath error:(NSError **)error delegate:(id)delegate identifier:(id)identifier\n{\n    NSString *newURL = [[url absoluteString] stringByConvertingKapeliHttpURLToHttpsReturningNil];\n    if(newURL.length)\n    {\n        url = [NSURL URLWithString:newURL];\n    }\n    if(![NSURL URLIsFound:[url absoluteString] timeoutInterval:120.0 checkForRedirect:NO])\n    {\n        return NO;\n    }\n    DHFileDownload *fileDownload = [[DHFileDownload alloc] init];\n    if(identifier && [identifier isKindOfClass:[DHFeedResult class]])\n    {\n        [identifier setExpectedContentLength:0];\n        [identifier setReceivedContentLength:0];\n        [identifier setFileDownload:fileDownload];\n    }\n    \n    fileDownload.identifier = identifier;\n    fileDownload.delegate = delegate;\n    fileDownload.filePath = localPath;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if([fileManager fileExistsAtPath:localPath])\n    {\n        [fileManager removeItemAtPath:localPath error:nil];\n    }\n    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@\"%@%u\", [url absoluteString], arc4random() % 100000]];\n    configuration.timeoutIntervalForRequest = 900;\n    configuration.HTTPAdditionalHeaders = @{@\"User-Agent\": [[NSBundle mainBundle] bundleIdentifier]};\n    fileDownload.session = [NSURLSession sessionWithConfiguration:configuration delegate:fileDownload delegateQueue:nil];\n    \n    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:900.0];\n    fileDownload.downloadTask = [fileDownload.session downloadTaskWithRequest:request];\n    [fileDownload.downloadTask resume];\n\n    \n    while(!fileDownload.isDone)\n    {\n        [NSThread sleepForTimeInterval:0.1f];\n    }\n    \n    if(identifier && [identifier isKindOfClass:[DHFeedResult class]])\n    {\n        [identifier setFileDownload:nil];\n    }\n    fileDownload.identifier = nil;\n    fileDownload.delegate = nil;\n    fileDownload.downloadTask = nil;\n    if(fileDownload.error != nil)\n    {\n        if(error != nil)\n        {\n            *error = fileDownload.error;\n        }\n        [fileDownload.session invalidateAndCancel];\n        fileDownload.session = nil;\n        return NO;\n    }\n    [fileDownload.session invalidateAndCancel];\n    fileDownload.session = nil;\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        [identifier setDownloadProgress:1.0 receivedBytes:-1 outOf:-1];\n    });\n    return YES;\n}\n\n- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite\n{\n    if(totalBytesExpectedToWrite > 0)\n    {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [self.identifier setDownloadProgress:(double)totalBytesWritten/totalBytesExpectedToWrite receivedBytes:totalBytesWritten outOf:totalBytesExpectedToWrite];\n        });\n    }\n}\n\n- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL\n{\n    if(downloadURL && [downloadURL path] && [[NSFileManager defaultManager] fileExistsAtPath:[downloadURL path]])\n    {\n        [[NSFileManager defaultManager] moveItemAtPath:[downloadURL path] toPath:self.filePath error:nil];\n    }\n}\n\n- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes\n{\n    NSLog(@\"resumed at offset!?\");\n}\n\n- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error\n{\n    self.isDone = YES;\n    if(error)\n    {\n        if(!self.cancelled)\n        {\n            self.error = error;\n        }\n    }\n}\n\n- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session\n{\n\n}\n\n- (void)cancelDownload\n{\n    self.cancelled = YES;\n    self.error = [NSError errorWithDomain:@\"com.kapeli.dash\" code:DHDownloadCancelled userInfo:@{NSLocalizedDescriptionKey: [NSString stringWithFormat:@\"%d\", DHDownloadCancelled]}];\n    [self.identifier setExpectedContentLength:0];\n    [self.identifier setReceivedContentLength:0];\n    self.isDone = YES;\n    [self.downloadTask cancel];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHImageCache.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHImageCache : NSObject\n\n@property (strong) NSMutableDictionary *filesCache;\n\n+ (DHImageCache *)sharedCache;\n+ (UIImage *)imageWithContentsOfFile:(NSString *)path fullRefresh:(BOOL)fullRefresh;\n\n@end\n"
  },
  {
    "path": "Dash/DHImageCache.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHImageCache.h\"\n\n@implementation DHImageCache\n\n+ (DHImageCache *)sharedCache\n{\n    static dispatch_once_t pred;\n    static DHImageCache *_imageCache = nil;\n\n    dispatch_once(&pred, ^{\n        _imageCache = [[DHImageCache alloc] init];\n        _imageCache.filesCache = [NSMutableDictionary dictionary];\n    });\n    return _imageCache;\n}\n\n+ (UIImage *)imageWithContentsOfFile:(NSString *)path fullRefresh:(BOOL)fullRefresh\n{\n    if(!path || !path.length)\n    {\n        return nil;\n    }\n    DHImageCache *cache = [DHImageCache sharedCache];\n    if(fullRefresh)\n    {\n        [cache.filesCache removeObjectForKey:path];\n    }\n    id image = (cache.filesCache)[path];\n    if(image == [NSNull null])\n    {\n        return nil;\n    }\n    else if(image)\n    {\n        return image;\n    }\n    else\n    {\n        BOOL exists = NO;\n        NSFileManager *fileManager = [NSFileManager defaultManager];\n        NSString *retinaPath = [[path stringByDeletingPathExtension] stringByAppendingString:@\"@2x.png\"];\n        if([[path pathExtension] isEqualToString:@\"png\"] && [fileManager fileExistsAtPath:retinaPath])\n        {\n            exists = YES;\n            path = retinaPath;\n        }\n        if(exists || [fileManager fileExistsAtPath:path])\n        {\n            image = [UIImage imageWithContentsOfFile:path];            \n        }\n        if(image)\n        {\n            (cache.filesCache)[path] = image;\n        }\n        else\n        {\n            (cache.filesCache)[path] = [NSNull null];\n        }\n        return image;\n    }\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHJavaScript.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHJavaScript : NSObject\n\n@property (strong) NSMutableDictionary *javaScripts;\n\n+ (DHJavaScript *)sharedJavaScript;\n- (NSString *)javaScriptInFile:(NSString *)file;\n- (NSString *)zoomScriptWithFrame:(CGRect)frame;\n- (NSString *)injectCSSScript;\n- (NSString *)injectViewPortScript;\n\n@end\n"
  },
  {
    "path": "Dash/DHJavaScript.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHJavaScript.h\"\n#import \"DHCSS.h\"\n#import \"DHWebView.h\"\n#import \"DHWebViewController.h\"\n\n@implementation DHJavaScript\n\n+ (DHJavaScript *)sharedJavaScript\n{\n    static dispatch_once_t pred;\n    static DHJavaScript *_javaScript = nil;\n    \n    dispatch_once(&pred, ^{\n        _javaScript = [[DHJavaScript alloc] init];\n        _javaScript.javaScripts = [[NSMutableDictionary alloc] init];\n    });\n    return _javaScript;\n}\n\n- (NSString *)javaScriptInFile:(NSString *)file\n{\n    if(self.javaScripts[file])\n    {\n        return self.javaScripts[file];\n    }\n    NSString *javaScript = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@\"js\"] encoding:NSUTF8StringEncoding error:nil];\n    self.javaScripts[file] = javaScript;\n    return javaScript;\n}\n\n- (NSString *)zoomScriptWithFrame:(CGRect)frame\n{\n    return [NSString stringWithFormat:@\"document.getElementById('dash_viewport').setAttribute('content', 'width=%ld, initial-scale=1');\", (long)frame.size.width];\n}\n\n- (NSString *)injectCSSScript\n{\n    NSString *css = [DHCSS currentCSSStringWithTextModifier];\n    css = [[css stringByReplacingOccurrencesOfString:@\"\\n\" withString:@\"\\\\\\n\"] stringByReplacingOccurrencesOfString:@\"'\" withString:@\"\\\\'\"];\n    return [NSString stringWithFormat:@\"var style = document.createElement('style'); style.innerText = '%@'; document.head.insertBefore(style, document.head.childNodes[0]);\", css];\n}\n\n- (NSString *)injectViewPortScript\n{\n    return [NSString stringWithFormat:@\"var surogate = document.createElement('div'); surogate.innerHTML = \\\"<meta id='dash_viewport' name='viewport' content='%@'/>\\\"; var meta = surogate.childNodes[0]; document.head.appendChild(meta);\", [DHWebView viewportContent:[DHWebViewController sharedWebViewController].webView.frame]];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHJavaScriptBridge.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import <JavaScriptCore/JavaScriptCore.h>\n\n@protocol DHJavaScriptBridgeExport <JSExport>\n\n- (void)switchAppleLanguage:(JSValue *)value;\n- (void)newSwitchAppleLanguage:(JSValue *)nameValue;\n- (void)log:(JSValue *)value;\n- (void)coffeeScriptOpenLink_:(NSString *)string;\n- (void)unityConsoleLog:(NSString *)message;\n- (void)showFallbackExplanation;\n- (void)loadFallbackURL_:(JSValue *)suppressButtonChecked;\n- (void)openDownloads;\n- (void)openDocsets;\n- (void)openProfiles;\n- (void)openGuide;\n- (void)openIOSLink;\n- (void)webViewDidChangeLocationWithinPage;\n\n@end\n\n@interface DHJavaScriptBridge : NSObject <DHJavaScriptBridgeExport>\n\n@property (nonatomic, copy) void (^alertBlock)(JSValue *message);\n\n+ (DHJavaScriptBridge *)sharedBridge;\n\n@end\n"
  },
  {
    "path": "Dash/DHJavaScriptBridge.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHJavaScriptBridge.h\"\n#import \"DHWebViewController.h\"\n#import \"DHCSS.h\"\n\n@implementation DHJavaScriptBridge\n\n+ (DHJavaScriptBridge *)sharedBridge\n{\n    static dispatch_once_t pred;\n    static DHJavaScriptBridge *_singleton = nil;\n    \n    dispatch_once(&pred, ^{\n        _singleton = [[DHJavaScriptBridge alloc] init];\n        _singleton.alertBlock = ^(JSValue *message) {\n            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@\"JavaScript Alert\" message:[message toString] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil];\n            [alert show];\n        };\n    });\n    return _singleton;\n}\n\n- (void)switchAppleLanguage:(JSValue *)nameValue\n{\n    NSString *name = [nameValue toString];\n    name = [name trimWhitespace];\n    if(name && name.length)\n    {\n        [[NSUserDefaults standardUserDefaults] setObject:name forKey:DHActiveAppleLanguageKey];\n        [[DHCSS sharedCSS] refreshActiveCSS];\n        [[DHWebViewController sharedWebViewController] reload];\n        if([DHRemoteServer sharedServer].connectedRemote)\n        {\n            [[DHRemoteServer sharedServer] sendObject:@{@\"language\": name} forRequestName:@\"syncAppleLanguage\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n        }\n    }\n}\n\n- (void)newSwitchAppleLanguage:(JSValue *)nameValue\n{\n    NSString *text = [[nameValue toString] trimWhitespace];\n    if([text contains:@\"Swift\"])\n    {\n        [DHAppleActiveLanguage setLanguage:DHNewActiveAppleLanguageSwift];\n    }\n    else if([text contains:@\"Objective-C\"] || [text contains:@\"ObjC\"])\n    {\n        [DHAppleActiveLanguage setLanguage:DHNewActiveAppleLanguageObjC];\n    }\n    if([DHRemoteServer sharedServer].connectedRemote)\n    {\n        [[DHRemoteServer sharedServer] sendObject:@{@\"language\": @([DHAppleActiveLanguage currentLanguage])} forRequestName:@\"syncNewAppleLanguage\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n    }\n}\n\n- (void)unityConsoleLog:(NSString *)message\n{\n    if([message isKindOfClass:[JSValue class]])\n    {\n        message = [(JSValue*)message toString];\n    }\n    if([message isKindOfClass:[NSString class]] && [message isEqualToString:@\"selected\"])\n    {\n        NSString *value = [[[DHWebViewController sharedWebViewController] webView] stringByEvaluatingJavaScriptFromString:@\"document.getElementsByClassName('cSelect-Selected')[0].innerText\"];\n        if(value && value.length)\n        {\n            [[NSUserDefaults standardUserDefaults] setObject:value forKey:@\"unitySelectedSnippetLanguage\"];\n        }\n    }\n}\n\n- (void)coffeeScriptOpenLink_:(NSString *)string\n{\n    NSURL *url = [NSURL URLWithString:[@\"http://coffeescript.org/\" stringByAppendingString:string]];\n    if(url)\n    {\n        [[UIApplication sharedApplication] openURL:url];\n    }\n}\n\n- (void)showFallbackExplanation\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"showFallbackExplanation\", @\"shouldShowWindow\": @YES} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)loadFallbackURL_:(JSValue *)suppressButtonChecked\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"loadFallbackURL:\", @\"arg\": @([suppressButtonChecked toBool])} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)openDownloads\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"openDownloads\"} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)openDocsets\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"openDocsets\"} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)openProfiles\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"openProfiles\", @\"shouldShowWindow\": @YES} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)openGuide\n{\n    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\"https://kapeli.com/dash_guide\"]];\n}\n\n- (void)openIOSLink\n{\n    [UIAlertView showWithTitle:@\"Dash for iOS\" message:@\"You're using it!\" cancelButtonTitle:@\"Okay\" otherButtonTitles:nil tapBlock:nil];\n}\n\n- (void)webViewDidChangeLocationWithinPage\n{\n    [[DHWebViewController sharedWebViewController] webViewDidChangeLocationWithinPage];\n}\n\n- (void)log:(JSValue *)value\n{\n    NSLog(@\"JS Log: %@\", value);\n}\n@end\n"
  },
  {
    "path": "Dash/DHLatencyTestResult.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHLatencyTestResult : NSObject\n\n@property (retain) NSString *host;\n@property (assign) double latency;\n@property (retain) NSDate *startTestDate;\n@property (retain) NSDate *lastTestDate;\n@property (assign) BOOL isPerformingTest;\n\n+ (DHLatencyTestResult *)resultWithDictionaryRepresentation:(NSDictionary *)dictionary;\n+ (DHLatencyTestResult *)resultWithHost:(NSString *)host latency:(double)latency;\n- (NSDictionary *)dictionaryRepresentation;\n- (void)performTest;\n- (BOOL)shouldPerformTest;\n- (double)adaptiveLatency;\n\n@end\n"
  },
  {
    "path": "Dash/DHLatencyTestResult.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHLatencyTestResult.h\"\n#import \"DHLatencyTester.h\"\n\n@implementation DHLatencyTestResult\n\n+ (DHLatencyTestResult *)resultWithDictionaryRepresentation:(NSDictionary *)dictionary\n{\n    return [DHLatencyTestResult resultWithHost:dictionary[@\"host\"] latency:[dictionary[@\"latency\"] doubleValue]];\n}\n\n+ (DHLatencyTestResult *)resultWithHost:(NSString *)host latency:(double)latency\n{\n    DHLatencyTestResult *result = [[DHLatencyTestResult alloc] init];\n    result.host = host;\n    result.latency = latency;\n    return result;\n}\n\n- (NSDictionary *)dictionaryRepresentation\n{\n    return @{@\"host\": self.host, @\"latency\": @(self.latency)};\n}\n\n- (BOOL)shouldPerformTest\n{\n    return (!self.lastTestDate || [[NSDate date] timeIntervalSinceDate:self.lastTestDate] > 60) && !self.isPerformingTest;\n}\n\n- (void)performTest\n{\n    if([self shouldPerformTest])\n    {\n        self.startTestDate = [NSDate date];\n        self.isPerformingTest = YES;\n        double minLatency = 10000.0;\n        BOOL success = NO;\n        BOOL didCheckExtraMirrors = NO;\n        for(int i = 0; i < 3; i++)\n        {\n            success = NO;\n            self.startTestDate = [NSDate date];\n            NSDate *then = [NSDate date];\n            NSString *theHost = self.host;\n            if([theHost hasSuffix:@\"/\"])\n            {\n                theHost = [theHost substringToDashIndex:theHost.length-1];\n            }\n            NSURL *url = [NSURL URLWithString:[[theHost stringByAppendingFormat:@\"/latencyTest_v2.txt?cache_buster=%u\", arc4random() % 1000000] stringByConvertingKapeliHttpURLToHttps]];\n            if(url)\n            {\n                NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0f];\n                NSURLResponse *response = nil;\n                NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];\n                NSString *string = nil;\n                if(data)\n                {\n                    string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n                    if(string && [string hasPrefix:@\"Just a latency test. Move along.\"])\n                    {\n                        NSTimeInterval latency = [[NSDate date] timeIntervalSinceDate:then];\n                        \n                        if(minLatency > latency)\n                        {\n                            minLatency = latency;\n                            self.latency = latency;\n                        }\n                        success = YES;\n                        if(!didCheckExtraMirrors)\n                        {\n                            // E.g. Extra mirrors: http://newyork3.kapeli.com/feeds/, http://newyork4.kapeli.com/feeds/\n                            NSString *mirrorsString = [string substringFromStringReturningNil:@\"Extra mirrors: \"];\n                            if(mirrorsString && mirrorsString.length)\n                            {\n                                NSMutableArray *mirrors = [NSMutableArray arrayWithArray:[mirrorsString componentsSeparatedByString:@\", \"]];\n                                if(mirrors && mirrors.count)\n                                {\n                                    didCheckExtraMirrors = YES;\n                                    dispatch_async(dispatch_get_main_queue(), ^{\n                                        [[DHLatencyTester sharedLatency] checkExtraMirrors:mirrors];\n                                    });\n                                }\n                            }\n                        }\n                    }\n                }\n                if(!success)\n                {\n                    self.latency = 10000.0;\n                    break;\n                }\n            }\n        }\n        if(success && minLatency > 0 && minLatency < 10000.0)\n        {\n            self.latency = minLatency;\n        }\n//        NSLog(@\"%f for %@\", self.latency, self.host);\n        self.lastTestDate = [NSDate date];\n        self.startTestDate = nil;\n        self.isPerformingTest = NO;\n    }\n}\n\n- (double)adaptiveLatency\n{\n    if(self.isPerformingTest && self.startTestDate)\n    {\n        double interval = [[NSDate date] timeIntervalSinceDate:self.startTestDate];\n        return (interval > self.latency) ? interval : self.latency;\n    }\n    return self.latency;\n}\n\n- (BOOL)isEqual:(id)object\n{\n    return [self.host isEqualToString:[object host]];\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:@\"%@ - %f\", self.host, [self adaptiveLatency]];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHLatencyTester.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHLatencyTester : NSObject\n\n@property (retain) NSMutableArray *results;\n@property (retain) NSOperationQueue *queue;\n@property (retain) NSMutableArray *defaultResults;\n@property (retain) NSMutableArray *resultsAllowedInUserDefaults;\n\n+ (DHLatencyTester *)sharedLatency;\n- (BOOL)performTests:(BOOL)forcePerform;\n- (void)saveDefaults;\n- (void)sortURLsBasedOnLatency:(NSMutableArray *)urls;\n- (void)checkExtraMirrors:(NSMutableArray *)mirrors;\n- (NSString *)bestMirrorReturningNil;\n- (NSString *)bestMirror;\n- (NSString *)secondBestMirror;\n- (NSMutableArray *)sortedTestResults;\n\n@end\n"
  },
  {
    "path": "Dash/DHLatencyTester.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHLatencyTester.h\"\n#import \"DHLatencyTestResult.h\"\n\n@implementation DHLatencyTester\n\n+ (DHLatencyTester *)sharedLatency\n{\n    static dispatch_once_t pred;\n    static DHLatencyTester *_latency = nil;\n    \n    dispatch_once(&pred, ^{\n        _latency = [[DHLatencyTester alloc] init];\n        [_latency setUp];\n    });\n    return _latency;\n}\n\n- (BOOL)performTests:(BOOL)forcePerform\n{\n    BOOL didPerform = NO;\n    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@\"didPerformLatencyTestsBefore\"];\n    @synchronized(self)\n    {\n        if(!self.queue)\n        {\n            self.queue = [[NSOperationQueue alloc] init] ;\n            [self.queue setMaxConcurrentOperationCount:1];\n        }\n        for(DHLatencyTestResult *result in self.results)\n        {\n            if(forcePerform)\n            {\n                result.lastTestDate = nil;\n            }\n            if([result shouldPerformTest])\n            {\n                didPerform = YES;\n                [self.queue addOperationWithBlock:^{\n                    __block BOOL done = NO;\n                    dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n                    dispatch_async(queue, ^{\n                        [result performTest];\n                        done = YES;\n                    });\n                    NSDate *startDate = [NSDate date];\n                    while(!done && [[NSDate date] timeIntervalSinceDate:startDate] < 15 && (!result.startTestDate || [[NSDate date] timeIntervalSinceDate:result.startTestDate] < 3))\n                    {\n                        [NSThread sleepForTimeInterval:0.03];\n                    }\n                }];\n            }\n        }\n        if(didPerform)\n        {\n            [self.queue addOperationWithBlock:^{\n                dispatch_sync(dispatch_get_main_queue(), ^{\n                    [self saveDefaults];\n                });\n            }];\n        }\n    }\n    return didPerform;\n}\n\n- (void)setUp\n{\n    self.resultsAllowedInUserDefaults = [NSMutableArray array];\n    self.defaultResults = [NSMutableArray array];\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    BOOL didPerformTestsBefore = [defaults boolForKey:@\"didPerformLatencyTestsBefore\"];\n    self.results = [NSMutableArray array];\n    NSMutableArray *resultsTemp = [NSMutableArray array];\n    for(NSDictionary *resultDict in [defaults objectForKey:@\"latencyTestResults\"])\n    {\n        [self.defaultResults addObject:[DHLatencyTestResult resultWithDictionaryRepresentation:resultDict]];\n        [resultsTemp addObject:self.defaultResults.lastObject];\n    }\n    for(NSString *host in @[@\"http://sanfrancisco.kapeli.com/feeds/\", @\"http://newyork.kapeli.com/feeds/\", @\"http://london.kapeli.com/feeds/\"])\n    {\n        DHLatencyTestResult *result = [DHLatencyTestResult resultWithHost:host latency:10000.0];\n        [self.resultsAllowedInUserDefaults addObject:result];\n        if(![resultsTemp containsObject:result])\n        {\n            [resultsTemp addObject:result];\n        }\n    }\n    [self sortLatencyTestResults:resultsTemp];\n    self.results = [NSMutableArray arrayWithArray:resultsTemp];\n    if(didPerformTestsBefore)\n    {\n        [self performTests:NO];\n    }\n}\n\n- (void)saveDefaults\n{\n    if(![NSThread isMainThread])\n    {\n        [self performSelectorOnMainThread:@selector(saveDefaults) withObject:nil waitUntilDone:YES];\n        return;\n    }\n    NSMutableArray *array = [NSMutableArray array];\n    @synchronized(self)\n    {\n        for(DHLatencyTestResult *result in self.results)\n        {\n            if(result.latency < 60 && [self.resultsAllowedInUserDefaults containsObject:result])\n            {\n                [array addObject:[result dictionaryRepresentation]];\n            }\n        }\n    }\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    [defaults setObject:array forKey:@\"latencyTestResults\"];\n}\n\n- (NSString *)bestMirrorReturningNil\n{\n    if(!self.results.count)\n    {\n        return nil;\n    }\n    return [[self sortedTestResults][0] host];\n}\n\n- (NSString *)secondBestMirrorReturningNil\n{\n    if(self.results.count < 2)\n    {\n        return nil;\n    }\n    return [[self sortedTestResults][1] host];\n}\n\n- (NSMutableArray *)sortedTestResults\n{\n    NSMutableArray *results = [NSMutableArray arrayWithArray:self.results];\n    [self sortLatencyTestResults:results];\n    return results;\n}\n\n- (void)sortLatencyTestResults:(NSMutableArray *)results\n{\n    [results sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {\n        double myLatency = [obj1 adaptiveLatency];\n        double theirLatency = [obj2 adaptiveLatency];\n        if(myLatency < theirLatency)\n        {\n            return NSOrderedAscending;\n        }\n        else if(myLatency > theirLatency)\n        {\n            return NSOrderedDescending;\n        }\n        return NSOrderedSame;\n    }];\n}\n\n- (NSString *)bestMirror\n{\n    NSString *best = [self bestMirrorReturningNil];\n    if(!best)\n    {\n        return @\"http://kapeli.com/feeds/\";\n    }\n    return best;\n}\n\n\n- (NSString *)secondBestMirror\n{\n    NSString *best = [self secondBestMirrorReturningNil];\n    if(!best)\n    {\n        return @\"http://london.kapeli.com/feeds/\";\n    }\n    return best;\n}\n\n- (void)sortURLsBasedOnLatency:(NSMutableArray *)urls\n{\n    [urls sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {\n        double myLatency = [self latencyForURL:obj1];\n        double theirLatency = [self latencyForURL:obj2];\n        if(myLatency < theirLatency)\n        {\n            return NSOrderedAscending;\n        }\n        else if(myLatency > theirLatency)\n        {\n            return NSOrderedDescending;\n        }\n        return NSOrderedSame;\n    }];\n}\n\n- (double)latencyForURL:(NSString *)aURL\n{\n    @synchronized(self)\n    {\n        for(DHLatencyTestResult *result in self.results)\n        {\n            if([aURL hasCaseInsensitivePrefix:result.host])\n            {\n                return [result adaptiveLatency];\n            }\n        }\n    }\n    return 10000.0;\n}\n\n- (void)checkExtraMirrors:(NSMutableArray *)mirrors\n{\n    @synchronized(self)\n    {\n        if(mirrors.count)\n        {\n            for(NSString *mirror in mirrors)\n            {\n                DHLatencyTestResult *result = [DHLatencyTestResult resultWithHost:mirror latency:10000.0];\n                if(![self.results containsObject:result])\n                {\n                    [self.results addObject:result];\n                }\n                if(![self.resultsAllowedInUserDefaults containsObject:result])\n                {\n                    [self.resultsAllowedInUserDefaults addObject:result];\n                }\n            }\n            [self performTests:NO];\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHLoadingCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"6245\" systemVersion=\"13F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"6238\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHLoadingCell\" textLabel=\"z5o-gQ-aLM\" style=\"IBUITableViewCellStyleDefault\" id=\"c3g-P3-5nq\" userLabel=\"Loading Cell\" colorLabel=\"IBBuiltInLabel-Blue\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n            <autoresizingMask key=\"autoresizingMask\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"c3g-P3-5nq\" id=\"wYC-xT-hQ1\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"43\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" text=\"Title\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"z5o-gQ-aLM\">\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"16\"/>\n                        <color key=\"textColor\" cocoaTouchSystemColor=\"scrollViewTexturedBackgroundColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </tableViewCellContentView>\n            <inset key=\"separatorInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n            <point key=\"canvasLocation\" x=\"139\" y=\"154\"/>\n        </tableViewCell>\n    </objects>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\" type=\"retina4\"/>\n    </simulatedMetricsContainer>\n</document>\n"
  },
  {
    "path": "Dash/DHNavigationAnimator.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHNavigationAnimator : NSObject <UIViewControllerAnimatedTransitioning>\n\n@property (assign) BOOL noAnimation;\n\n@end\n"
  },
  {
    "path": "Dash/DHNavigationAnimator.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHNavigationAnimator.h\"\n#import \"DHPreferences.h\"\n#import \"DHWebViewController.h\"\n\n@implementation DHNavigationAnimator\n\n- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext\n{\n    if(self.noAnimation)\n    {\n        return 0.00001;\n    }\n    return 0.3;\n}\n\n- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext\n{\n    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];\n    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];\n    \n    if(!isRegularHorizontalClass)\n    {\n        BOOL isOpening = [toViewController isKindOfClass:[DHPreferences class]];\n        if(isOpening)\n        {\n            [[transitionContext containerView] addSubview:toViewController.view];\n            toViewController.view.alpha = 1;\n            CGRect endFrame = fromViewController.view.frame;\n            CGRect startFrame = endFrame;\n            startFrame.origin.y = CGRectGetMaxY(endFrame);\n            toViewController.view.frame = startFrame;\n            \n            [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{\n                toViewController.view.frame = endFrame;\n            } completion:^(BOOL finished) {\n                fromViewController.view.transform = CGAffineTransformIdentity;\n                [transitionContext completeTransition:YES];\n            }];\n        }\n        else\n        {\n            [[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view];\n            toViewController.view.alpha = 1;\n            CGRect endFrame = fromViewController.view.frame;\n            toViewController.view.frame = fromViewController.view.frame;\n            endFrame.origin.y = CGRectGetMaxY(endFrame);\n            \n            [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{\n                fromViewController.view.frame = endFrame;\n            } completion:^(BOOL finished) {\n                fromViewController.view.transform = CGAffineTransformIdentity;\n                [transitionContext completeTransition:YES];\n            }];\n        }\n    }\n    else\n    {\n        [[transitionContext containerView] addSubview:toViewController.view];\n        toViewController.view.alpha = 0;\n        toViewController.view.frame = fromViewController.view.frame;\n        \n        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{\n            toViewController.view.alpha = 1;\n        } completion:^(BOOL finished) {\n            fromViewController.view.transform = CGAffineTransformIdentity;\n            [transitionContext completeTransition:YES];\n        }];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHNavigationController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHNavigationController : UINavigationController\n\n@end\n"
  },
  {
    "path": "Dash/DHNavigationController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHNavigationController.h\"\n\n@implementation DHNavigationController\n\n\n@end\n"
  },
  {
    "path": "Dash/DHNestedViewController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHDBResult.h\"\n#import \"DHWebViewController.h\"\n\n@interface DHNestedViewController : UITableViewController\n\n@property (retain) DHDBResult *result;\n@property (assign) BOOL hasMultipleDocsets;\n@property (assign) BOOL didDecode;\n\n@end\n"
  },
  {
    "path": "Dash/DHNestedViewController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHNestedViewController.h\"\n#import \"DHBrowserTableViewCell.h\"\n\n@implementation DHNestedViewController\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    self.clearsSelectionOnViewWillAppear = NO;\n    self.title = self.result.name;\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    for(DHDBResult *result in self.result.similarResults)\n    {\n        if(result.docset != self.result.docset)\n        {\n            self.hasMultipleDocsets = YES;\n        }\n        else if(result.isRemote && ![result.remoteDocsetName isEqualToString:self.result.remoteDocsetName])\n        {\n            self.hasMultipleDocsets = YES;\n        }\n    }\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    if(isRegularHorizontalClass)\n    {\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:[self activeRow] inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];\n        });\n    }\n    else\n    {\n        if(self.result.isRemote)\n        {\n            if(self.tableView.indexPathForSelectedRow)\n            {\n                [self.tableView scrollToRowAtIndexPath:self.tableView.indexPathForSelectedRow atScrollPosition:UITableViewScrollPositionNone animated:NO];\n            }\n            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                [self.tableView deselectAll:YES];\n            });\n        }\n        else\n        {\n            [self.tableView deselectAll:YES];\n        }\n    }\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    if(isRegularHorizontalClass && !self.didDecode)\n    {\n        [[DHDBResultSorter sharedSorter] resultWasSelected:[self resultForRow:[self activeRow]] inTableView:self.tableView];\n    }\n    self.didDecode = NO;\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.tableView reloadData];\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return 1;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    return self.result.similarResults.count+1;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHBrowserCell\" forIndexPath:indexPath];\n    \n    DHDBResult *result = [self resultForRow:indexPath.row];\n    [cell makeEntryCell];\n    cell.textLabel.attributedText = nil;\n    NSString *title = [result.declaredInPage substringFromString:@\" - \"];\n    title = (title.length) ? title : result.originalName;\n    cell.textLabel.text = title;\n    if(self.hasMultipleDocsets)\n    {\n        cell.titleLabel.subtitle = (result.isRemote) ? result.remoteDocsetName : result.docset.name;\n    }\n    cell.titleLabel.font = [UIFont fontWithName:@\"Menlo\" size:16];\n    cell.typeImageView.image = result.typeImage;\n    cell.platformImageView.image = result.platformImage;\n    cell.accessoryType = (!isRegularHorizontalClass) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;\n    return cell;\n}\n\n- (void)clearIsActive\n{\n    self.result.isActive = NO;\n    for(DHDBResult *result in self.result.similarResults)\n    {\n        result.isActive = NO;\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHDBResult *result = [self resultForRow:tableView.indexPathForSelectedRow.row];\n    [[DHDBResultSorter sharedSorter] resultWasSelected:result inTableView:tableView];\n    [[DHDBNestedResultSorter sharedSorter] increaseRankForResult:result];\n    if(isRegularHorizontalClass)\n    {\n        [self clearIsActive];\n        result.isActive = YES;\n        [[DHWebViewController sharedWebViewController] loadResult:result];\n    }\n    else\n    {\n        [[DHWebViewController sharedWebViewController] loadResult:result];\n        [self performSegueWithIdentifier:@\"DHSearchWebViewSegue\" sender:self];\n    }\n    if(result.isRemote)\n    {\n        NSString *remoteName = [DHRemoteServer sharedServer].connectedRemote.name;\n        if(remoteName)\n        {\n            [[DHRemoteServer sharedServer] sendObject:@{@\"selectedNestedRow\": @(tableView.indexPathForSelectedRow.row), @\"selectedRowName\": (self.result.name) ? : @\"justsendtheresults\"} forRequestName:@\"syncNestedSelectedRow\" encrypted:YES toMacName:remoteName];\n        }\n    }\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHSearchWebViewSegue\"])\n    {\n        DHWebViewController *webViewController = [segue destinationViewController];\n        DHDBResult *result = [self resultForRow:self.tableView.indexPathForSelectedRow.row];\n        webViewController.result = result;\n    }\n}\n\n- (DHDBResult *)resultForRow:(NSInteger)row\n{\n    return row == 0 ? self.result : self.result.similarResults[row-1];\n}\n\n- (NSInteger)activeRow\n{\n    int i = 1;\n    for(DHDBResult *result in self.result.similarResults)\n    {\n        if(result.isActive)\n        {\n            return i;\n        }\n        ++i;\n    }\n    return 0;\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super encodeRestorableStateWithCoder:coder];\n    [coder encodeObject:self.result forKey:@\"result\"];\n    [coder encodeBool:self.hasMultipleDocsets forKey:@\"hasMultipleDocsets\"];\n    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];\n    if(selectedIndexPath != nil)\n    {\n        [coder encodeObject:selectedIndexPath forKey:@\"selectedIndexPath\"];\n    }\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    self.didDecode = YES;\n    self.result = [coder decodeObjectForKey:@\"result\"];\n    self.hasMultipleDocsets = [coder decodeBoolForKey:@\"hasMultipleDocsets\"];\n    self.title = self.result.name;\n    NSIndexPath *selectedIndexPath = [coder decodeObjectForKey:@\"selectedIndexPath\"];\n    if(selectedIndexPath != nil)\n    {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n        });\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHPreferences.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHPreferences : UITableViewController\n\n@property (assign) IBOutlet UISwitch *updatesSwitch;\n@property (assign) IBOutlet UISwitch *alphabetizingSwitch;\n@property (assign) IBOutlet UITableViewCell *updatesCell;\n@property (assign) IBOutlet UITableViewCell *alphabetizingCell;\n@property (assign) BOOL didSetUpdateLabelBefore;\n\n- (IBAction)updatesSwitchValueChanged:(id)sender;\n- (IBAction)getDashForMacOS:(id)sender;\n- (NSString *)segueIdentifierForIndexPath:(NSIndexPath *)indexPath;\n\n@end\n"
  },
  {
    "path": "Dash/DHPreferences.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHPreferences.h\"\n#import \"DHWebViewController.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHDocsetDownloader.h\"\n#import \"DHDocsetTransferrer.h\"\n\n@implementation DHPreferences\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    [self.updatesSwitch setOn:[[NSUserDefaults standardUserDefaults] boolForKey:[[DHDocsetDownloader sharedDownloader] defaultsAutomaticallyCheckForUpdatesKey]]];\n    [self.alphabetizingSwitch setOn:[NSUserDefaults.standardUserDefaults boolForKey:DHDocsetDownloader.defaultsAlphabetizingKey]];\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [self updateAlphabetizingSwitchFooterView:nil];\n        [self updateUpdatesSwitchFooterView:nil];\n    });\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    [self.navigationController setToolbarHidden:NO animated:YES];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [self.navigationController.toolbar setHidden:YES];\n    [self.navigationController setToolbarHidden:YES animated:NO];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.tableView reloadData];\n    if(isRegularHorizontalClass)\n    {\n        self.clearsSelectionOnViewWillAppear = NO;\n        if(!self.tableView.indexPathForSelectedRow)\n        {\n            UIViewController *controller = [[self.splitViewController.viewControllers lastObject] topViewController];\n            NSString *controllerTitle = controller.navigationItem.title;\n            BOOL found = NO;\n            for(NSInteger section = 0; section < self.tableView.numberOfSections; section++)\n            {\n                for(NSInteger row = 0; row < [self.tableView numberOfRowsInSection:section]; row++)\n                {\n                    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];\n                    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];\n                    if([cell.textLabel.text isEqualToString:controllerTitle])\n                    {\n                        [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n                        found = YES;\n                        break;\n                    }\n                }\n            }\n            if(!found)\n            {\n                [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];\n            }\n        }\n    }\n    else\n    {\n        [self.tableView deselectAll:YES];\n        self.clearsSelectionOnViewWillAppear = YES;\n    }\n}\n\n- (IBAction)dismissModal:(id)sender\n{\n    [self.navigationController popViewControllerAnimated:YES];\n    UINavigationController *rightNavController = self.splitViewController.viewControllers.lastObject;\n    id toPopTo = nil;\n    for(id viewController in [[rightNavController.viewControllers reverseObjectEnumerator] allObjects])\n    {\n        if([viewController isKindOfClass:[DHWebViewController class]])\n        {\n            toPopTo = viewController;\n            break;\n        }\n    }\n    if(toPopTo)\n    {\n        [(DHWebViewController *)toPopTo view].frame = rightNavController.view.bounds;\n        [rightNavController popToViewController:toPopTo animated:YES];\n    }\n    else\n    {\n        [rightNavController popViewControllerAnimated:YES];\n    }\n    [[rightNavController navigationItem] setHidesBackButton:NO];\n}\n\n- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if([[self.tableView cellForRowAtIndexPath:indexPath] selectionStyle] == UITableViewCellSelectionStyleNone)\n    {\n        return NO;\n    }\n    return YES;\n}\n\n- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    // prevent selection of rows that are already selected\n    if(isRegularHorizontalClass && [tableView.indexPathForSelectedRow isEqual:indexPath])\n    {\n        return nil;\n    }\n    if([[self.tableView cellForRowAtIndexPath:indexPath] selectionStyle] == UITableViewCellSelectionStyleNone)\n    {\n        return nil;\n    }\n    return indexPath;\n}\n\n- (NSString *)segueIdentifierForIndexPath:(NSIndexPath *)indexPath\n{\n    NSString *title = [[[self.tableView cellForRowAtIndexPath:indexPath] textLabel] text];\n    if([title isEqualToString:@\"Main Docsets\"])\n    {\n        if(isRegularHorizontalClass)\n        {\n            // Also used by DHSplitViewController. Make sure identifiers end with \"ToDetailSegue\"\n            return @\"DHDocsetDownloaderToDetailSegue\";\n        }\n        return @\"DHDocsetDownloaderToMasterSegue\";\n    }\n    else if([title isEqualToString:@\"User Contributed Docsets\"])\n    {\n        if(isRegularHorizontalClass)\n        {\n            // Also used by DHSplitViewController. Make sure identifiers end with \"ToDetailSegue\"\n            return @\"DHUserRepoToDetailSegue\";\n        }\n        return @\"DHUserRepoToMasterSegue\";\n    }\n    else if([title isEqualToString:@\"Cheat Sheets\"])\n    {\n        if(isRegularHorizontalClass)\n        {\n            // Also used by DHSplitViewController. Make sure identifiers end with \"ToDetailSegue\"\n            return @\"DHCheatRepoToDetailSegue\";\n        }\n        return @\"DHCheatRepoToMasterSegue\";\n    }\n    else if([title isEqualToString:@\"Transfer Docsets\"])\n    {\n        if(isRegularHorizontalClass)\n        {\n            // Also used by DHSplitViewController. Make sure identifiers end with \"ToDetailSegue\"\n            return @\"DHDocsetTransferrerToDetailSegue\";\n        }\n        return @\"DHDocsetTransferrerToMasterSegue\";\n    }\n    return nil;\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    NSString *segueIdentifier = [self segueIdentifierForIndexPath:indexPath];\n    if(segueIdentifier)\n    {\n        [self performSegueWithIdentifier:[self segueIdentifierForIndexPath:indexPath] sender:self];\n    }\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if(isRegularHorizontalClass)\n    {\n        UINavigationController *rightNavController = self.splitViewController.viewControllers.lastObject;\n        NSMutableArray *newViewControllers = [NSMutableArray array];\n        for(NSUInteger i = 0; i < rightNavController.viewControllers.count; i++)\n        {\n            id vc = rightNavController.viewControllers[i];\n            if([vc isKindOfClass:[DHWebViewController class]] || i == rightNavController.viewControllers.count-1)\n            {\n                [newViewControllers addObject:vc];\n            }\n        }\n        [rightNavController setViewControllers:newViewControllers];\n    }\n}\n\n\n- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(isRegularHorizontalClass)\n    {\n        UIView *bgColorView = [[UIView alloc] init];\n        bgColorView.backgroundColor = [DHAppDelegate sharedDelegate].window.rootViewController.view.tintColor;\n        bgColorView.layer.masksToBounds = YES;\n        cell.textLabel.highlightedTextColor = [UIColor whiteColor];\n        cell.detailTextLabel.highlightedTextColor = [UIColor whiteColor];\n        cell.selectedBackgroundView = bgColorView;\n        cell.accessoryType = UITableViewCellAccessoryNone;\n    }\n    else\n    {\n        if(cell.selectionStyle != UITableViewCellSelectionStyleNone)\n        {\n            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;            \n        }\n        cell.textLabel.highlightedTextColor = [UIColor blackColor];\n        cell.detailTextLabel.highlightedTextColor = [UIColor blackColor];\n        cell.selectedBackgroundView = nil;\n    }\n}\n\n- (IBAction)updatesSwitchValueChanged:(id)sender\n{\n    [[NSUserDefaults standardUserDefaults] setBool:[sender isOn] forKey:[DHDocsetDownloader sharedDownloader].defaultsAutomaticallyCheckForUpdatesKey];\n    [self updateUpdatesSwitchFooterView:nil];\n}\n\n- (IBAction)alphabetizingSwitchValueChanged:(id)sender\n{\n    [[NSUserDefaults standardUserDefaults] setBool:[sender isOn] forKey:DHDocsetDownloader.defaultsAlphabetizingKey];\n    [NSNotificationCenter.defaultCenter postNotificationName:DHSettingsChangedNotification object:DHDocsetDownloader.defaultsAlphabetizingKey];\n    [self updateAlphabetizingSwitchFooterView:nil];\n}\n\n- (void)tableView:(UITableView *)tableView willDisplayFooterView:(UITableViewHeaderFooterView *)footer forSection:(NSInteger)section\n{\n    if(section == [tableView indexPathForCell:self.updatesCell].section)\n    {\n        [self updateUpdatesSwitchFooterView:footer];\n    }\n    else if(section == [tableView indexPathForCell:self.alphabetizingCell].section)\n    {\n        [self updateAlphabetizingSwitchFooterView:footer];\n    }\n}\n\n- (void)updateUpdatesSwitchFooterView:(UITableViewHeaderFooterView *)footer\n{\n    footer = (footer) ? footer : [self.tableView footerViewForSection:[self.tableView indexPathForCell:self.updatesCell].section];\n    [footer textLabel].text = [NSString stringWithFormat:@\"Dash %@ notify you when docset updates are available.\", (self.updatesSwitch.isOn) ? @\"will\" : @\"won't\"];\n    [[footer textLabel] sizeToFit];\n}\n\n- (void)updateAlphabetizingSwitchFooterView:(UITableViewHeaderFooterView *)footer\n{\n    footer = (footer) ? footer : [self.tableView footerViewForSection:[self.tableView indexPathForCell:self.alphabetizingCell].section];\n    [footer textLabel].text = [NSString stringWithFormat:@\"Docsets %@ be sorted alphabetically in the docset browser.\", (self.alphabetizingSwitch.isOn) ? @\"will\" : @\"won't\"];\n    [[footer textLabel] sizeToFit];\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    [self dismissModal:self];\n}\n\n- (UIModalTransitionStyle)modalTransitionStyle\n{\n    return [super modalTransitionStyle];\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super encodeRestorableStateWithCoder:coder];\n    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];\n    if(selectedIndexPath != nil)\n    {\n        [coder encodeObject:selectedIndexPath forKey:@\"selectedIndexPath\"];\n    }\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    NSIndexPath *selectedIndexPath = [coder decodeObjectForKey:@\"selectedIndexPath\"];\n    if(selectedIndexPath != nil)\n    {\n        [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n    }\n    else\n        selectedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];\n    if (self.splitViewController.viewControllers.count == 2 && [selectedIndexPath compare:[NSIndexPath indexPathForRow:0 inSection:0]] == NSOrderedSame) {\n        UINavigationController *nav = [self.splitViewController.viewControllers lastObject];\n        if ([nav isKindOfClass:[UINavigationController class]] && ![nav.topViewController isKindOfClass:[DHDocsetDownloader class]]) {\n            NSMutableArray *newViewControllers = [NSMutableArray array];\n            [newViewControllers addObjectsFromArray:nav.viewControllers];\n            [newViewControllers addObject:[DHDocsetDownloader sharedDownloader]];\n            [nav setViewControllers:newViewControllers];\n        }\n    }\n}\n\n- (IBAction)getDashForMacOS:(id)sender\n{\n    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@\"https://kapeli.com/dash\"]];\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHQueuedDB.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"FMDatabase.h\"\n#import \"FMDatabaseAdditions.h\"\n#import \"FMResultSet.h\"\n#import \"DHDBResult.h\"\n\n@interface DHQueuedDB : NSObject\n\n@property (retain, nonatomic) NSString *query;\n@property (retain, nonatomic) NSMutableArray *queryQueue;\n@property (retain, nonatomic) FMResultSet *currentRS;\n@property (retain, nonatomic) NSString *dbPath;\n@property (retain, nonatomic) FMDatabase *db;\n@property (retain, nonatomic) DHDocset *docset;\n@property (assign, nonatomic) BOOL hadPerfect;\n@property (retain, nonatomic) NSMutableDictionary *resultDictionary;\n@property (retain, nonatomic) NSConditionLock *lock;\n\n+ (DHQueuedDB *)queueWithDocset:(DHDocset *)docset query:(NSString *)query typeLimit:(NSString *)typeLimit isFuzzy:(BOOL)isFuzzy;\n- (BOOL)next;\n- (BOOL)step;\n- (DHDBResult *)currentDBResult;\n- (void)addResultToResultDictionary:(DHDBResult *)result;\n- (void)sortResultDictionary;\n- (NSMutableArray *)resultsForType:(NSString *)type;\n\n@end\n"
  },
  {
    "path": "Dash/DHQueuedDB.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHQueuedDB.h\"\n#import \"DHDBSearcher.h\"\n\n@implementation DHQueuedDB\n\n+ (DHQueuedDB *)queueWithDocset:(DHDocset *)docset query:(NSString *)query typeLimit:(NSString *)typeLimit isFuzzy:(BOOL)isFuzzy\n{\n    DHQueuedDB *queue = [[DHQueuedDB alloc] init];\n    queue.resultDictionary = [NSMutableDictionary dictionary];\n    queue.query = query;\n    queue.queryQueue = [NSMutableArray array];\n    queue.dbPath = docset.optimisedIndexPath;\n    queue.docset = docset;\n    queue.db = [FMDatabase databaseWithPath:queue.dbPath];\n    queue.lock = [DHDocset stepLock];\n    [queue.lock lock];\n    BOOL didOpen = [queue.db openWithFlags:SQLITE_OPEN_READONLY];\n    [queue.db registerFTSExtensions];\n    [queue.db setLogsErrors:YES];\n    [queue.lock unlockWithCondition:DHLockSearchOnly];\n    if(!didOpen)\n    {\n        return nil;\n    }\n    if(!isFuzzy)\n    {\n        NSString *ftsEscapedQuery = [query stringByReplacingSpecialFTSCharacters];\n        NSString *prefixedQuery = [ftsEscapedQuery stringByAppendingString:@\"*\"];\n        NSString *likeQuery = [prefixedQuery stringByReplacingOccurrencesOfString:@\"*\" withString:@\"%\"];\n        [queue.queryQueue addObject:[DHQueuedDB queuedQueryDictionary:@\"SELECT path, name, type FROM searchIndex s, queryIndex q WHERE q.rowid = s.rowid AND q.perfect MATCH ?\" andArgs:@[ftsEscapedQuery]]];\n        [queue.queryQueue addObject:[DHQueuedDB queuedQueryDictionary:@\"SELECT path, name, type FROM searchIndex s, queryIndex q WHERE q.rowid = s.rowid AND q.prefix MATCH ? LIMIT 200\" andArgs:@[prefixedQuery]]];\n        [queue.queryQueue addObject:[DHQueuedDB queuedQueryDictionary:@\"SELECT path, name, type FROM searchIndex s, queryIndex q WHERE q.rowid = s.rowid AND q.suffixes MATCH ? AND q.prefix NOT LIKE ? LIMIT 200\" andArgs:@[ftsEscapedQuery, likeQuery]]];\n        [queue.queryQueue addObject:[DHQueuedDB queuedQueryDictionary:@\"SELECT path, name, type FROM searchIndex s, queryIndex q WHERE q.rowid = s.rowid AND q.suffixes MATCH ? AND q.prefix NOT LIKE ? LIMIT 200\" andArgs:@[[NSString stringWithFormat:@\"%@ NOT %@\", prefixedQuery, ftsEscapedQuery], likeQuery]]];\n    }\n    else if(query.length > 2)\n    {\n        NSString *escapedQuery = [query stringByReplacingOccurrencesOfString:@\"~\" withString:@\"~~\"];\n        escapedQuery = [escapedQuery stringByReplacingOccurrencesOfString:@\"_\" withString:@\"~_\"];\n        escapedQuery = [escapedQuery stringByReplacingOccurrencesOfString:@\"%\" withString:@\"~%\"];\n        NSString *wildcardEverywhere = [escapedQuery stringByAddingWildcardsEverywhere:@\"~\"];\n        [queue.queryQueue addObject:[DHQueuedDB queuedQueryDictionary:@\"SELECT path, name, type FROM searchIndex WHERE name LIKE ? ESCAPE '~' AND name NOT LIKE ? ESCAPE '~' LIMIT 300;\" andArgs:@[wildcardEverywhere, [[@\"%\" stringByAppendingString:escapedQuery] stringByAppendingString:@\"%\"]]]];\n    }\n    if(typeLimit)\n    {\n        for(NSMutableDictionary *dictionary in queue.queryQueue)\n        {\n            [dictionary[@\"args\"] insertObject:typeLimit atIndex:0];\n            dictionary[@\"sqlQuery\"] = [dictionary[@\"sqlQuery\"] stringByReplacingOccurrencesOfString:@\" WHERE \" withString:@\" WHERE type = ? AND \"];\n        }\n    }\n    return queue;\n}\n\n+ (NSDictionary *)queuedQueryDictionary:(NSString *)aQuery andArgs:(NSArray *)args\n{\n    return [NSMutableDictionary dictionaryWithObjectsAndKeys:aQuery, @\"sqlQuery\", [args mutableCopy], @\"args\", nil];\n}\n\n- (BOOL)next\n{\n    [DHDBSearcher checkForInterrupt];\n    [self.lock lock];\n    if([self.currentRS next])\n    {\n        [self.lock unlockWithCondition:DHLockSearchOnly];\n        [DHDBSearcher checkForInterrupt];\n        return YES;\n    }\n    [self.lock unlockWithCondition:DHLockSearchOnly];\n    [DHDBSearcher checkForInterrupt];\n    return NO;\n}\n\n- (BOOL)step\n{\n    [DHDBSearcher checkForInterrupt];\n    if(self.queryQueue.count)\n    {\n        NSDictionary *aQuery = (self.queryQueue)[0];\n        [self.lock lock];\n        self.currentRS = [self resultSetFromQueuedQueryDictionary:aQuery];\n        [self.lock unlockWithCondition:DHLockSearchOnly];\n        [self.queryQueue removeObjectAtIndex:0];\n        [DHDBSearcher checkForInterrupt];\n        return YES;\n    }\n    [self close];\n    [DHDBSearcher checkForInterrupt];\n    return NO;\n}\n\n- (DHDBResult *)currentDBResult\n{\n    DHDBResult *result = [DHDBResult resultWithDocset:self.docset resultSet:self.currentRS];\n    return [self prepareResult:result];\n}\n\n- (DHDBResult *)prepareResult:(DHDBResult *)result\n{\n    [result setQuery:self.query];\n    NSString *name = [[result name] stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\n    NSString *originalName = [[result originalName] stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\n    if(![[result originalName] contains:self.query] && [originalName contains:self.query])\n    {\n        result.whitespaceMatch = YES;\n    }\n    self.hadPerfect = [originalName hasCaseInsensitiveSuffix:self.query] || [originalName hasCaseInsensitivePrefix:self.query];\n    [DHDBSearcher checkForInterrupt];\n    result.queryIsPrefix = [name hasCaseInsensitivePrefix:self.query];\n    result.queryIsSuffix = [name hasCaseInsensitiveSuffix:self.query];\n    result.perfectMatch = result.queryIsPrefix && result.queryIsSuffix && name.length == self.query.length;\n    if(self.query.length)\n    {\n        result.matchesQueryAtAll = (result.queryIsSuffix || result.queryIsPrefix || [name rangeOfString:self.query options:NSCaseInsensitiveSearch].location != NSNotFound);\n        result.originalMatchesQueryAtAll = result.matchesQueryAtAll || [originalName rangeOfString:self.query options:NSCaseInsensitiveSearch].location != NSNotFound;\n        result.queryIsPrefixOfOriginal = [originalName hasCaseInsensitivePrefix:self.query];\n        result.queryIsSuffixOfOriginal = [originalName hasCaseInsensitiveSuffix:self.query];\n        result.perfectMatchOriginal = result.queryIsPrefixOfOriginal && result.queryIsSuffixOfOriginal && originalName.length == self.query.length;\n    }\n    [result highlightWithQuery:self.query];\n    if(result.fuzzyShouldIgnore)\n    {\n        return nil;\n    }\n    return result;\n}\n\n- (FMResultSet *)resultSetFromQueuedQueryDictionary:(NSDictionary *)query\n{\n    return [self.db executeQuery:query[@\"sqlQuery\"] withArgumentsInArray:query[@\"args\"]];\n}\n\n- (void)close\n{\n    self.currentRS = nil;\n    if(self.db && self.db.sqliteHandle)\n    {\n        [self.lock lock];\n        [self.db close];\n        [self.lock unlockWithCondition:DHLockAllAllowed];\n    }\n    self.db = nil;\n}\n\n- (void)addResultToResultDictionary:(DHDBResult *)result\n{\n    NSString *sortType = result.sortType;\n    NSMutableArray *typeResults = (self.resultDictionary)[sortType];\n    if(!typeResults)\n    {\n        typeResults = [NSMutableArray array];\n        (self.resultDictionary)[sortType] = typeResults;\n    }\n    [typeResults addObject:result];\n}\n\n- (void)sortResultDictionary\n{\n    for(NSMutableArray *queueResults in [[self resultDictionary] allValues])\n    {\n        [queueResults sortUsingSelector:@selector(compareFuziness:)];\n    }\n}\n\n- (NSMutableArray *)resultsForType:(NSString *)type\n{\n    return (self.resultDictionary)[type];\n}\n\n- (void)dealloc\n{\n    [self close];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRemote.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@class DHRemoteBrowser;\n\n@interface DHRemote : NSObject\n\n@property (strong) NSString *name;\n@property (strong) UIImage *icon;\n@property (weak) DHRemoteBrowser *browser;\n\n+ (instancetype)remoteWithName:(NSString *)name icon:(UIImage *)icon;\n- (void)connect;\n- (void)disconnect;\n\n@end\n"
  },
  {
    "path": "Dash/DHRemote.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRemote.h\"\n\n@implementation DHRemote\n\n+ (instancetype)remoteWithName:(NSString *)name icon:(UIImage *)icon\n{\n    DHRemote *remote = [[self alloc] init];\n    remote.name = name;\n    remote.icon = icon;\n    return remote;\n}\n\n- (BOOL)isEqual:(id)object\n{\n    return [self.name isEqualToString:[object name]];\n}\n\n- (void)connect\n{\n    [DHRemoteServer sharedServer].connectedRemote = self;\n    [[DHRemoteServer sharedServer] sendObject:nil forRequestName:@\"connect\" encrypted:YES toMacName:self.name];\n}\n\n- (void)disconnect\n{\n    [DHRemoteServer sharedServer].requestsQueue = [NSMutableDictionary dictionary];\n    [[DHRemoteServer sharedServer] sendObject:nil forRequestName:@\"disconnect\" encrypted:YES toMacName:self.name];\n    [DHRemoteServer sharedServer].connectedRemote = nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteBrowser.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetBrowser.h\"\n\n@class DHNestedViewController;\n\n@interface DHRemoteBrowser : UITableViewController  <UINavigationControllerDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>\n\n@property (strong) DHRemote *remote;\n@property (strong) NSMutableArray *results;\n@property (assign) BOOL isEmpty;\n@property (strong) DHDBSearchController *searchController;\n@property (assign) BOOL didFirstLoad;\n@property (assign) BOOL isRestoring;\n@property (assign) BOOL didLoad;\n\n- (void)popNestedViewControllers;\n- (DHNestedViewController *)nestedViewController;\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteBrowser.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRemoteBrowser.h\"\n#import \"DHNestedViewController.h\"\n#import \"DHWebView.h\"\n\n@implementation DHRemoteBrowser\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    self.clearsSelectionOnViewWillAppear = NO;\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n    \n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n    \n    self.tableView.rowHeight = 44;\n    self.title = self.remote.name;\n    self.remote.browser = self;\n    [UIApplication sharedApplication].idleTimerDisabled = YES;\n    if(isRegularHorizontalClass)\n    {\n        DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n        webViewController.webView.scrollView.delegate = nil;\n        webViewController.navigationController.toolbarHidden = YES;\n        [webViewController updateBackForwardButtonState];\n    }\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    if(!isRegularHorizontalClass)\n    {\n        if(self.tableView.indexPathForSelectedRow)\n        {\n            [self.tableView scrollToRowAtIndexPath:self.tableView.indexPathForSelectedRow atScrollPosition:UITableViewScrollPositionNone animated:NO];\n        }\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            [self.tableView deselectAll:YES];\n        });\n    }\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.tableView reloadData];\n    [self.searchController traitCollectionDidChange:previousTraitCollection];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHNestedSegue\"])\n    {\n        DHNestedViewController *nestedController = [segue destinationViewController];\n        DHDBResult *result = self.results[self.tableView.indexPathForSelectedRow.row];\n        nestedController.result = result;\n    }\n    else if([[segue identifier] isEqualToString:@\"DHSearchWebViewSegue\"])\n    {\n        DHWebViewController *webViewController = [segue destinationViewController];\n        DHDBResult *result = self.results[self.tableView.indexPathForSelectedRow.row];\n        webViewController.result = result;\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(tableView.indexPathForSelectedRow.row < self.results.count)\n    {\n        DHDBResult *result = self.results[tableView.indexPathForSelectedRow.row];\n        if(result.similarResults.count)\n        {\n            [self performSegueWithIdentifier:@\"DHNestedSegue\" sender:self];\n        }\n        else\n        {\n            if(!isRegularHorizontalClass)\n            {\n                [self performSegueWithIdentifier:@\"DHSearchWebViewSegue\" sender:self];\n            }\n        }\n        NSString *remoteName = [DHRemoteServer sharedServer].connectedRemote.name;\n        if(remoteName)\n        {\n            [[DHRemoteServer sharedServer] sendObject:@{@\"selectedRow\": @(tableView.indexPathForSelectedRow.row), @\"selectedRowName\": (result.name) ? : @\"justsendtheresults\"} forRequestName:@\"syncSelectedRow\" encrypted:YES toMacName:remoteName];\n        }\n    }\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    self.isEmpty = self.results.count <= 0;\n    if(self.isEmpty)\n    {\n        return 4;\n    }\n    return self.results.count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(self.isEmpty)\n    {\n        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHLoadingCell\" forIndexPath:indexPath];\n        cell.userInteractionEnabled = NO;\n        if(indexPath.row == 2)\n        {\n            NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n            [paragraph setAlignment:NSTextAlignmentCenter];\n            UIFont *font = [UIFont boldSystemFontOfSize:20];\n            cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:@\"Nothing here...\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n        }\n        else if(indexPath.row == 3)\n        {\n            NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n            [paragraph setAlignment:NSTextAlignmentCenter];\n            UIFont *font = [UIFont boldSystemFontOfSize:16];\n            cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:@\"Search for something on your Mac\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n        }\n        else\n        {\n            cell.textLabel.text = @\"\";\n        }\n        return cell;\n    }\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHBrowserCell\" forIndexPath:indexPath];\n    \n    DHDBResult *result = (indexPath.row) < self.results.count ? self.results[indexPath.row] : nil;\n    [cell makeEntryCell];\n    cell.textLabel.attributedText = nil;\n    cell.textLabel.font = [UIFont fontWithName:@\"Menlo\" size:16];\n    cell.textLabel.text = result.name;\n    cell.typeImageView.image = result.typeImage;\n    cell.platformImageView.image = result.platformImage;\n    [self highlightCell:cell result:result];\n    [cell.titleLabel setRightDetailText:(result.similarResults.count) ? [NSString stringWithFormat:@\"%ld\", (unsigned long)result.similarResults.count+1] : @\"\" adjustMainWidth:YES];\n    cell.accessoryType = (result.similarResults.count || !isRegularHorizontalClass) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;\n    return cell;\n}\n\n- (void)highlightCell:(DHBrowserTableViewCell *)cell result:(DHDBResult *)result\n{\n    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:cell.textLabel.attributedText];\n    for(NSString *key in [DHDBResult highlightDictionary])\n    {\n        [string removeAttribute:key range:NSMakeRange(0, string.length)];\n    }\n    BOOL didAddAttributes = NO;\n    for(NSValue *highlightRangeValue in result.highlightRanges)\n    {\n        NSRange highlightRange = [highlightRangeValue rangeValue];\n        [string addAttributes:[DHDBResult highlightDictionary] range:highlightRange];\n        didAddAttributes = YES;\n    }\n    if(didAddAttributes)\n    {\n        cell.textLabel.attributedText = string;\n    }\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    [self.searchDisplayController setActive:NO animated:NO];\n}\n\n- (void)popNestedViewControllers\n{\n    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];\n    for(UIViewController *viewController in self.navigationController.viewControllers)\n    {\n        if([viewController isKindOfClass:[DHNestedViewController class]])\n        {\n            [viewControllers removeObjectIdenticalTo:viewController];\n        }\n    }\n    [self.navigationController setViewControllers:viewControllers animated:YES];\n}\n\n- (DHNestedViewController *)nestedViewController\n{\n    for(UIViewController *controller in self.navigationController.viewControllers)\n    {\n        if([controller isKindOfClass:[DHNestedViewController class]])\n        {\n            return (id)controller;\n        }\n    }\n    return nil;\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super encodeRestorableStateWithCoder:coder];\n    [coder encodeObject:self.remote forKey:@\"remote\"];\n    [coder encodeObject:self.results forKey:@\"results\"];\n    NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];\n    if(selectedIndexPath != nil)\n    {\n        [coder encodeObject:selectedIndexPath forKey:@\"selectedIndexPath\"];\n    }\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    self.remote = [coder decodeObjectForKey:@\"remote\"];\n    [self.remote connect];\n    self.results = [coder decodeObjectForKey:@\"results\"];\n    NSIndexPath *selectedIndexPath = [coder decodeObjectForKey:@\"selectedIndexPath\"];\n    if(selectedIndexPath != nil)\n    {\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n        });\n    }\n}\n\n- (void)dealloc\n{\n\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteImage.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHRemoteImage : NSObject\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteImage.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRemoteImage.h\"\n\n@implementation DHRemoteImage\n\n- (id)initWithCoder:(NSCoder *)decoder\n{\n    UIImage *image = nil;\n    if([decoder containsValueForKey:@\"name\"])\n    {\n        image = [UIImage imageNamed:[decoder decodeObjectForKey:@\"name\"]];\n    }\n    else if([decoder containsValueForKey:@\"data\"])\n    {\n        image = [UIImage imageWithData:[decoder decodeObjectForKey:@\"data\"]];\n    }\n    image = (image) ? image : [UIImage imageNamed:@\"Other\"];\n    return (id)image;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteProtocol.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHRemoteProtocol : NSURLProtocol\n\n@property (retain) NSString *path;\n@property (retain) NSString *extension;\n@property (retain) NSString *mimeType;\n@property (retain) NSTimer *timeoutTimer;\n@property (retain) NSString *identifier;\n\n- (void)receivedData:(NSMutableData *)data userInfo:(NSDictionary *)userInfo isTimeout:(BOOL)isTimeout;\n+ (NSDictionary *)lastResponseUserInfo;\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteProtocol.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRemoteProtocol.h\"\n#import \"DHRemoteServer.h\"\n#import \"DHTarixProtocol.h\"\n\n@implementation DHRemoteProtocol\n\nstatic NSDictionary *_lastResponseUserInfo;\n\n+ (BOOL)canInitWithRequest:(NSURLRequest *)request\n{\n    if([DHRemoteServer sharedServer].connectedRemote)\n    {\n        NSString *scheme = [[request URL] scheme];\n        if([scheme isCaseInsensitiveEqual:@\"file\"] || [scheme hasPrefix:@\"dash-\"]) // dash-remote-snippet, dash-stack, dash-tarix, dash-man-page, dash-apple-api\n        {\n            return YES;\n        }\n    }\n    return NO;\n}\n\n+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request\n{\n    return request;\n}\n\n- (void)startLoading\n{\n    if(![[[self.request URL] scheme] isEqualToString:@\"dash-remote-snippet\"])\n    {\n        NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:self.request];\n        if(cachedResponse)\n        {\n            if(cachedResponse.userInfo)\n            {\n                _lastResponseUserInfo = cachedResponse.userInfo;\n            }\n            [[self client] URLProtocol:self didReceiveResponse:[cachedResponse response] cacheStoragePolicy:NSURLCacheStorageAllowed];\n            [[self client] URLProtocol:self didLoadData:[cachedResponse data]];\n            [[self client] URLProtocolDidFinishLoading:self];\n            return;\n        }\n    }\n    NSTimeInterval timeout = 60.0f;\n#ifdef DEBUG\n//    timeout = 6.0f;\n#endif\n    NSString *scheme = [[self.request URL] scheme];\n    self.path = [[[self.request URL] path] stringByReplacingPercentEscapes];\n    self.extension = [self.path pathExtension];\n    self.mimeType = [NSString mimeTypeForPathExtension:self.extension];\n    if([scheme hasPrefix:@\"dash-\"] && ![scheme isEqualToString:@\"dash-tarix\"])\n    {\n        self.mimeType = @\"text/html\";\n    }\n    \n    self.timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:timeout target:self selector:@selector(requestDidTimeout) userInfo:nil repeats:NO];\n    DHRemoteServer *server = [DHRemoteServer sharedServer];\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        while(YES)\n        {\n            self.identifier = [NSString randomStringWithLength:12];\n            if(!server.requestsQueue[self.identifier])\n            {\n                server.requestsQueue[self.identifier] = self;\n                break;\n            }\n        }\n        NSURL *url = self.request.URL;\n        if([[url scheme] isCaseInsensitiveEqual:@\"dash-tarix\"])\n        {\n            url = [NSURL URLWithString:[[url absoluteString] stringByReplacingOccurrencesOfString:@\"dash-tarix://\" withString:@\"file://\"]];\n        }\n        [server sendObject:@{@\"url\": url, @\"identifier\": self.identifier, @\"mimeType\": self.mimeType, @\"extension\": (self.extension) ? : @\"\"} forRequestName:@\"loadRequest\" encrypted:YES toMacName:server.connectedRemote.name];\n    });\n}\n\n- (void)requestDidTimeout\n{\n    [self stopLoading];\n    [self receivedData:nil userInfo:nil isTimeout:YES];\n}\n\n- (void)receivedData:(NSMutableData *)data userInfo:(NSDictionary *)userInfo isTimeout:(BOOL)isTimeout\n{\n    if([userInfo[@\"isInternal\"] boolValue])\n    {\n        self.mimeType = @\"text/html\";\n        self.extension = @\"html\";\n    }\n    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL] MIMEType:self.mimeType expectedContentLength:-1 textEncodingName:nil];\n    \n    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];\n\n    self.timeoutTimer = [self.timeoutTimer invalidateTimer];\n    BOOL hadData = data != nil;\n    data = [DHTarixProtocol alterData:data scheme:[[self.request URL] scheme] path:self.path extension:self.extension mimeType:self.mimeType isTimeout:isTimeout];\n    if(hadData && ([self.extension hasCaseInsensitivePrefix:@\"htm\"] || [self.mimeType contains:@\"html\"]))\n    {\n        _lastResponseUserInfo = userInfo;\n    }\n    if(!isTimeout && data)\n    {\n        NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:response data:data userInfo:userInfo storagePolicy:NSURLCacheStorageAllowed];\n        [[NSURLCache sharedURLCache] storeCachedResponse:cachedResponse forRequest:self.request];\n    }\n    [[self client] URLProtocol:self didLoadData:data];\n    [[self client] URLProtocolDidFinishLoading:self];\n    \n    [self stopLoading];\n}\n\n+ (NSDictionary *)lastResponseUserInfo\n{\n    return _lastResponseUserInfo;\n}\n\n- (void)stopLoading\n{\n    self.timeoutTimer = [self.timeoutTimer invalidateTimer];\n    if(self.identifier)\n    {\n        @synchronized([DHRemoteProtocol class])\n        {\n            [[DHRemoteServer sharedServer].requestsQueue removeObjectForKey:self.identifier];            \n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRemoteServer.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DTBonjourServer.h\"\n#import \"DHRemote.h\"\n\n@interface DHRemoteServer : NSObject <DTBonjourServerDelegate>\n\n@property (strong) DTBonjourServer *server;\n@property (strong) NSMutableDictionary *connections;\n@property (strong) UIAlertView *shownAlert;\n@property (assign) BOOL ignoreRequests;\n@property (strong) NSMutableArray *remotes;\n@property (strong) DHRemote *connectedRemote;\n@property (strong) NSMutableDictionary *requestsQueue;\n@property (retain) NSTimer *sendWebViewURLTimer;\n@property (retain) NSArray *tableOfContentsMethods;\n@property (assign) BOOL tableOfContentsIsSnippet;\n@property (retain) NSMutableDictionary *lastDecryptFailDates;\n\n+ (DHRemoteServer *)sharedServer;\n- (void)sendObject:(id)object forRequestName:(NSString *)name encrypted:(BOOL)encrypted toMacName:(NSString *)macName;\n- (void)sendWebViewURL:(NSString *)url;\n- (void)processRemoteTableOfContents;\n\n@end\n\n#define DHRemotesChangedNotification @\"DHRemotesChangedNotification\"\n"
  },
  {
    "path": "Dash/DHRemoteServer.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRemoteServer.h\"\n#import \"SAMKeychain.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHRemoteImage.h\"\n#import \"Reachability.h\"\n#import \"DHDBResult.h\"\n#import \"DHRemoteBrowser.h\"\n#import \"DHNestedViewController.h\"\n#import \"DHRemoteProtocol.h\"\n#import \"DHCSS.h\"\n#import \"DHTocBrowser.h\"\n\n@implementation DHRemoteServer\n\n+ (DHRemoteServer *)sharedServer\n{\n    static dispatch_once_t pred;\n    static DHRemoteServer *_server = nil;\n    \n    dispatch_once(&pred, ^{\n        _server = [[DHRemoteServer alloc] init];\n        [_server setUp];\n    });\n    return _server;\n}\n\n- (void)setUp\n{\n    [NSKeyedUnarchiver setClass:[DHDBResult class] forClassName:@\"DHDBSnippetResult\"];\n    [NSKeyedUnarchiver setClass:[DHDBResult class] forClassName:@\"DHSearchEngineResult\"];\n    [NSKeyedUnarchiver setClass:[DHDBResult class] forClassName:@\"DHDBUnifiedResult\"];\n    self.requestsQueue = [NSMutableDictionary dictionary];\n    self.remotes = [NSMutableArray array];\n    self.connections = [NSMutableDictionary dictionary];\n    self.lastDecryptFailDates = [NSMutableDictionary dictionary];\n    \n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [self startServer];\n    });\n    \n    Reachability *reach = [Reachability reachabilityForLocalWiFi];\n    reach.reachableOnWWAN = NO;\n    reach.reachableBlock = ^(Reachability *theReach) {\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            [self stopServer];\n            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                [self startServer];\n            });\n        });\n    };\n    [reach startNotifier];\n}\n\n- (void)startServer\n{\n    if(self.server)\n    {\n        return;\n    }\n    self.server = [[DTBonjourServer alloc] initWithBonjourType:@\"_dash._tcp\"];\n    [self.server setDelegate:self];\n    if(![self.server start])\n    {\n        NSLog(@\"Failed to start Bonjour server\");\n        self.server = nil;\n        [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(startServer) userInfo:nil repeats:NO];\n    }\n}\n\n- (void)stopServer\n{\n    self.server.delegate = nil;\n    [self.server stop];\n    self.server = nil;\n    for(DTBonjourDataConnection *connection in [self.connections allValues])\n    {\n        [self connectionDidClose:connection];\n    }\n}\n\n- (void)connectionDidClose:(DTBonjourDataConnection *)connection\n{\n    for(NSString *key in self.connections.allKeys)\n    {\n        if(self.connections[key] == connection)\n        {\n            DHRemote *remote = [DHRemote remoteWithName:key icon:nil];\n            NSInteger index = [self.remotes indexOfObject:remote];\n            if(index != NSNotFound)\n            {\n                [self.remotes removeObjectAtIndex:index];\n                [[NSNotificationCenter defaultCenter] postNotificationName:DHRemotesChangedNotification object:nil];\n            }\n            [self.connections removeObjectForKey:key];\n        }\n    }\n}\n\n- (void)sendWebViewURL:(NSString *)url\n{\n    self.sendWebViewURLTimer = [self.sendWebViewURLTimer invalidateTimer];\n    if(self.connectedRemote)\n    {\n        url = [url stringByReplacingOccurrencesOfString:@\"dash-tarix://\" withString:@\"file://\"];\n        self.sendWebViewURLTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 block:^{\n            [self sendObject:@{@\"url\": url} forRequestName:@\"syncWebViewURL\" encrypted:YES toMacName:self.connectedRemote.name];\n        } repeats:NO];\n    }\n}\n\n- (void)processRemoteTableOfContents\n{\n    DHWebViewController *controller = [DHWebViewController sharedWebViewController];\n    if(iPad && isRegularHorizontalClass)\n    {\n        if(controller.methodsPopover.popoverVisible)\n        {\n            [controller.methodsPopover dismissPopoverAnimated:YES];            \n        }\n    }\n    else\n    {\n        [[controller.actualTOCBrowser searchDisplayController] setActive:NO animated:NO];\n        [[controller.actualTOCBrowser presentingViewController] dismissViewControllerAnimated:YES completion:nil];\n    }\n    controller.lastTocBrowser = nil;\n    controller.currentMethods = (self.tableOfContentsMethods.count) ? self.tableOfContentsMethods : nil;\n    controller.navigationItem.rightBarButtonItem = (self.tableOfContentsMethods.count) ? [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"tocMenu\"] style:UIBarButtonItemStylePlain target:controller action:@selector(tocButtonPressed:)] : (self.tableOfContentsIsSnippet) ? [[UIBarButtonItem alloc] initWithTitle:@\"Use\" style:UIBarButtonItemStylePlain target:controller action:@selector(snippetUseButtonPressed:)] : nil;\n}\n\n- (BOOL)shouldIgnoreDueToDecryptFlood:(NSString *)macName\n{\n    NSDate *date = self.lastDecryptFailDates[macName];\n    if(date && [[NSDate date] timeIntervalSinceDate:date] < 0.5)\n    {\n        return YES;\n    }\n    [self.lastDecryptFailDates removeObjectForKey:macName];\n    return NO;\n}\n\n- (void)bonjourServer:(DTBonjourServer *)server didReceiveObject:(NSDictionary *)dict onConnection:(DTBonjourDataConnection *)connection\n{\n    @try {\n        NSString *macName = dict[@\"name\"];\n        NSString *requestName = dict[@\"requestName\"];\n        NSDictionary *userInfo = dict[@\"userInfo\"];\n        BOOL isEncrypted = [dict[@\"encrypted\"] boolValue];\n        NSArray *encryptedCheck = dict[@\"encryptedCheck\"];\n        if(!macName || !requestName || (isEncrypted && !encryptedCheck))\n        {\n            NSLog(@\"Remote object receive failed validation\");\n            return;\n        }\n        if(isEncrypted)\n        {\n            NSString *password = [SAMKeychain passwordForService:@\"Dash Remote\" account:macName];\n            BOOL success = NO;\n            if(password && password.length)\n            {\n                if(!connection.originAddress || !connection.originAddress.length)\n                {\n                    success = YES;\n                }\n                else\n                {\n                    for(NSData *data in encryptedCheck)\n                    {\n                        NSData *ipAddressData = [data AES256DecryptWithKey:password];\n                        NSString *ipAddress = (ipAddressData) ? [[NSString alloc] initWithData:ipAddressData encoding:NSUTF8StringEncoding] : nil;\n                        if(ipAddress && ipAddress.length && [ipAddress isCaseInsensitiveEqual:connection.originAddress])\n                        {\n                            success = YES;\n                            break;\n                        }\n                    }\n                }\n                if(success && userInfo)\n                {\n                    userInfo = (NSDictionary*)[(NSData*)userInfo AES256DecryptWithKey:password];\n                    if(!userInfo)\n                    {\n                        success = NO;\n                    }\n                }\n            }\n            if(!success)\n            {\n                self.lastDecryptFailDates[macName] = [NSDate date];\n                NSLog(@\"decryption failed!\");\n                return;\n            }\n        }\n        if([dict[@\"gzipped\"] boolValue])\n        {\n            userInfo = (userInfo) ? (id)[(id)userInfo gunzippedData] : nil;\n        }\n        userInfo = (userInfo) ? [NSKeyedUnarchiver unarchiveObjectWithData:(NSData*)userInfo] : nil;\n        \n        NSLog(@\"received %@\", requestName);\n#pragma mark Start handling requests\n        \n        \n#pragma mark Enforce encrypted routes\n        NSArray *allowedUnencrypted = @[@\"pairRequest\", @\"loadRequestResponse\"];\n        if(!isEncrypted && ![allowedUnencrypted containsObject:requestName])\n        {\n            NSLog(@\"Request %@ failed because not allowed without encryption\", requestName);\n            return;\n        }\n        else if([self shouldIgnoreDueToDecryptFlood:macName])\n        {\n#ifdef DEBUG\n            NSLog(@\"Request %@ failed due to flood\", requestName);\n#endif\n            return;\n        }\n        \n        self.connections[macName] = connection;\n\n#pragma mark Route: pairRequest\n        if([requestName isEqualToString:@\"pairRequest\"] && !self.shownAlert.isVisible)\n        {\n            if(self.ignoreRequests)\n            {\n                return;\n            }\n            @try {\n                [[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];\n            }\n            @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n            self.shownAlert = [UIAlertView showWithTitle:@\"Pair Request Received\" message:[NSString stringWithFormat:@\"Dash on \\\"%@\\\" requested to pair with you. If you would like to pair, please enter the pair code:\", macName] style:UIAlertViewStylePlainTextInput cancelButtonTitle:@\"Cancel\" otherButtonTitles:@[@\"Pair\", @\"Ignore Future Requests\"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n                if(buttonIndex == 1)\n                {\n                    NSString *code = [[alertView textFieldAtIndex:0] text];\n                    code = (code) ? : @\"\";\n                    NSError *error = nil;\n                    if(![SAMKeychain setPassword:code forService:@\"Dash Remote\" account:macName error:&error])\n                    {\n                        NSLog(@\"Couldn't save remote password in keychain: %@\", error);\n                    }\n                    [self sendObject:nil forRequestName:@\"pairComplete\" encrypted:YES toMacName:macName];\n                }\n                else if(buttonIndex == 2)\n                {\n                    self.ignoreRequests = YES;\n                }\n            }];\n        }\n        \n#pragma mark Route: pairHello\n        if([requestName isEqualToString:@\"pairHello\"])\n        {\n            [self sendObject:nil forRequestName:@\"pairHello\" encrypted:YES toMacName:macName];\n        }\n        \n#pragma mark Route: readyToConnect\n        if([requestName isEqualToString:@\"readyToConnect\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:userInfo[@\"icon\"]];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                remote = self.connectedRemote;\n                [remote connect];\n            }\n            if(![self.remotes containsObject:remote])\n            {\n                [self.remotes addObject:remote];\n                [[NSNotificationCenter defaultCenter] postNotificationName:DHRemotesChangedNotification object:nil];\n            }\n        }\n        \n#pragma mark Route: unpair\n        if([requestName isEqualToString:@\"unpair\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                self.connectedRemote = nil;\n            }\n            if([self.remotes containsObject:remote])\n            {\n                [self.remotes removeObject:remote];\n                [[NSNotificationCenter defaultCenter] postNotificationName:DHRemotesChangedNotification object:nil];\n            }\n        }\n        \n#pragma mark Route: syncResults\n        if([requestName isEqualToString:@\"syncResults\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                DHRemoteBrowser *browser = self.connectedRemote.browser;\n                browser.results = userInfo[@\"results\"];\n                NSString *query = [[userInfo[@\"searchQuery\"] substringToString:@\" \"] trimWhitespace];\n                browser.title = [query length] ? query : self.connectedRemote.name;\n                [browser.tableView reloadData];\n                NSInteger row = [userInfo[@\"selectedRow\"] integerValue];\n                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];\n                if(isRegularHorizontalClass || browser.navigationController.visibleViewController != browser)\n                {\n                    [browser.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n                }\n                if(![userInfo[@\"isFuzzyAppend\"] boolValue])\n                {\n                    if(isRegularHorizontalClass || browser.navigationController.visibleViewController != browser)\n                    {\n                        [browser.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];\n                    }\n                    [browser popNestedViewControllers];\n                }\n            }\n        }\n        \n#pragma mark Route: syncSelectedRow\n        if([requestName isEqualToString:@\"syncSelectedRow\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                DHRemoteBrowser *browser = self.connectedRemote.browser;\n                NSInteger row = [userInfo[@\"selectedRow\"] integerValue];\n                NSInteger indexOfActiveItem = [userInfo[@\"indexOfActiveItem\"] integerValue];\n                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];\n                if([browser.tableView numberOfRowsInSection:0] > row && browser.results.count > row)\n                {\n                    if(![browser.tableView.indexPathForSelectedRow isEqual:indexPath])\n                    {\n                        if(isRegularHorizontalClass || browser.navigationController.visibleViewController != browser)\n                        {\n                            [browser.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n                            [browser.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];\n                        }\n                        [browser popNestedViewControllers];\n                    }\n                    DHDBResult *result = (browser.results)[row];\n                    if(result.indexOfActiveItem != indexOfActiveItem)\n                    {\n                        [result setActiveItemByIndex:indexOfActiveItem];\n                        DHNestedViewController *nestedController = [browser nestedViewController];\n                        if(nestedController.result == result)\n                        {\n                            NSIndexPath *nestedIndexPath = [NSIndexPath indexPathForRow:indexOfActiveItem inSection:0];\n                            if(isRegularHorizontalClass || nestedController.navigationController.visibleViewController != nestedController)\n                            {\n                                [nestedController.tableView selectRowAtIndexPath:nestedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone];\n                                [nestedController.tableView scrollToRowAtIndexPath:nestedIndexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        \n#pragma mark Route: syncWebViewURL\n        if([requestName isEqualToString:@\"syncWebViewURL\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                NSString *url = userInfo[@\"url\"];\n                NSString *hash = [url substringFromStringReturningNil:@\"#\"];\n                url = [url substringToString:@\"#\"];\n                url = [url stringByReplacingPercentEscapes];\n                if(hash && hash.length)\n                {\n                    url = [url stringByAppendingFormat:@\"#%@\", hash];\n                }\n                DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n                if([webViewController isViewLoaded])\n                {\n                    [webViewController loadURL:url];\n                }\n                else\n                {\n                    webViewController.result.remoteResultURL = url;\n                }\n            }\n        }\n        \n#pragma mark Route: loadRequestResponse\n        if([requestName isEqualToString:@\"loadRequestResponse\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                NSString *identifier = userInfo[@\"identifier\"];\n                if(identifier && self.requestsQueue[identifier])\n                {\n                    NSMutableData *data = userInfo[@\"data\"];\n                    if([userInfo[@\"gzipped\"] boolValue])\n                    {\n                        data = (id)[data gunzippedData];\n                    }\n                    [self.requestsQueue[identifier] receivedData:data userInfo:userInfo[@\"responseUserInfo\"] isTimeout:NO];\n                }\n            }\n        }\n        \n#pragma mark Route: syncAppleLanguage\n        if([requestName isEqualToString:@\"syncAppleLanguage\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                NSString *language = userInfo[@\"language\"];\n                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n                if(![[defaults objectForKey:DHActiveAppleLanguageKey] isEqualToString:language])\n                {\n                    [defaults setObject:language forKey:DHActiveAppleLanguageKey];\n                    [[DHCSS sharedCSS] refreshActiveCSS];\n                    [[DHWebViewController sharedWebViewController] reload];\n                }\n            }\n        }\n        \n        \n#pragma mark Route: syncNewAppleLanguage\n        if([requestName isEqualToString:@\"syncNewAppleLanguage\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                [DHAppleActiveLanguage setLanguage:[userInfo[@\"language\"] integerValue]];\n            }\n        }\n        \n#pragma mark Route: syncTableOfContents\n        if([requestName isEqualToString:@\"syncTableOfContents\"])\n        {\n            DHRemote *remote = [DHRemote remoteWithName:macName icon:nil];\n            if(self.connectedRemote && [self.connectedRemote isEqual:remote])\n            {\n                self.tableOfContentsMethods = userInfo[@\"methods\"];\n                self.tableOfContentsIsSnippet = [userInfo[@\"isSnippet\"] boolValue];\n                [self processRemoteTableOfContents];\n            }\n        }\n    }\n    @catch(NSException *exception) {\n        NSLog(@\"Remote receive object exception: %@ %@\", exception, [exception callStackSymbols]);\n    }\n}\n\n- (void)sendObject:(id)object forRequestName:(NSString *)name encrypted:(BOOL)encrypted toMacName:(NSString *)macName\n{\n    if(!macName)\n    {\n        return;\n    }\n    DTBonjourDataConnection *connection = self.connections[macName];\n    if(connection && connection.isOpen)\n    {\n        NSLog(@\"sent %@\", name);\n        NSMutableDictionary *dict = [NSMutableDictionary dictionary];\n        dict[@\"requestName\"] = name;\n        if(object)\n        {\n            object = [NSKeyedArchiver archivedDataWithRootObject:object];\n            NSData *gzipped = [object gzippedDataWithCompressionLevel:0.7];\n            object = (gzipped) ? gzipped : object;\n            if(gzipped)\n            {\n                dict[@\"gzipped\"] = @YES;\n            }\n        }\n        if(encrypted)\n        {\n            dict[@\"encrypted\"] = @(encrypted);\n            NSString *password = [self passwordForMacName:macName];\n            NSMutableArray *encryptedCheck = [NSMutableArray array];\n            dict[@\"encryptedCheck\"] = encryptedCheck;\n            for(NSString *host in [NSArray currentIPAddresses])\n            {\n                NSData *encryptedHost = [[[host substringToString:@\"%\"] dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:password];\n                if(encryptedHost)\n                {\n                    [encryptedCheck addObject:encryptedHost];\n                }\n            }\n            if(object)\n            {\n                object = [object AES256EncryptWithKey:password];\n            }\n        }\n        if(object)\n        {\n            dict[@\"userInfo\"] = object;\n        }\n        [connection sendObject:dict error:nil];\n    }\n}\n\n- (NSString *)passwordForMacName:(NSString *)macName\n{\n    return [SAMKeychain passwordForService:@\"Dash Remote\" account:macName];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRepo.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHRepoTableViewCell.h\"\n#import \"DHLatencyTester.h\"\n#import \"MRProgress.h\"\n#import \"DHDocsetIndexer.h\"\n#import \"DHUnarchiver.h\"\n\n@interface DHRepo : UITableViewController <UIActionSheetDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>\n\n@property (strong) NSMutableArray *feeds;\n@property (strong) NSMutableArray *filteredFeeds;\n@property (assign) BOOL searchBarActive;\n@property (assign) BOOL searchBarActiveIsALie;\n@property (assign) BOOL didFirstReload;\n@property (weak) UISearchDisplayController *searchController;\n@property (strong) NSString *filterQuery;\n@property (weak) MRProgressOverlayView *updateOverlay;\n@property (assign) IBOutlet UISearchBar *searchBar;\n@property (assign) BOOL loading;\n@property (assign) NSString *loadingText;\n\n- (void)setUp;\n- (IBAction)downloadButtonPressed:(id)sender;\n- (IBAction)uninstallButtonPressed:(id)sender;\n- (IBAction)errorButtonPressed:(id)sender;\n- (NSString *)installFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate;\n- (BOOL)canInstallFeed:(DHFeed *)aFeed;\n- (NSString *)docsetPathForFeed:(DHFeed *)feed;\n- (NSString *)defaultsKey;\n- (NSString *)uniqueTempDirAtPath:(NSString *)path;\n- (void)saveState;\n- (NSMutableArray *)activeFeeds;\n- (IBAction)updateButtonPressed:(id)sender;\n- (BOOL)alertIfUpdatesAreScheduled;\n- (void)backgroundCheckForUpdatesIfNeeded;\n- (NSString *)repoIdentifier; // Used to find a corresponding repo for a installed docset\n- (NSString *)defaultsAutomaticallyCheckForUpdatesKey;\n@property (nonatomic, strong, readonly, class) NSString *defaultsAlphabetizingKey;\n- (void)emptyTrashAtPath:(NSString *)trashPath;\n- (NSString *)docsetInstallFolderPath;\n- (NSString *)uniqueTrashPath;\n- (void)reload;\n- (BOOL)shouldStall;\n- (NSInteger)numberOfEntriesBeingInstalled;\n- (NSInteger)indexOfFeedWithFeedURL:(NSString *)feedURL;\n- (void)startInstallingFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate;\n- (NSString *)defaultsScheduledUpdateKey;\n- (void)updateFeeds:(NSArray *)feeds;\n- (void)checkForUpdatesAndShowInterface:(BOOL)withInterface updateWithoutAsking:(BOOL)updateWithoutAsking;\n\n@end\n\nNSInteger compareFeeds(id feed1, id feed2, void *context);\n\n#define DHSettingsChangedNotification @\"DHSettingsChangedNotification\"\n"
  },
  {
    "path": "Dash/DHRepo.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepo.h\"\n#import \"DHFeed.h\"\n#import \"DHDBResult.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHDocsetTransferrer.h\"\n#import \"DHCheatRepo.h\"\n#import \"DHRightDetailLabel.h\"\n\n@implementation DHRepo\n\n- (void)setUp // doesn't get called unless you call the singleton from DHAppDelegate\n{\n    // Don't count on anything being loaded here. Only stateless stuff.\n    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{\n        NSFileManager *fileManager = [NSFileManager defaultManager];\n        NSString *file = nil;\n        NSString *installPath = [self docsetInstallFolderPath];\n        NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:installPath];\n        NSMutableArray *toDelete = [NSMutableArray array];\n        while(file = [dirEnum nextObject])\n        {\n            if([[file pathExtension] isCaseInsensitiveEqual:@\"docset\"])\n            {\n                [dirEnum skipDescendants];\n                continue;\n            }\n            if([[file lastPathComponent] hasPrefix:@\"dash_temp_\"])\n            {\n                [dirEnum skipDescendants];\n                NSString *fullPath = [installPath stringByAppendingPathComponent:file];\n                [toDelete addObject:fullPath];\n            }\n        }\n        for(NSString *fullPath in toDelete)\n        {\n            [fileManager moveItemAtPath:fullPath toPath:[self uniqueTrashPath] error:nil];\n        }\n        [self emptyTrashAtPath:[self trashPath]];\n    });\n    [MRCircularProgressView appearance].lineWidth = 2.0f;\n    [MRCircularProgressView appearance].borderWidth = 1.0f;\n}\n\n- (IBAction)updateButtonPressed:(id)sender\n{\n    if(self.loading)\n    {\n        [[[UIAlertView alloc] initWithTitle:@\"Loading...\" message:@\"Wait for loading to complete and try again.\" delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n        return;\n    }\n    [self checkForUpdatesAndShowInterface:YES updateWithoutAsking:NO];\n}\n\n- (void)checkForUpdatesAndShowInterface:(BOOL)withInterface updateWithoutAsking:(BOOL)updateWithoutAsking\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n    [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:[self defaultsUpdateLastCheckDateKey]];\n    MRProgressOverlayView *overlay = nil;\n    if(withInterface)\n    {\n        BOOL found = NO;\n        for(DHFeed *feed in self.feeds)\n        {\n            if(feed.installed)\n            {\n                found = YES;\n                break;\n            }\n        }\n        if(!found)\n        {\n            [[[UIAlertView alloc] initWithTitle:@\"Nothing to Update\" message:[NSString stringWithFormat:@\"You don't have any %@ installed. Download some!\", [self isKindOfClass:[DHCheatRepo class]] ? @\"cheat sheets\" : @\"docsets\"] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n            return;\n        }\n        overlay = [MRProgressOverlayView showOverlayAddedTo:(isRegularHorizontalClass) ? self.splitViewController.view : self.navigationController.view title:@\"Checking...\" mode:MRProgressOverlayViewModeIndeterminate animated:YES stopBlock:^(MRProgressOverlayView *progressOverlayView) {\n            self.updateOverlay = nil;\n            [progressOverlayView dismiss:YES];\n        }];\n        self.updateOverlay = overlay;\n    }\n    dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n    dispatch_async(queue, ^{\n        if(withInterface)\n        {\n            [NSThread sleepForTimeInterval:1.0f];\n        }\n        while(self.loading)\n        {\n            [NSThread sleepForTimeInterval:1.0f];\n        }\n        NSMutableArray *toUpdate = [NSMutableArray array];\n        for(DHFeed *feed in self.feeds)\n        {\n            if(withInterface && self.updateOverlay != overlay)\n            {\n                return;\n            }\n            if(feed.installed && !feed.installing)\n            {\n                NSString *error = nil;\n                DHFeedResult *result = [self loadFeed:feed error:&error];\n                if(result && ![result.version isEqualToString:feed.installedVersion])\n                {\n                    [toUpdate addObject:feed];\n                }\n            }\n        }\n        [toUpdate filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {\n            return [evaluatedObject installed] && ![evaluatedObject installing];\n        }]];\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            if(withInterface)\n            {\n                [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n                if(overlay == self.updateOverlay)\n                {\n                    if(!toUpdate.count)\n                    {\n                        [overlay setMode:MRProgressOverlayViewModeCheckmark];\n                        [overlay setTitleLabelText:@\"Up to date\"];\n                        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                            [overlay dismiss:YES];\n                        });\n                    }\n                    else\n                    {\n                        [overlay dismiss:YES completion:^{\n                            [self showUpdateRequestForFeeds:toUpdate count:toUpdate.count docsetList:[self docsetListForFeeds:toUpdate]];\n                        }];\n                    }\n                }\n                return;\n            }\n            else if(toUpdate.count && !withInterface)\n            {\n                if(updateWithoutAsking)\n                {\n                    [self updateFeeds:toUpdate];\n                }\n                else\n                {\n                    [[NSUserDefaults standardUserDefaults] setInteger:toUpdate.count forKey:[self defaultsScheduledUpdateKey]];\n                    [[NSUserDefaults standardUserDefaults] setObject:[self docsetListForFeeds:toUpdate] forKey:[self defaultsScheduledDocsetListUpdateKey]];\n                }\n            }\n            else if(!toUpdate.count)\n            {\n                [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n            }\n        });\n    });\n}\n\n- (void)showUpdateRequestForFeeds:(NSArray *)toUpdate count:(NSInteger)feedCount docsetList:(NSString *)docsetList\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n    [UIAlertView showWithTitle:@\"Updates Found\" message:[NSString stringWithFormat:@\"Updates are available for %ld %@:%@%@\", (long)feedCount, (feedCount > 1) ? @\"docsets\" : @\"docset\", (feedCount > 1) ? @\"\\n\\n\" : @\" \", docsetList] cancelButtonTitle:@\"Maybe Later\" otherButtonTitles:@[@\"Update\"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n        if(buttonIndex != alertView.cancelButtonIndex)\n        {\n            if(toUpdate)\n            {\n                [self updateFeeds:toUpdate];\n            }\n            else\n            {\n                [self checkForUpdatesAndShowInterface:NO updateWithoutAsking:YES];\n            }\n        }\n    }];\n}\n\n- (NSString *)docsetListForFeeds:(NSArray *)toUpdate\n{\n    NSMutableArray *sortedFeeds = [NSMutableArray arrayWithArray:toUpdate];\n    [sortedFeeds sortUsingFunction:compareFeeds context:nil];\n    NSMutableString *docsetList = [[NSMutableString alloc] init];\n    NSInteger count = 0;\n    for(DHFeed *feed in sortedFeeds)\n    {\n        if(docsetList.length)\n        {\n            [docsetList appendString:@\"\\n\"];\n        }\n        [docsetList appendString:[feed docsetNameWithVersion:NO]];\n        ++count;\n        if(count > 15)\n        {\n            [docsetList appendString:@\"\\nand more...\"];\n            break;\n        }\n    }\n    return docsetList;\n}\n\n- (void)updateFeeds:(NSArray *)feeds\n{\n    for(DHFeed *feed in feeds)\n    {\n        if(feed.installed && !feed.installing)\n        {\n            [self startInstallingFeed:feed isAnUpdate:YES];\n        }\n    }\n}\n\n- (BOOL)alertIfUpdatesAreScheduled\n{\n    NSInteger count = [[NSUserDefaults standardUserDefaults] integerForKey:[self defaultsScheduledUpdateKey]];\n    if(count > 0)\n    {\n        NSString *docsetList = [[NSUserDefaults standardUserDefaults] objectForKey:[self defaultsScheduledDocsetListUpdateKey]];\n        if(docsetList && docsetList.length)\n        {\n            [self showUpdateRequestForFeeds:nil count:count docsetList:docsetList];\n            return YES;\n        }\n    }\n    return NO;\n}\n\n- (void)backgroundCheckForUpdatesIfNeeded\n{\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    BOOL shouldUpdate = [defaults boolForKey:[self defaultsAutomaticallyCheckForUpdatesKey]];\n    NSDate *lastDate = [defaults objectForKey:[self defaultsUpdateLastCheckDateKey]];\n    if(shouldUpdate && (!lastDate ||  [[NSDate date] timeIntervalSinceDate:lastDate] > 60*60*24))\n    {\n        [self checkForUpdatesAndShowInterface:NO updateWithoutAsking:NO];\n    }\n}\n\n- (DHFeedResult *)loadFeed:(DHFeed *)feed error:(NSString **)returnError\n{\n    return nil;\n}\n\n- (IBAction)downloadButtonPressed:(id)sender\n{\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    \n    if([self canInstallFeed:feed])\n    {\n        [self startInstallingFeed:feed isAnUpdate:NO];\n    }\n}\n\n- (void)showDownloadProgressViewForFeed:(DHFeed *)feed\n{\n    DHRepoTableViewCell *cell = feed.cell;\n    feed.error = nil;\n    cell.progressView.progress = 0.0;\n    cell.progressView.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    [UIView animateWithDuration:0.3 animations:^{\n        cell.checkmark.alpha = 0.0;\n        cell.checkmark.transform = CGAffineTransformMakeScale(0.01, 0.01);\n        cell.uninstallButton.alpha = 0.0;\n        cell.uninstallButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n        cell.errorButton.alpha = 0.0;\n        cell.errorButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n        cell.progressView.alpha = 1.0;\n        cell.progressView.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.downloadButton.alpha = 0.0;\n        cell.downloadButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    } completion:^(BOOL finished) {\n        cell.downloadButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.errorButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.checkmark.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.uninstallButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        [feed adjustTitleLabelWidthBasedOnButtonsShown];\n    }];\n}\n\n- (IBAction)errorButtonPressed:(id)sender\n{\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    [[[UIAlertView alloc] initWithTitle:@\"Docset Install Failed\" message:[NSString stringWithFormat:@\"%@ Please check your Internet connection and available free space and try again.\", feed.error] delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n}\n\n- (void)showErrorButtonForFeed:(DHFeed *)feed\n{\n    DHRepoTableViewCell *cell = feed.cell;\n    feed.detailString = @\"\";\n    feed.maxRightDetailWidth = 0.0;\n    cell.titleLabel.rightDetailText = @\"\";\n    cell.errorButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    [feed adjustTitleLabelWidthBasedOnButtonsShown];\n    [UIView animateWithDuration:0.3 animations:^{\n        cell.errorButton.alpha = 1.0;\n        cell.errorButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n    } completion:nil];\n}\n\n- (void)showUninstallButtonForFeed:(DHFeed *)feed\n{\n    DHRepoTableViewCell *cell = feed.cell;\n    cell.uninstallButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    cell.checkmark.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    feed.detailString = @\"\";\n    feed.maxRightDetailWidth = 0.0;\n    cell.titleLabel.rightDetailText = @\"\";\n    [feed adjustTitleLabelWidthBasedOnButtonsShown];\n    feed.progressShown = NO;\n    [UIView animateWithDuration:0.3 animations:^{\n        cell.uninstallButton.alpha = 1.0;\n        cell.uninstallButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.checkmark.alpha = 1.0;\n        cell.checkmark.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.progressView.alpha = 0.0;\n        cell.progressView.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    } completion:^(BOOL finished) {\n        cell.progressView.progress = 0.0;\n        cell.progressView.transform = CGAffineTransformMakeScale(1.0, 1.0);\n    }];\n}\n\n- (IBAction)stopButtonPressed:(id)sender\n{\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    feed.installing = NO;\n    [feed.feedResult.fileDownload cancelDownload];\n    [self feedWasStopped:feed];\n    feed.feedResult = nil;\n    feed.progressShown = NO;\n    feed.progress = 0.0;\n    feed.detailString = @\"\";\n    feed.maxRightDetailWidth = 0.0;\n    feed.cell.titleLabel.rightDetailText = @\"\";\n    if(feed.installed)\n    {\n        [self setTitle:[feed docsetNameWithVersion:YES] forCell:feed.cell];\n        [self showUninstallButtonForFeed:feed];\n    }\n    else\n    {\n        [self showDownloadButtonForFeed:feed];        \n    }\n}\n\n- (void)feedWasStopped:(DHFeed *)feed\n{\n    \n}\n\n- (IBAction)uninstallButtonPressed:(id)sender\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n    NSUInteger row = [sender tag];\n    DHFeed *feed = [self activeFeeds][row];\n    feed.installed = NO;\n    feed.installedVersion = nil;\n    [self saveState];\n    [self setTitle:[feed docsetNameWithVersion:YES] forCell:feed.cell];\n    \n    NSString *trashPath = [self uniqueTrashPath];\n    NSString *feedPath = [self docsetPathForFeed:feed];\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    \n    [[DHDocsetManager sharedManager] removeDocsetsInFolder:feedPath];\n\n    [fileManager moveItemAtPath:feedPath toPath:trashPath error:nil];\n    [self feedDidUninstall:feed];\n    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{\n        [self emptyTrashAtPath:trashPath];\n    });\n    [self showDownloadButtonForFeed:feed];\n}\n\n- (void)feedDidUninstall:(DHFeed *)feed\n{\n    \n}\n\n- (void)emptyTrashAtPath:(NSString *)trashPath\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    @autoreleasepool {\n        NSString *file = nil;\n        NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:trashPath];\n        NSMutableArray *toDelete = [NSMutableArray array];\n        while(file = [dirEnum nextObject])\n        {\n            if([[file pathExtension] isCaseInsensitiveEqual:@\"docset\"])\n            {\n                [dirEnum skipDescendants];\n                NSString *fullPath = [trashPath stringByAppendingPathComponent:file];\n                [toDelete addObject:[fullPath stringByAppendingPathComponent:@\"Contents/Resources/tarix.tgz\"]];\n                [toDelete addObject:[fullPath stringByAppendingPathComponent:@\"Contents/Resources/optimisedIndex.dsidx\"]];\n                [toDelete addObject:[fullPath stringByAppendingPathComponent:@\"Contents/Resources/docSet.dsidx\"]];\n                continue;\n            }\n            if([[file pathExtension] isCaseInsensitiveEqual:@\"dsidx\"] || [[file pathExtension] isCaseInsensitiveEqual:@\"tgz\"] || [[file pathExtension] isCaseInsensitiveEqual:@\"tarix\"])\n            {\n                NSString *fullPath = [trashPath stringByAppendingPathComponent:file];\n                [toDelete addObject:fullPath];\n            }\n        }\n        for(NSString *path in toDelete)\n        {\n            [fileManager removeItemAtPath:path error:nil];\n        }\n    }\n    [fileManager removeItemAtPath:trashPath error:nil];\n}\n\n- (void)showDownloadButtonForFeed:(DHFeed *)feed\n{\n    DHRepoTableViewCell *cell = feed.cell;\n    cell.downloadButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    feed.detailString = @\"\";\n    feed.maxRightDetailWidth = 0.0;\n    feed.cell.titleLabel.rightDetailText = @\"\";\n    feed.progressShown = NO;\n    [UIView animateWithDuration:0.3 animations:^{\n        cell.downloadButton.alpha = 1.0;\n        cell.downloadButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.progressView.alpha = 0.0;\n        cell.progressView.transform = CGAffineTransformMakeScale(0.01, 0.01);\n        cell.checkmark.alpha = 0.0;\n        cell.checkmark.transform = CGAffineTransformMakeScale(0.01, 0.01);\n        cell.uninstallButton.alpha = 0.0;\n        cell.uninstallButton.transform = CGAffineTransformMakeScale(0.01, 0.01);\n    } completion:^(BOOL finished) {\n        cell.progressView.progress = 0.0;\n        cell.progressView.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.uninstallButton.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        cell.checkmark.transform = CGAffineTransformMakeScale(1.0, 1.0);\n        [feed adjustTitleLabelWidthBasedOnButtonsShown];\n    }];\n}\n\n- (UITableView *)activeTableView\n{\n    return (self.searchBarActive) ? self.searchController.searchResultsTableView : self.tableView;\n}\n\n- (NSMutableArray *)activeFeeds\n{\n    return (self.searchBarActive) ? self.filteredFeeds : self.feeds;\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return (self.loading) ? 1 : ([self activeFeeds].count) ? 1 : 0;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    if(self.loading)\n    {\n        return 3;\n    }\n    if(tableView != self.tableView)\n    {\n        return self.filteredFeeds.count;\n    }\n    return self.feeds.count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if(self.loading)\n    {\n        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHLoadingCell\" forIndexPath:indexPath];\n        cell.userInteractionEnabled = NO;\n        if(indexPath.row == 2)\n        {\n            NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n            [paragraph setAlignment:NSTextAlignmentCenter];\n            UIFont *font = [UIFont boldSystemFontOfSize:20];\n            cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:(self.loadingText) ? self.loadingText : @\"Loading...\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n        }\n        else\n        {\n            cell.textLabel.text = @\"\";\n        }\n        return cell;\n    }\n\n    DHRepoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHRepoCell\" forIndexPath:indexPath];\n    [cell.downloadButton setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -2, -10, -10)];\n    [cell.uninstallButton setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];\n    [cell.progressView setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -10)];\n    [cell.errorButton setHitTestEdgeInsets:UIEdgeInsetsMake(-10, -10, -10, -6)];\n    [cell setTagsToIndex:indexPath.row];\n    NSArray *targetArray = (tableView != self.tableView) ? self.filteredFeeds : self.feeds;\n    DHFeed *feed = targetArray[indexPath.row];\n    cell.feed = feed;\n    [cell.progressView.stopButton addTarget:self action:@selector(stopButtonPressed:) forControlEvents:UIControlEventTouchUpInside];\n    [cell.errorButton addTarget:self action:@selector(errorButtonPressed:) forControlEvents:UIControlEventTouchUpInside];\n    [cell.downloadButton addTarget:self action:@selector(downloadButtonPressed:) forControlEvents:UIControlEventTouchUpInside];\n    [cell.uninstallButton addTarget:self action:@selector(uninstallButtonPressed:) forControlEvents:UIControlEventTouchUpInside];\n    cell.titleLabel.opaque = NO;\n//    cell.checkmark.image = [cell.checkmark.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];\n    cell.titleLabel.backgroundColor = [UIColor clearColor];\n    cell.platform.image = feed.icon;\n    [feed prepareCell:cell];\n    cell.titleLabel.maxRightDetailWidth = feed.maxRightDetailWidth;\n    cell.titleLabel.rightDetailText = feed.detailString;\n    cell.titleLabel.subtitle = feed.authorLinkText;\n    cell.titleLabel.authorLinkHref = feed.authorLinkHref;\n    [self setSizeLabelForCell:cell];\n    [self setTitle:[feed docsetNameWithVersion:!feed.installing] forCell:cell];\n    return cell;\n}\n\n- (void)setSizeLabelForCell:(DHRepoTableViewCell *)cell\n{\n    if(cell.feed.installed && !cell.feed.installing && cell.feed.size && cell.feed.size.length)\n    {\n        if(!isRegularHorizontalClass)\n        {\n            [cell.titleLabel setRightDetailText:nil];\n            return;\n        }\n        NSString *label = [cell.feed.size stringByAppendingString:@\"\"];\n        cell.titleLabel.maxRightDetailWidth = [DHRightDetailLabel calculateMaxDetailWidthBasedOnLongestPossibleString:label];\n        [cell.titleLabel setRightDetailText:label];\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(DHRepoTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    if([cell isKindOfClass:[DHRepoTableViewCell class]])\n    {\n        cell.feed.cell = nil;\n        cell.feed = nil;\n    }\n}\n\n- (void)highlightCell:(DHRepoTableViewCell *)cell\n{\n    NSRange range;\n    NSInteger offset = 0;\n    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:cell.titleLabel.attributedText];\n    for(NSString *key in [DHDBResult highlightDictionary])\n    {\n        [string removeAttribute:key range:NSMakeRange(0, string.length)];\n    }\n    NSString *substring = [[string string] copy];\n    BOOL didAddAttributes = NO;\n    while((range = [substring rangeOfString:self.filterQuery options:NSCaseInsensitiveSearch]).location != NSNotFound)\n    {\n        [string addAttributes:[DHDBResult highlightDictionary] range:NSMakeRange(range.location+offset, range.length)];\n        substring = [substring substringFromDashIndex:range.location+range.length];\n        offset += range.location+range.length;\n        didAddAttributes = YES;\n    }\n    if(didAddAttributes)\n    {\n        cell.titleLabel.attributedText = string;\n    }\n}\n\n- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView\n{\n    if(self.searchBarActive || (self.searchBarActiveIsALie && !self.searchBarActive))\n    {\n        return nil;\n    }\n    return [self.feeds characterIndexTitles];\n}\n\n- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)aIndex\n{\n    NSInteger index = [self.feeds indexOfFirstObjectThatStartsWithCharacter:title];\n    if(index != 0)\n    {\n        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];\n    }\n    return index;\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView\n{\n    if(isIOS11)\n    {\n        if(@available(iOS 11.0, *))\n        {\n            tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;\n        }\n    }\n    [controller.searchResultsTableView registerNib:[UINib nibWithNibName:@\"DHRepoCell\" bundle:nil] forCellReuseIdentifier:@\"DHRepoCell\"];\n    [controller.searchResultsTableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n    tableView.allowsSelection = NO;\n}\n\n- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller\n{\n    controller.searchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;\n    self.searchController = controller;\n    self.searchBarActive = YES;\n    [self.tableView reloadSectionIndexTitles];\n}\n\n- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller\n{\n    self.searchBarActive = NO;\n    [self reload];\n}\n\n- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString\n{\n    [self filterFeedsWithQuery:searchString];\n    return YES;\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller willHideSearchResultsTableView:(UITableView *)tableView\n{\n    if(!self.searchBarActive)\n    {\n        return;\n    }\n    self.searchBarActive = NO;\n    self.searchBarActiveIsALie = YES;\n    [self reload];\n    self.searchBarActiveIsALie = NO;\n    self.searchBarActive = YES;\n}\n\n- (void)reload\n{\n    [self.tableView reloadData];\n}\n\n- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller\n{\n    self.searchBarActive = NO;\n}\n\n- (void)filterFeedsWithQuery:(NSString *)query\n{\n    self.filterQuery = query;\n    self.filteredFeeds = [NSMutableArray array];\n    NSMutableArray *aliasMatches = [NSMutableArray array];\n    for(DHFeed *feed in self.feeds)\n    {\n        if([[feed docsetNameWithVersion:!feed.installing] contains:query])\n        {\n            [self.filteredFeeds addObject:feed];\n        }\n        else\n        {\n            for(NSString *alias in feed.aliases)\n            {\n                if([alias contains:query])\n                {\n                    [aliasMatches addObject:feed];\n                    break;\n                }\n            }\n        }\n    }\n    [self.filteredFeeds sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {\n        NSString *myName = [obj1 docsetNameWithVersion:![obj1 installing]];\n        NSString *theirName = [obj2 docsetNameWithVersion:![obj2 installing]];\n        NSRange myMatch = [myName rangeOfString:query options:NSCaseInsensitiveSearch];\n        NSRange theirMatch = [theirName rangeOfString:query options:NSCaseInsensitiveSearch];\n        if(myMatch.location < theirMatch.location)\n        {\n            return NSOrderedAscending;\n        }\n        else if(myMatch.location > theirMatch.location)\n        {\n            return NSOrderedDescending;\n        }\n        else\n        {\n            return [[obj1 sortName] localizedCaseInsensitiveCompare:[obj2 sortName]];\n        }\n    }];\n    [self.filteredFeeds addObjectsFromArray:aliasMatches];\n}\n\n- (void)setTitle:(NSString *)title forCell:(DHRepoTableViewCell *)cell\n{\n    cell.titleLabel.text = title;\n    if(self.searchBarActive && self.filterQuery.length)\n    {\n        [self highlightCell:cell];\n    }\n}\n\n- (void)feedWillInstall:(DHFeed *)feed\n{\n    \n}\n\n- (void)startInstallingFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    [self showDownloadProgressViewForFeed:feed];\n    feed.progress = 0.0;\n    feed.progressShown = YES;\n    feed.installing = YES;\n    feed.checkingForUpdates = NO;\n    feed.error = nil;\n    [self setTitle:[feed docsetNameWithVersion:NO] forCell:feed.cell];\n    [self feedWillInstall:feed];\n    dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n    dispatch_async(queue, ^{\n        [NSThread sleepForTimeInterval:0.2f]; // without this there's a display glitch when internet is off and instant error is shown\n        NSString *result = [self installFeed:feed isAnUpdate:isAnUpdate];\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            if(!feed.installing || [result isEqualToString:@\"cancelled\"])\n            {\n                 // user cancelled install\n                return;\n            }\n            feed.installing = NO;\n            NSString *version = feed.feedResult.version;\n            feed.feedResult = nil;\n            feed.progress = 0.0;\n            if(!result)\n            {\n                feed.installed = YES;\n                feed.installedVersion = version;\n                [self saveState];\n                [self setTitle:[feed docsetNameWithVersion:YES] forCell:feed.cell];\n                [self showUninstallButtonForFeed:feed];\n                [self setSizeLabelForCell:feed.cell];\n                [feed adjustTitleLabelWidthBasedOnButtonsShown];\n                DHDocset *docset = [DHDocset firstDocsetInsideFolder:[self docsetPathForFeed:feed]];\n                docset.repoIdentifier = [self repoIdentifier];\n                docset.feedIdentifier = [feed uniqueIdentifier];\n                [[DHDocsetManager sharedManager] addDocset:docset andRemoveOthers:YES removeOnlyEqualPaths:[self isKindOfClass:[DHDocsetTransferrer class]]];\n            }\n            else if(isAnUpdate)\n            {\n                [self setTitle:[feed docsetNameWithVersion:YES] forCell:feed.cell];\n                [self showUninstallButtonForFeed:feed];\n                [feed adjustTitleLabelWidthBasedOnButtonsShown];\n            }\n            else\n            {\n                feed.error = result;\n                [self showErrorButtonForFeed:feed];\n                [self showDownloadButtonForFeed:feed];\n                [feed adjustTitleLabelWidthBasedOnButtonsShown];\n            }\n        });\n    });\n}\n\n- (NSString *)installFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    NSLog(@\"installFeed: not implemented for %@\", NSStringFromClass([self class]));\n    return nil;\n}\n\n- (BOOL)canInstallFeed:(DHFeed *)feed\n{\n    return YES;\n}\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHRepoCell\" bundle:nil] forCellReuseIdentifier:@\"DHRepoCell\"];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    [self traitCollectionDidChange:nil];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    if(self.searchController.isActive)\n    {\n        @try {\n            [self.searchController setActive:NO animated:NO];\n        } @catch (NSException *exception) {\n        }\n    }\n    if(isRegularHorizontalClass)\n    {\n        [self.navigationItem setHidesBackButton:YES animated:NO];\n        [self.tableView reloadData];\n    }\n    else\n    {\n        [self.navigationItem setHidesBackButton:NO animated:NO];\n        [self.tableView reloadData];\n    }\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    [UIApplication sharedApplication].idleTimerDisabled = YES;\n    [[DHLatencyTester sharedLatency] performTests:NO];\n    [self traitCollectionDidChange:nil];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [UIApplication sharedApplication].idleTimerDisabled = NO;\n}\n\n- (NSString *)docsetInstallFolderName\n{\n    NSLog(@\"docsetInstallFolderName not implemented for %@\", NSStringFromClass([self class]));\n    return @\"Unknown\";\n}\n\n- (NSString *)repoIdentifier // Used to find a corresponding repo for a installed docset\n{\n    return [self docsetInstallFolderName];\n}\n\n- (NSString *)docsetInstallFolderPath\n{\n    return [[homePath stringByAppendingPathComponent:@\"Docsets\"] stringByAppendingPathComponent:[self docsetInstallFolderName]];\n}\n\n- (NSString *)docsetPathForFeed:(DHFeed *)feed\n{\n    return [[self docsetInstallFolderPath] stringByAppendingPathComponent:feed.installFolderName];\n}\n\n- (NSString *)defaultsKey\n{\n    return NSStringFromClass([self class]);\n}\n\n- (NSString *)defaultsScheduledUpdateKey\n{\n    return [[self defaultsKey] stringByAppendingString:@\"ScheduledUpdate\"];\n}\n\n- (NSString *)defaultsScheduledDocsetListUpdateKey\n{\n    return [[self defaultsKey] stringByAppendingString:@\"ScheduledUpdateDocsetList\"];\n}\n\n- (NSString *)defaultsAutomaticallyCheckForUpdatesKey\n{\n    return @\"AutomaticallyCheckForUpdates\";\n}\n\n+ (NSString *)defaultsAlphabetizingKey {\n    return @\"DocSetAlphabetizing\";\n}\n\n- (NSString *)defaultsUpdateLastCheckDateKey\n{\n    return [[self defaultsKey] stringByAppendingString:@\"LastUpdateCheck\"];\n}\n\n- (NSString *)trashPath\n{\n    return [[self docsetInstallFolderPath] stringByAppendingPathComponent:@\".Trash\"];\n}\n\n- (NSString *)uniqueTrashPath\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *trash = [self trashPath];\n    [fileManager createDirectoryAtPath:trash withIntermediateDirectories:YES attributes:nil error:nil];\n    for(int i = 0; i < 500; i++)\n    {\n        NSString *random = [trash stringByAppendingPathComponent:[NSString randomStringWithLength:8]];\n        if(![fileManager fileExistsAtPath:random])\n        {\n            return random;\n        }\n    }\n    return [trash stringByAppendingPathComponent:[NSString randomStringWithLength:8]];\n}\n\n- (NSString *)uniqueTempDirAtPath:(NSString *)path\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    for(int i = 0; i < 100; i++)\n    {\n        NSString *random = [path stringByAppendingPathComponent:[@\"dash_temp_\" stringByAppendingString:[NSString randomStringWithLength:8]]];\n        if(![fileManager fileExistsAtPath:random])\n        {\n            return random;\n        }\n    }\n    return [path stringByAppendingPathComponent:[@\"dash_temp_\" stringByAppendingString:[NSString randomStringWithLength:8]]];\n}\n\n- (void)saveState\n{\n    NSMutableArray *feeds = [NSMutableArray array];\n    for(DHFeed *feed in self.feeds)\n    {\n        [feeds addObject:[feed dictionaryRepresentation]];\n    }\n    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\n    [defaults setObject:feeds forKey:[self defaultsKey]];\n}\n\n- (BOOL)shouldStall\n{\n    return [self numberOfEntriesBeingInstalled] > 2;\n}\n\n- (NSInteger)numberOfEntriesBeingInstalled\n{\n    NSInteger count = 0;\n    for(DHFeed *feed in self.feeds)\n    {\n        if(feed.installing && !feed.waiting)\n        {\n            ++count;\n        }\n    }\n    return count;\n}\n\n- (NSInteger)indexOfFeedWithFeedURL:(NSString *)feedURL\n{\n    NSInteger i = 0;\n    for(DHFeed *feed in self.feeds)\n    {\n        if([feed.feedURL isEqualToString:feedURL])\n        {\n            return i;\n        }\n        ++i;\n    }\n    return NSNotFound;\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    [self viewDidLoad];\n}\n\n@end\n\nNSInteger compareFeeds(id feed1, id feed2, void *context)\n{\n    NSString *myName = [feed1 sortName];\n    NSString *theirName = [feed2 sortName];\n    return [myName localizedCaseInsensitiveCompare:theirName];\n}\n"
  },
  {
    "path": "Dash/DHRepoCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16B2657\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11524\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"blue\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"DHRepoCell\" id=\"gD6-nO-fUL\" customClass=\"DHRepoTableViewCell\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n            <autoresizingMask key=\"autoresizingMask\"/>\n            <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"gD6-nO-fUL\" id=\"Iwq-Gg-Aks\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"43\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <button opaque=\"NO\" alpha=\"0.0\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" id=\"VEY-Fa-mUF\" userLabel=\"Error Button\">\n                        <rect key=\"frame\" x=\"242\" y=\"10\" width=\"25\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <color key=\"tintColor\" red=\"1\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <state key=\"normal\" image=\"error\"/>\n                    </button>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" id=\"WLE-hT-yWC\" userLabel=\"Download Button\">\n                        <rect key=\"frame\" x=\"275\" y=\"10\" width=\"25\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <state key=\"normal\" image=\"download_button_arrow\" backgroundImage=\"download_button_background\"/>\n                    </button>\n                    <imageView userInteractionEnabled=\"NO\" alpha=\"0.0\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"checkmark\" id=\"f1O-7f-a8f\" userLabel=\"Checkmark\">\n                        <rect key=\"frame\" x=\"242\" y=\"10\" width=\"25\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                    </imageView>\n                    <button opaque=\"NO\" alpha=\"0.0\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" id=\"YLy-Qg-QeK\" userLabel=\"Uninstall Button\">\n                        <rect key=\"frame\" x=\"275\" y=\"10\" width=\"25\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <state key=\"normal\" image=\"trash\"/>\n                    </button>\n                    <view alpha=\"0.0\" contentMode=\"scaleToFill\" id=\"zET-rm-F2d\" customClass=\"MRCircularProgressView\">\n                        <rect key=\"frame\" x=\"275\" y=\"10\" width=\"25\" height=\"25\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMinX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <userDefinedRuntimeAttributes>\n                            <userDefinedRuntimeAttribute type=\"boolean\" keyPath=\"mayStop\" value=\"YES\"/>\n                            <userDefinedRuntimeAttribute type=\"size\" keyPath=\"stopButton.fixedSize\">\n                                <size key=\"value\" width=\"7\" height=\"7\"/>\n                            </userDefinedRuntimeAttribute>\n                        </userDefinedRuntimeAttributes>\n                    </view>\n                    <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" misplaced=\"YES\" text=\"\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Y8q-qI-7JH\" customClass=\"DHRightDetailLabel\">\n                        <rect key=\"frame\" x=\"47\" y=\"0.0\" width=\"220\" height=\"43\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" id=\"NHs-86-mIS\" userLabel=\"Platform\">\n                        <rect key=\"frame\" x=\"16\" y=\"14\" width=\"16\" height=\"16\"/>\n                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\" flexibleMaxY=\"YES\"/>\n                    </imageView>\n                </subviews>\n            </tableViewCellContentView>\n            <inset key=\"separatorInset\" minX=\"46\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n            <connections>\n                <outlet property=\"checkmark\" destination=\"f1O-7f-a8f\" id=\"D9Q-4T-qak\"/>\n                <outlet property=\"downloadButton\" destination=\"WLE-hT-yWC\" id=\"BkK-kX-Omb\"/>\n                <outlet property=\"errorButton\" destination=\"VEY-Fa-mUF\" id=\"IDT-7Z-NuF\"/>\n                <outlet property=\"platform\" destination=\"NHs-86-mIS\" id=\"EY8-p8-BoB\"/>\n                <outlet property=\"progressView\" destination=\"zET-rm-F2d\" id=\"tL5-Gs-P1X\"/>\n                <outlet property=\"titleLabel\" destination=\"Y8q-qI-7JH\" id=\"BhT-gy-FwV\"/>\n                <outlet property=\"uninstallButton\" destination=\"YLy-Qg-QeK\" id=\"r0J-vo-kPw\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"checkmark\" width=\"25\" height=\"25\"/>\n        <image name=\"download_button_arrow\" width=\"25\" height=\"25\"/>\n        <image name=\"download_button_background\" width=\"25\" height=\"25\"/>\n        <image name=\"error\" width=\"25\" height=\"25\"/>\n        <image name=\"trash\" width=\"25\" height=\"25\"/>\n    </resources>\n    <simulatedMetricsContainer key=\"defaultSimulatedMetrics\">\n        <simulatedStatusBarMetrics key=\"statusBar\"/>\n        <simulatedOrientationMetrics key=\"orientation\"/>\n        <simulatedScreenMetrics key=\"destination\" type=\"retina4_7.fullscreen\"/>\n    </simulatedMetricsContainer>\n</document>\n"
  },
  {
    "path": "Dash/DHRepoTableView.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHRepoTableView : UITableView\n\n@end\n"
  },
  {
    "path": "Dash/DHRepoTableView.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepoTableView.h\"\n\n@implementation DHRepoTableView\n\n\n\n@end\n"
  },
  {
    "path": "Dash/DHRepoTableViewCell.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"MRProgress.h\"\n#import \"DHRightDetailLabel.h\"\n\n@class DHFeed;\n\n@interface DHRepoTableViewCell : UITableViewCell\n\n@property (assign) IBOutlet UIButton *downloadButton;\n@property (assign) IBOutlet MRCircularProgressView *progressView;\n@property (assign) IBOutlet UIButton *errorButton;\n@property (assign) IBOutlet DHRightDetailLabel *titleLabel;\n@property (assign) IBOutlet UIButton *uninstallButton;\n@property (assign) IBOutlet UIImageView *checkmark;\n@property (assign) IBOutlet UIImageView *platform;\n@property (weak) DHFeed *feed;\n\n- (void)setTagsToIndex:(NSInteger)index;\n\n@end\n"
  },
  {
    "path": "Dash/DHRepoTableViewCell.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepoTableViewCell.h\"\n\n@implementation DHRepoTableViewCell\n\n- (void)setTagsToIndex:(NSInteger)index\n{\n    self.downloadButton.tag = index;\n    self.progressView.stopButton.tag = index;\n    self.errorButton.tag = index;\n    self.uninstallButton.tag = index;\n}\n\n- (NSString *)accessibilityValue\n{\n    return [self.titleLabel accessibilityValue];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHRightDetailLabel.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHRightDetailLabel : UILabel\n\n@property (strong) NSString *_rightDetailText;\n@property (assign, nonatomic) CGFloat maxRightDetailWidth;\n@property (assign) BOOL isBrowserCell;\n@property (strong) NSString *subtitle;\n@property (strong) NSString *authorLinkHref;\n\n- (void)setRightDetailText:(NSString *)rightDetailText;\n+ (CGFloat)calculateMaxDetailWidthBasedOnLongestPossibleString:(NSString *)string;\n- (void)setRightDetailText:(NSString *)rightDetailText adjustMainWidth:(BOOL)adjustWidth;\n\n@end\n"
  },
  {
    "path": "Dash/DHRightDetailLabel.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRightDetailLabel.h\"\n\n@implementation DHRightDetailLabel\n\n- (void)drawRect:(CGRect)rect\n{\n    [super drawRect:rect];\n    if(self._rightDetailText.length)\n    {\n        NSMutableParagraphStyle *paragraph = NSMutableParagraphStyle.new;\n        paragraph.alignment = NSTextAlignmentRight;\n        rect = self.bounds;\n        if(self.isBrowserCell)\n        {\n            rect.origin.y += 11;\n            rect.size.width -= 2;\n            if(isRetina)\n            {\n                rect.origin.y -= 0.5;                \n            }\n            [self._rightDetailText drawInRect:rect withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16], NSParagraphStyleAttributeName: paragraph, NSForegroundColorAttributeName: [UIColor colorWithRed:142.0/255.0 green:142.0/255.0 blue:147.0/255.0 alpha:1.0]}];\n        }\n        else\n        {\n            rect.origin.y += 15;\n            rect.size.width -= 2;\n            [self._rightDetailText drawInRect:rect withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:12], NSParagraphStyleAttributeName: paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:142.0/255.0 alpha:1.0]}];\n        }\n    }\n    if(self.subtitle.length)\n    {\n        NSMutableParagraphStyle *paragraph = NSMutableParagraphStyle.new;\n        paragraph.lineBreakMode = NSLineBreakByTruncatingTail;\n        rect = self.bounds;\n        rect.origin.y += 24;\n        rect.size.width -= self.maxRightDetailWidth;\n        NSString *subtitle = self.subtitle;\n        if(self.authorLinkHref)\n        {\n            subtitle = [@\"Contributed by \" stringByAppendingString:self.subtitle];\n            \n//            Make author part underlined, commented out because making author clickable is a bit hard, giving up for now\n//            NSMutableAttributedString *attributedSubtitle = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@\"Contributed by %@\", self.subtitle]];\n//            [attributedSubtitle setAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:11], NSForegroundColorAttributeName: [UIColor colorWithRed:142.0/255.0 green:142.0/255.0 blue:147.0/255.0 alpha:1.0]} range:NSMakeRange(0, attributedSubtitle.length)];\n//            [attributedSubtitle addAttributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)} range:NSMakeRange(@\"Contributed by \".length, self.subtitle.length)];\n//            [attributedSubtitle drawInRect:rect];\n        }\n//        else\n//        {\n            [subtitle drawInRect:rect withAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:11], NSParagraphStyleAttributeName: paragraph, NSForegroundColorAttributeName: [UIColor colorWithRed:142.0/255.0 green:142.0/255.0 blue:147.0/255.0 alpha:1.0]}];\n//        }\n    }\n}\n\n- (void)drawTextInRect:(CGRect)rect\n{\n    if(self._rightDetailText.length)\n    {\n        rect = CGIncreaseRect(rect, 0, 0, -self.maxRightDetailWidth-12, 0);\n    }\n    if(self.subtitle.length)\n    {\n        rect = CGIncreaseRect(rect, 0, -7, 0, 0);\n    }\n    [super drawTextInRect:rect];\n}\n\n- (void)setRightDetailText:(NSString *)rightDetailText adjustMainWidth:(BOOL)adjustWidth\n{\n    [self setRightDetailText:rightDetailText];\n    if(adjustWidth)\n    {\n        self.maxRightDetailWidth = [rightDetailText attributedSizeWithFont:[UIFont systemFontOfSize:(self.isBrowserCell) ? 16 : 12]].width;\n    }\n}\n\n- (void)setRightDetailText:(NSString *)rightDetailText\n{\n    self._rightDetailText = rightDetailText;\n    if(!rightDetailText.length)\n    {\n        self.maxRightDetailWidth = 0.0;\n    }\n    [self setNeedsDisplay];\n}\n\n+ (CGFloat)calculateMaxDetailWidthBasedOnLongestPossibleString:(NSString *)string\n{\n    CGSize size = [string attributedSizeWithFont:[UIFont systemFontOfSize:12]];\n    return size.width;\n}\n\n- (NSString *)accessibilityValue\n{\n    return [[NSString stringWithFormat:@\"%@ %@\", self.subtitle ?: @\"\", self._rightDetailText ?: @\"\"] trimWhitespace];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHSearchDisplayController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHSearchDisplayController : UISearchDisplayController\n\n@end\n"
  },
  {
    "path": "Dash/DHSearchDisplayController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHSearchDisplayController.h\"\n#import \"DHNestedViewController.h\"\n#import \"JGMethodSwizzler.h\"\n\n@interface UISearchDisplayController (DHUtils)\n\n- (void)navigationControllerWillShowViewController:(id)navigationController;\n\n@end\n\n@implementation UISearchDisplayController (DHUtils)\n\n@end\n\n@implementation DHSearchDisplayController\n\n- (void)navigationControllerWillShowViewController:(id)navigationController\n{\n    if(isRegularHorizontalClass)\n    {\n        SEL selector = NSSelectorFromString(@\"_deselectAllNonMultiSelectRowsAnimated:notifyDelegate:\");\n        if([self.searchResultsTableView respondsToSelector:selector])\n        {\n            [self.searchResultsTableView swizzleMethod:selector withReplacement:JGMethodReplacementProviderBlock {\n                return JGMethodReplacement(void, UITableView *, BOOL animated, BOOL notifyDelegate) {\n                    \n                };\n            }];\n        }\n    }\n    [super navigationControllerWillShowViewController:navigationController];\n    if(isRegularHorizontalClass)\n    {\n        [self.searchResultsTableView deswizzle];        \n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHSplitViewController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHSplitViewController : UISplitViewController\n\n@end\n"
  },
  {
    "path": "Dash/DHSplitViewController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHSplitViewController.h\"\n#import \"DHWebViewController.h\"\n#import \"DHRepo.h\"\n#import \"DHPreferences.h\"\n#import \"DHTocBrowser.h\"\n#import \"DHDocsetBrowser.h\"\n\n@implementation DHSplitViewController\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    self.delegate = (id)self;\n    self.preferredPrimaryColumnWidthFraction = (iPad) ? 0.39 : 0.35;\n    self.maximumPrimaryColumnWidth = 320;\n\n}\n\n- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UINavigationController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController\n{\n    DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n    DHTocBrowser *tocBrowser = webViewController.actualTOCBrowser;\n    [tocBrowser dismissModal:self];\n    [[NSNotificationCenter defaultCenter] postNotificationName:DHSplitViewControllerDidCollapse object:nil];\n\n//    if([secondaryViewController.topViewController isKindOfClass:[DHRepo class]])\n//    {\n//        [secondaryViewController setViewControllers:[NSArray arrayWithObject:secondaryViewController.topViewController] animated:NO];\n//        return NO;\n//    }\n    return YES;\n}\n\n- (UIViewController *)splitViewController:(UISplitViewController *)splitViewController separateSecondaryViewControllerFromPrimaryViewController:(UINavigationController *)masterViewController\n{\n    [splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];\n    DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n    [webViewController removeDashClearedClass];\n    DHTocBrowser *tocBrowser = webViewController.actualTOCBrowser;\n    [tocBrowser dismissModal:self];\n    NSMutableArray *detailViewControllers = [NSMutableArray arrayWithObject:webViewController];\n    NSMutableArray *newMasterViewControllers = [NSMutableArray array];\n    for(UIViewController *viewController in masterViewController.viewControllers)\n    {\n        if([viewController isKindOfClass:[DHRepo class]])\n        {\n            [detailViewControllers addObject:viewController];\n        }\n        else if(![viewController isKindOfClass:[DHWebViewController class]])\n        {\n            [newMasterViewControllers addObject:viewController];\n        }\n    }\n    [masterViewController setViewControllers:newMasterViewControllers animated:NO];\n    UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:webViewController];\n    detailNavigationController.delegate = webViewController;\n    if([[masterViewController topViewController] isKindOfClass:[DHPreferences class]] && ![[detailViewControllers lastObject] isKindOfClass:[DHRepo class]])\n    {\n        DHPreferences *preferences = (id)[masterViewController topViewController];\n        NSIndexPath *indexPath = (preferences.tableView.indexPathForSelectedRow) ? preferences.tableView.indexPathForSelectedRow : [NSIndexPath indexPathForRow:0 inSection:0];\n        NSString *identifier = [[preferences segueIdentifierForIndexPath:indexPath] substringToString:@\"ToDetailSegue\"];\n        id viewController = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:identifier];\n        [detailViewControllers addObject:viewController];\n    }\n    else if(![[masterViewController topViewController] isKindOfClass:[DHPreferences class]] && [[detailViewControllers lastObject] isKindOfClass:[DHRepo class]])\n    {\n        while([[detailViewControllers lastObject] isKindOfClass:[DHRepo class]])\n        {\n            [detailViewControllers removeLastObject];\n        }\n    }\n    [detailNavigationController setViewControllers:detailViewControllers animated:NO];\n    [masterViewController setToolbarHidden:YES animated:NO];\n    [[NSNotificationCenter defaultCenter] postNotificationName:DHSplitViewControllerDidSeparate object:nil];\n    return detailNavigationController;\n}\n\n- (NSArray<UIKeyCommand *> *)keyCommands\n{\n    if([self currentSearchBar])\n    {\n        return @[[UIKeyCommand keyCommandWithInput:@\"f\" modifierFlags:UIKeyModifierCommand action:@selector(handleCommandF) discoverabilityTitle:([self currentSearchBar].placeholder) ? [self currentSearchBar].placeholder : @\"Search\"]];\n    }\n    return @[];\n}\n\n- (UISearchBar *)currentSearchBar\n{\n    for(id childController in [self childViewControllers])\n    {\n        id controller = childController;\n        if([childController isKindOfClass:[UINavigationController class]])\n        {\n            controller = [childController visibleViewController];\n        }\n        if([controller respondsToSelector:@selector(searchBar)] && [controller searchBar])\n        {\n            return [controller searchBar];\n        }\n        if([controller respondsToSelector:@selector(searchController)] && [controller searchController])\n        {\n            return [[[(DHDocsetBrowser*)controller searchController] displayController] searchBar];\n        }\n    }\n    return nil;\n}\n\n- (void)handleCommandF\n{\n    [[self currentSearchBar] becomeFirstResponder];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTarixIndex.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHTarixIndex : NSObject\n\n+ (NSString *)hashForFile:(NSString *)path;\n\n@end\n"
  },
  {
    "path": "Dash/DHTarixIndex.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTarixIndex.h\"\n#import \"FMDatabase.h\"\n\n@implementation DHTarixIndex\n\n+ (NSString *)hashForFile:(NSString *)path\n{\n    NSString *hash = nil;\n    NSString *docsetPath = [[path substringToStringReturningNil:@\".docset\"] stringByAppendingString:@\".docset\"];\n    NSString *filePath = [[docsetPath lastPathComponent] stringByAppendingPathComponent:[path substringFromStringReturningNil:@\".docset\"]];\n    if(filePath.length && docsetPath.length)\n    {\n        NSString *indexPath = [docsetPath stringByAppendingPathComponent:@\"Contents/Resources/tarixIndex.db\"];\n        NSFileManager *fileManager = [NSFileManager defaultManager];\n        if([fileManager fileExistsAtPath:indexPath])\n        {\n            @synchronized([DHTarixIndex class])\n            {\n                FMDatabase *db = [FMDatabase databaseWithPath:indexPath];\n                if([db openWithFlags:SQLITE_OPEN_READONLY])\n                {\n                    FMResultSet *rs = [db executeQuery:@\"SELECT hash FROM tarindex WHERE path = ?\", filePath];\n                    if([rs next])\n                    {\n                        hash = [rs stringForColumnIndex:0];\n                        if(!hash.length)\n                        {\n                            hash = nil;\n                        }\n                    }\n                    [db close];\n                }\n            }\n        }\n    }\n    return hash;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTarixProtocol.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHTarixProtocol : NSURLProtocol\n\n+ (NSMutableData *)alterData:(NSMutableData *)data scheme:(NSString *)scheme path:(NSString *)path extension:(NSString *)extension mimeType:(NSString *)mimeType isTimeout:(BOOL)isTimeout;\n\n@end\n"
  },
  {
    "path": "Dash/DHTarixProtocol.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTarixProtocol.h\"\n#import \"DHUnarchiver.h\"\n#import \"DHCSS.h\"\n#import \"DHWebViewController.h\"\n#import \"DHWebView.h\"\n\n@implementation DHTarixProtocol\n\n+ (BOOL)canInitWithRequest:(NSURLRequest *)request\n{\n    if([[[request URL] scheme] isCaseInsensitiveEqual:@\"file\"])\n    {\n        return YES;\n    }\n    else if([[[request URL] scheme] isCaseInsensitiveEqual:@\"dash-tarix\"])\n    {\n        return YES;\n    }\n    return NO;\n}\n\n+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request\n{\n    return request;\n}\n\n- (void)startLoading\n{\n    NSString *path = [[[self.request URL] path] stringByReplacingPercentEscapes];\n    NSString *extension = [path pathExtension];\n    NSString *mimeType = [NSString mimeTypeForPathExtension:extension];\n    NSURLResponse *response = [[NSURLResponse alloc] initWithURL:[self.request URL]\n                                                        MIMEType:mimeType\n                                           expectedContentLength:-1\n                                                textEncodingName:nil];\n    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];\n    \n    NSMutableData *data = [DHUnarchiver tarixReadFile:path toFile:nil];\n    if(!data)\n    {\n        data = [NSMutableData dataWithContentsOfFile:path];\n    }\n    data = [DHTarixProtocol alterData:data scheme:[[self.request URL] scheme] path:path extension:extension mimeType:mimeType isTimeout:NO];\n    \n    [[self client] URLProtocol:self didLoadData:data];\n    [[self client] URLProtocolDidFinishLoading:self];\n}\n\n+ (NSMutableData *)alterData:(NSMutableData *)data scheme:(NSString *)scheme path:(NSString *)path extension:(NSString *)extension mimeType:(NSString *)mimeType isTimeout:(BOOL)isTimeout\n{\n    if(!data)\n    {\n        if([[path lastPathComponent] hasPrefix:@\"Dash-Intercept-\"])\n        {\n            path = [[NSBundle mainBundle] pathForResource:[[[path lastPathComponent] stringByDeletingPathExtension] substringFromDashIndex:@\"Dash-Intercept-\".length] ofType:[path pathExtension]];\n            data = [NSMutableData dataWithContentsOfFile:path];\n        }\n    }\n    BOOL isHTML = [extension hasCaseInsensitivePrefix:@\"htm\"] || [mimeType contains:@\"html\"];\n    BOOL isCSS = [extension hasCaseInsensitivePrefix:@\"css\"] || [mimeType contains:@\"css\"];\n    BOOL isJS = [extension hasCaseInsensitivePrefix:@\"js\"];\n    if(isHTML && data)\n    {\n        DHWebViewController *webController = [DHWebViewController sharedWebViewController];\n        NSString *cssString = [NSString stringWithFormat:@\"<head><style>%@</style>\", [DHCSS currentCSSStringWithTextModifier]];\n        \n        __block CGRect webViewFrame = CGRectZero;\n        if([NSThread isMainThread])\n        {\n            webViewFrame = webController.webView.frame;\n        }\n        else\n        {\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                webViewFrame = webController.webView.frame;\n            });\n        }\n        NSString *viewportString = [NSString stringWithFormat:@\"<meta id='dash_viewport' name='viewport' content='%@'/></head>\", [DHWebView viewportContent:webViewFrame]];\n        NSMutableString *content = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n        if(content)\n        {\n            [content replaceOccurrencesOfString:@\"<head>\" withString:cssString options:NSCaseInsensitiveSearch range:NSMakeRange(0, content.length)];\n            [content replaceOccurrencesOfString:@\"</head>\" withString:viewportString options:NSCaseInsensitiveSearch range:NSMakeRange(0, content.length)];\n            data = (id)[content dataUsingEncoding:NSUTF8StringEncoding];\n        }\n    }\n    else if(isCSS && data)\n    {\n        NSMutableString *content = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n        if(content)\n        {\n            // if I don't remove this, things get weird when I'm scrolling in UIViewC class\n            // because it believes orientation changes when the toolbar gets hidden\n            for(NSString *toRemove in @[@\"and (orientation:portrait)\", @\"and (orientation:landscape)\"])\n            {\n                [content replaceOccurrencesOfString:toRemove withString:@\"\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, content.length)];\n            }\n            data = (id)[content dataUsingEncoding:NSUTF8StringEncoding];\n        }\n    }\n    else if(isJS && data && [path contains:@\"Unity 3D.docset\"])\n    {\n        // Use localStorage because cookie storage doesn't work because UIWebView can't handle the file:// scheme with a\n        // custom protocol so I'm forced to use the dash-tarix:// scheme, which causes UIWebView to ignore cookies because\n        // dash-tarix:// URLs aren't really valid. I can't make dash-tarix:// URLs to be valid because I need them to work\n        // like file:// URLs do (i.e. take advantage of relative paths)\n        NSMutableString *content = [[NSMutableString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n        if(content)\n        {\n            [content replaceOccurrencesOfString:@\"localstorageSupport(){return false;\" withString:@\"localstorageSupport(){\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, content.length)];\n            data = (id)[content dataUsingEncoding:NSUTF8StringEncoding];\n        }\n    }\n    \n    if(!data && isHTML)\n    {\n        data = (id)[[NSString stringWithFormat:@\"<html><head><meta name='viewport' content='width=device-width; initial-scale=1.0; user-scalable=1'/><style scoped>body title + .dashErrorDiv {display:none}</style><title>%@</title></head><body style='font-family: Helvetica Neue; font-weight:lighter;-webkit-user-select:none; padding:0px 5px; color:#333333'><div class='dashErrorDiv' style='position:absolute; right:0; left:0; top:0; bottom:0; width:300px; height:100px; margin:auto; text-align:center;'>%@</div></body></html>\", (isTimeout) ? @\"Error Loading\" : @\"Error Loading\", (isTimeout) ? @\"Request timed out.\" : @\"Page not found.\"] dataUsingEncoding:NSUTF8StringEncoding];\n    }\n    return data;\n}\n\n- (void)stopLoading\n{\n\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTocBrowser.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import \"DHWebViewController.h\"\n\n@interface DHTocBrowser : UITableViewController\n\n@property (strong) NSMutableArray *sections;\n@property (strong) NSMutableArray *sectionTitles;\n@property (strong) NSMutableArray *filteredSections;\n@property (strong) NSMutableArray *filteredSectionTitles;\n@property (weak) UISearchDisplayController *searchController;\n@property (assign) IBOutlet UISearchBar *searchBar;\n\n- (IBAction)dismissModal:(id)sender;\n\n@end\n"
  },
  {
    "path": "Dash/DHTocBrowser.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTocBrowser.h\"\n#import \"DHBrowserTableViewCell.h\"\n#import \"DHJavaScript.h\"\n\n#define DHHeaderSeparatorInset 14\n\n@implementation DHTocBrowser\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n    self.clearsSelectionOnViewWillAppear = NO;\n    \n    if(iPad && isRegularHorizontalClass)\n    {\n        self.edgesForExtendedLayout = UIRectEdgeNone;\n    }\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    self.tableView.separatorInset = UIEdgeInsetsMake(0, DHHeaderSeparatorInset, 0, 0);\n    self.tableView.rowHeight = 44;\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.tableView reloadData];\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return self.activeSections.count;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    NSInteger count = [self.activeSections[section] count];\n    return count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@\"DHBrowserCell\" forIndexPath:indexPath];\n    @try {\n        NSDictionary *entry = self.activeSections[indexPath.section][indexPath.row];\n        cell.textLabel.font = [UIFont fontWithName:@\"Menlo\" size:16];\n        cell.textLabel.text = entry[@\"name\"];\n        cell.imageView.image = [UIImage imageNamed:entry[@\"entryType\"]];;\n        cell.accessoryType = (!iPad || !isRegularHorizontalClass) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone;\n        [self highlightCell:cell];\n    }\n    @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n    return cell;\n}\n\n- (void)highlightCell:(DHBrowserTableViewCell *)cell\n{\n    if(!self.searchController.active)\n    {\n        return;\n    }\n    NSRange range;\n    NSInteger offset = 0;\n    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:cell.titleLabel.attributedText];\n    for(NSString *key in [DHDBResult highlightDictionary])\n    {\n        [string removeAttribute:key range:NSMakeRange(0, string.length)];\n    }\n    NSString *substring = [[string string] copy];\n    BOOL didAddAttributes = NO;\n    while((range = [substring rangeOfString:self.searchController.searchBar.text options:NSCaseInsensitiveSearch]).location != NSNotFound)\n    {\n        [string addAttributes:[DHDBResult highlightDictionary] range:NSMakeRange(range.location+offset, range.length)];\n        substring = [substring substringFromDashIndex:range.location+range.length];\n        offset += range.location+range.length;\n        didAddAttributes = YES;\n    }\n    if(didAddAttributes)\n    {\n        cell.titleLabel.attributedText = string;\n    }\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    NSDictionary *entry = self.activeSections[indexPath.section][indexPath.row];\n    NSString *hash = [entry[@\"path\"] stringByReplacingPercentEscapes];\n    \n    DHWebViewController *webViewController = [DHWebViewController sharedWebViewController];\n    webViewController.nextAnchorChangeNotCausedByUserNavigation = YES;\n    webViewController.anchorChangeInProgress = YES;\n    webViewController.ignoreScroll = YES;\n    [webViewController.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@\"if(window.location.hash == \\\"#%@\\\") { window.location.hash = ''; } window.location.hash = \\\"#%@\\\"\", hash, hash]];\n    webViewController.anchorChangeInProgress = NO;\n    webViewController.ignoreScroll = NO;\n    if([DHRemoteServer sharedServer].connectedRemote)\n    {\n        [[DHRemoteServer sharedServer] sendWebViewURL:[webViewController.webView stringByEvaluatingJavaScriptFromString:@\"window.location.href\"]];        \n    }\n    if(!iPad || !isRegularHorizontalClass)\n    {\n        [self performSelector:@selector(dismissModal:) withObject:self afterDelay:0.1f];\n    }\n    else\n    {\n//        if(self.webViewController.navigationController.toolbarHidden)\n//        {\n//            self.webViewController.ignoreScroll = YES;\n//            [self.webViewController.navigationController setToolbarHidden:NO animated:YES];\n//            self.webViewController.ignoreScroll = NO;\n//        }\n    }\n}\n\n- (NSMutableArray *)activeSections\n{\n    return self.searchController. active && self.searchController.searchBar.text.length ? self.filteredSections : self.sections;\n}\n\n- (NSMutableArray *)activeSectionTitles\n{\n    return self.searchController.active && self.searchController.searchBar.text.length ? self.filteredSectionTitles : self.sectionTitles;\n}\n\n- (IBAction)dismissModal:(id)sender\n{\n    [[DHWebViewController sharedWebViewController] removeDashClearedClass];\n    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];\n}\n\n- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView\n{\n    self.searchController = controller;\n    if(isIOS11)\n    {\n        if(@available(iOS 11.0, *))\n        {\n            tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;\n        }\n    }\n    tableView.rowHeight = 44;\n    tableView.separatorInset = UIEdgeInsetsMake(0, DHHeaderSeparatorInset, 0, 0);\n    if(iPad && isRegularHorizontalClass)\n    {\n        tableView.contentInset = UIEdgeInsetsMake(0.0f, 0.f, 0.f, 0.f);\n    }\n    [tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n}\n\n- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString\n{\n    self.filteredSections = [NSMutableArray array];\n    self.filteredSectionTitles = [NSMutableArray array];\n    int i = 0;\n    for(NSArray *section in self.sections)\n    {\n        NSMutableArray *filteredSection = [NSMutableArray array];\n        for(NSDictionary *entry in section)\n        {\n            if([entry[@\"name\"] contains:searchString])\n            {\n                [filteredSection addObject:entry];\n            }\n        }\n        if(filteredSection.count)\n        {\n            [self.filteredSections addObject:filteredSection];\n            [self.filteredSectionTitles addObject:self.sectionTitles[i]];\n        }\n        ++i;\n    }\n    return YES;\n}\n\n- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller\n{\n    [self.tableView deselectAll:NO];\n}\n\n- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section\n{\n    return 22;\n}\n\n- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section\n{\n    return self.activeSectionTitles[section];\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    if(!iPad || !isRegularHorizontalClass)\n    {\n        [self.searchDisplayController setActive:NO animated:NO];\n        [self.presentingViewController dismissViewControllerAnimated:NO completion:nil];        \n    }\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTransferFeed.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHFeed.h\"\n#import \"DHDocset.h\"\n\n@interface DHTransferFeed : DHFeed\n\n@property (strong) DHDocset *docset;\n\n+ (DHTransferFeed *)feedWithPath:(NSString *)path isInstalled:(BOOL)installed;\n- (BOOL)isProperlyInstalled;\n- (void)cancelInstall;\n- (BOOL)loadDocset;\n- (BOOL)refreshIcon;\n\n@end\n"
  },
  {
    "path": "Dash/DHTransferFeed.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTransferFeed.h\"\n#import \"DHDocsetTransferrer.h\"\n\n@implementation DHTransferFeed\n\n+ (DHTransferFeed *)feedWithPath:(NSString *)path isInstalled:(BOOL)installed\n{\n    DHTransferFeed *feed = [[self alloc] init];\n    feed.feedURL = path;\n    feed.feed = [path lastPathComponent];\n    feed.installed = installed;\n    return feed;\n}\n\n- (BOOL)loadDocset\n{\n    self.docset = (self.docset) ? : [DHDocset docsetAtPath:self.feedURL];\n    return self.docset != nil;\n}\n\n- (NSString *)docsetNameWithVersion:(BOOL)withVersion\n{\n    return (self.docset) ? self.docset.name : self.feed;\n}\n\n- (NSString *)sortName\n{\n    return [self docsetNameWithVersion:NO];\n}\n\n- (BOOL)isEqual:(DHFeed *)object\n{\n    return [self.feed isEqualToString:[object feed]];\n}\n\n- (NSString *)uniqueIdentifier // Used to find a corresponding feed from a installed docset\n{\n    return self.feed;\n}\n\n- (UIImage *)icon\n{\n    return (self.docset) ? self.docset.icon : [UIImage imageNamed:@\"Other\"];\n}\n\n- (void)cancelInstall\n{\n    self.installed = NO;\n    self.installing = NO;\n    self.feedResult = nil;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    if(![fileManager fileExistsAtPath:[transfersPath stringByAppendingPathComponent:self.feed]])\n    {\n        [fileManager moveItemAtPath:self.feedURL toPath:[transfersPath stringByAppendingPathComponent:self.feed] error:nil];\n        self.feedURL = [transfersPath stringByAppendingPathComponent:self.feed];\n        self.docset = nil;\n        [self loadDocset];\n    }\n    else\n    {\n        NSString *trashPath = [[DHDocsetTransferrer sharedTransferrer] uniqueTrashPath];\n        [fileManager moveItemAtPath:self.feedURL toPath:trashPath error:nil];\n        dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n        dispatch_async(queue, ^{\n            [[NSFileManager defaultManager] removeItemAtPath:trashPath error:nil];\n        });\n    }\n}\n\n- (BOOL)isProperlyInstalled\n{\n    return [[NSFileManager defaultManager] fileExistsAtPath:[self.feedURL stringByAppendingPathComponent:@\"Contents/Resources/optimisedIndex.dsidx\"]];\n}\n\n- (BOOL)refreshIcon\n{\n    if(![self.docset.hasCustomIcon boolValue])\n    {\n        self.docset.hasCustomIcon = nil;\n        [self.docset grabIcon];\n        return [self.docset.hasCustomIcon boolValue];\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHType.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHType : NSObject {\n    NSString *humanType;\n    NSString *humanTypePlural;\n    NSArray *aliases;\n}\n\n@property (retain) NSString *humanType;\n@property (retain) NSString *humanTypePlural;\n@property (retain) NSArray *aliases;\n\n+ (DHType *)typeWithHumanType:(NSString *)aHumanType humanPlural:(NSString *)aHumanTypePlural aliases:(id)someAliases;\n+ (DHType *)typeWithHumanType:(NSString *)aHumanType humanPlural:(NSString *)aHumanTypePlural;\n\n@end\n"
  },
  {
    "path": "Dash/DHType.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHType.h\"\n\n@implementation DHType\n\n@synthesize humanType;\n@synthesize humanTypePlural;\n@synthesize aliases;\n\n+ (DHType *)typeWithHumanType:(NSString *)aHumanType humanPlural:(NSString *)aHumanTypePlural aliases:(id)someAliases\n{\n    DHType *type = [[DHType alloc] initWithHumanType:aHumanType humanPlural:aHumanTypePlural];\n    [type setAliases:([someAliases isKindOfClass:[NSArray class]]) ? someAliases : @[someAliases]];\n    return type;\n}\n\n+ (DHType *)typeWithHumanType:(NSString *)aHumanType humanPlural:(NSString *)aHumanTypePlural\n{\n    return [[DHType alloc] initWithHumanType:aHumanType humanPlural:aHumanTypePlural];\n}\n\n- (id)initWithHumanType:(NSString *)aHumanType humanPlural:(NSString *)aHumanTypePlural\n{\n    self = [super init];\n    if(self)\n    {\n        self.humanType = aHumanType;\n        self.humanTypePlural = aHumanTypePlural;\n    }\n    return self;\n}\n\n- (NSString *)description\n{\n    return [NSString stringWithFormat:@\"%@ - %@ - %@\", humanType, humanTypePlural, aliases];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTypeBrowser.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHDocsetBrowser.h\"\n#import \"DHDBSearchController.h\"\n\n@interface DHTypeBrowser : UITableViewController <UINavigationControllerDelegate>\n\n@property (strong) DHDocset *docset;\n@property (strong) NSMutableArray *types;\n@property (assign) BOOL isLoading;\n@property (assign) BOOL isEmpty;\n@property (strong) DHDBSearchController *searchController;\n@property (assign) BOOL didFirstLoad;\n@property (assign) BOOL isRestoring;\n@property (assign) BOOL didLoad;\n\n@end\n"
  },
  {
    "path": "Dash/DHTypeBrowser.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTypeBrowser.h\"\n#import \"DHTypes.h\"\n#import \"DHDocsetManager.h\"\n\n@implementation DHTypeBrowser\n\n- (void)viewDidLoad\n{\n    if(!self.docset)\n    {\n        // happens during state restoration\n        return;\n    }\n    [super viewDidLoad];\n    self.clearsSelectionOnViewWillAppear = NO;\n    self.searchController = [DHDBSearchController searchControllerWithDocsets:@[self.docset] typeLimit:nil viewController:self];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enforceSmartTitleBarButton) name:DHSplitViewControllerDidSeparate object:nil];\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(enforceSmartTitleBarButton) name:DHSplitViewControllerDidCollapse object:nil];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHBrowserCell\" bundle:nil] forCellReuseIdentifier:@\"DHBrowserCell\"];\n    [self.tableView registerNib:[UINib nibWithNibName:@\"DHLoadingCell\" bundle:nil] forCellReuseIdentifier:@\"DHLoadingCell\"];\n\n    self.tableView.rowHeight = 44;\n    self.title = self.docset.name;\n    [self enforceSmartTitleBarButton];\n    if(self.isRestoring)\n    {\n        return;\n    }\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    if(!self.didLoad && self.docset)\n    {\n        self.didLoad = YES;\n        if(isRegularHorizontalClass && self.isActive)\n        {\n            [[DHWebViewController sharedWebViewController] loadURL:[self.docset indexFilePath]];\n        }\n        \n        NSString *typesCache = [self.docset.path stringByAppendingPathComponent:@\".types.plist\"];\n        NSDictionary *typesCacheDict = [NSDictionary dictionaryWithContentsOfFile:typesCache];\n        if(([self.docset.path contains:@\"Apple_API_Reference\"] || [self.docset.platform isEqualToString:@\"apple\"]) && typesCacheDict && [typesCacheDict[@\"language\"] integerValue] != [DHAppleActiveLanguage currentLanguage])\n        {\n            typesCacheDict = nil;\n        }\n        if(typesCacheDict && typesCacheDict[@\"types\"] && [typesCacheDict[@\"types\"] isKindOfClass:[NSArray class]] && [typesCacheDict[@\"types\"] count])\n        {\n            self.types = [typesCacheDict[@\"types\"] mutableCopy];\n        }\n        else\n        {\n            self.tableView.allowsSelection = NO;\n            self.isLoading = YES;\n            dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n            dispatch_async(queue, ^{\n                [self.docset executeBlockWithinDocsetDBConnection:^(FMDatabase *db) {\n                    NSMutableArray *types = [NSMutableArray array];\n                    NSMutableDictionary *typesDict = [NSMutableDictionary dictionary];\n                    NSConditionLock *lock = [DHDocset stepLock];\n                    NSString *platform = self.docset.platform;\n                    [lock lockWhenCondition:DHLockAllAllowed];\n                    NSString *query = @\"SELECT type, COUNT(rowid) FROM searchIndex GROUP BY type\";\n                    if([self.docset.platform isEqualToString:@\"apple\"])\n                    {\n                        if([DHAppleActiveLanguage currentLanguage] == DHNewActiveAppleLanguageSwift)\n                        {\n                            query = @\"SELECT type, COUNT(rowid) FROM searchIndex WHERE path NOT LIKE '%<dash_entry_language=objc>%' AND path NOT LIKE '%<dash_entry_language=occ>%' GROUP BY type\";\n                        }\n                        else\n                        {\n                            query = @\"SELECT type, COUNT(rowid) FROM searchIndex WHERE path NOT LIKE '%<dash_entry_language=swift>%' GROUP BY type\";\n                        }\n                    }\n                    FMResultSet *rs = [db executeQuery:query];\n                    BOOL next = [rs next];\n                    [lock unlock];\n                    while(next)\n                    {\n                        NSString *type = [rs stringForColumnIndex:0];\n                        if(type && type.length)\n                        {\n                            NSInteger count = [rs intForColumnIndex:1];\n                            NSString *pluralName = [DHTypes pluralFromEncoded:type];\n                            if([pluralName isEqualToString:@\"Categories\"] && ([platform isEqualToString:@\"python\"] || [platform isEqualToString:@\"flask\"] || [platform isEqualToString:@\"twisted\"] || [platform isEqualToString:@\"django\"] || [platform isEqualToString:@\"actionscript\"] || [platform isEqualToString:@\"nodejs\"]))\n                            {\n                                pluralName = @\"Modules\";\n                            }\n                            \n                            typesDict[type] = @{@\"type\": type, @\"count\": @(count), @\"plural\": pluralName};\n                        }\n                        [lock lockWhenCondition:DHLockAllAllowed];\n                        next = [rs next];\n                        [lock unlock];\n                    }\n                    NSMutableArray *typeOrder = [NSMutableArray arrayWithArray:[[DHTypes sharedTypes] orderedTypes]];\n                    [typeOrder removeObject:@\"Guide\"];\n                    [typeOrder removeObject:@\"Section\"];\n                    [typeOrder removeObject:@\"Sample\"];\n                    [typeOrder removeObject:@\"File\"];\n                    [typeOrder addObject:@\"Guide\"];\n                    [typeOrder addObject:@\"Section\"];\n                    [typeOrder addObject:@\"Sample\"];\n                    [typeOrder addObject:@\"File\"];\n                    if([platform isEqualToString:@\"go\"] || [platform isEqualToString:@\"godoc\"])\n                    {\n                        [typeOrder removeObject:@\"Type\"];\n                        [typeOrder insertObject:@\"Type\" atIndex:0];\n                    }\n                    if([platform isEqualToString:@\"swift\"])\n                    {\n                        [typeOrder removeObject:@\"Type\"];\n                        [typeOrder insertObject:@\"Type\" atIndex:0];\n                    }\n                    for(NSString *key in typeOrder)\n                    {\n                        NSDictionary *type = typesDict[key];\n                        if(type)\n                        {\n                            [types addObject:type];\n                        }\n                    }\n                    dispatch_sync(dispatch_get_main_queue(), ^{\n                        self.isLoading = NO;\n                        self.isEmpty = types.count <= 0;\n                        if(!self.isEmpty)\n                        {\n                            self.tableView.allowsSelection = YES;\n                        }\n                        self.types = types;\n                        NSMutableDictionary *newTypesCacheDict = [@{@\"types\": types} mutableCopy];;\n                        if([self.docset.path contains:@\"Apple_API_Reference.docset\"] || [self.docset.platform isEqualToString:@\"apple\"])\n                        {\n                            newTypesCacheDict[@\"language\"] = @([DHAppleActiveLanguage currentLanguage]);\n                        }\n                        [newTypesCacheDict writeToFile:typesCache atomically:NO];\n                        [self.tableView reloadData];\n                    });\n                } readOnly:YES lockCondition:DHLockAllAllowed optimisedIndex:YES];\n            });\n        }\n    }\n    [self.tableView deselectAll:YES];\n    [self.searchController viewWillAppear];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    [self.searchController traitCollectionDidChange:previousTraitCollection];\n    [self enforceSmartTitleBarButton];\n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [self.searchController viewWillDisappear];\n}\n\n- (void)viewDidDisappear:(BOOL)animated\n{\n    [super viewDidDisappear:animated];\n    [self.searchController viewDidDisappear];\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    [self.searchController viewDidAppear];\n}\n\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView\n{\n    return 1;\n}\n\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section\n{\n    if(self.isLoading || self.isEmpty)\n    {\n        return 3;\n    }\n    NSInteger count = self.types.count;\n    return count;\n}\n\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    DHBrowserTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:(self.isLoading || self.isEmpty) ? @\"DHLoadingCell\" : @\"DHBrowserCell\" forIndexPath:indexPath];\n    \n    if((self.isLoading || self.isEmpty) && indexPath.row == 2)\n    {\n        cell.userInteractionEnabled = NO;\n        NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy];\n        [paragraph setAlignment:NSTextAlignmentCenter];\n        UIFont *font = [UIFont boldSystemFontOfSize:20];\n        cell.textLabel.attributedText = [[NSAttributedString alloc] initWithString:(self.isEmpty) ? @\"Empty Docset\" : @\"Loading...\" attributes:@{NSParagraphStyleAttributeName : paragraph, NSForegroundColorAttributeName: [UIColor colorWithWhite:0.8 alpha:1], NSFontAttributeName: font}];\n    }\n    else if(self.isLoading || self.isEmpty)\n    {\n        cell.userInteractionEnabled = NO;\n        cell.textLabel.text = @\"\";\n    }\n    else\n    {\n        cell.userInteractionEnabled = YES;\n        NSDictionary *type = self.types[indexPath.row];\n        cell.textLabel.text = type[@\"plural\"];\n        [cell.titleLabel setRightDetailText:[type[@\"count\"] stringValue] adjustMainWidth:YES];\n        cell.imageView.image = [UIImage imageNamed:type[@\"type\"]];;\n        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;        \n    }\n    return cell;\n}\n\n- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath\n{\n    [self performSegueWithIdentifier:@\"DHEntryBrowserSegue\" sender:self];\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    if([[segue identifier] isEqualToString:@\"DHEntryBrowserSegue\"])\n    {\n        id entryBrowser = [segue destinationViewController];\n        [entryBrowser setDocset:self.docset];\n        NSDictionary *selectedType = self.types[self.tableView.indexPathForSelectedRow.row];\n        [entryBrowser setType:selectedType[@\"type\"]];\n        [entryBrowser setTitle:selectedType[@\"plural\"]];\n    }\n    else if([[segue identifier] isEqualToString:@\"DHShowIndexPageSegue\"])\n    {\n        DHWebViewController *webViewController = [segue destinationViewController];\n        webViewController.urlToLoad = [self.docset indexFilePath];\n    }\n    else\n    {\n        [self.searchController prepareForSegue:segue sender:sender];\n    }\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    [self.searchDisplayController setActive:NO animated:NO];\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [self.searchController encodeRestorableStateWithCoder:coder];\n    [coder encodeObject:self.docset.relativePath forKey:@\"docsetRelativePath\"];\n    [coder encodeObject:self.types forKey:@\"types\"];\n    [super encodeRestorableStateWithCoder:coder];\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    NSString *docsetRelativePath = [coder decodeObjectForKey:@\"docsetRelativePath\"];\n    self.docset = [[DHDocsetManager sharedManager] docsetWithRelativePath:docsetRelativePath];\n    self.isRestoring = YES;\n    [self viewDidLoad];\n    self.isRestoring = NO;\n    self.types = [coder decodeObjectForKey:@\"types\"];\n    [self.searchController decodeRestorableStateWithCoder:coder];\n    [super decodeRestorableStateWithCoder:coder];\n}\n\n- (void)enforceSmartTitleBarButton\n{\n    if(isRegularHorizontalClass)\n    {\n        if(self.navigationItem.titleView)\n        {\n            self.navigationItem.titleView = nil;\n            self.title = self.docset.name;\n        }\n    }\n    else if(!self.navigationItem.titleView && ![[self.docset indexFilePath] isCaseInsensitiveEqual:[[NSBundle mainBundle] pathForResource:@\"home\" ofType:@\"html\"]] && [DHDocsetBrowser titleBarItemAttributedStringTemplate])\n    {\n        @try {\n            UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];\n            NSMutableAttributedString *title = [[DHDocsetBrowser titleBarItemAttributedStringTemplate] mutableCopy];\n            [title.mutableString setString:[NSString stringWithFormat:@\"%@  \", self.docset.name]];\n            [title addAttributes:@{NSForegroundColorAttributeName: [UIColor lightGrayColor], NSFontAttributeName: [UIFont fontWithName:@\"Ionicons\" size:20]} range:NSMakeRange(title.mutableString.length-1, 1)];\n            if(isIOS11)\n            {\n                [title addAttributes:@{NSBaselineOffsetAttributeName: @(2)} range:NSMakeRange(0, title.mutableString.length-2)];\n            }\n            else\n            {\n                [title addAttributes:@{NSBaselineOffsetAttributeName: @(-2)} range:NSMakeRange(title.mutableString.length-1, 1)];\n            }\n            [button setAttributedTitle:title forState:UIControlStateNormal];\n            [button addTarget:self action:@selector(smartTitleBarButtonPressed:) forControlEvents:UIControlEventTouchUpInside];\n            self.navigationItem.titleView = button;\n        }\n        @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n    }\n}\n\n- (void)smartTitleBarButtonPressed:(id)sender\n{\n    [[DHWebViewController sharedWebViewController] loadURL:[self.docset indexFilePath]];\n    [self performSegueWithIdentifier:@\"DHShowIndexPageSegue\" sender:self];\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHTypes.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHTypes : NSObject {\n    NSMutableArray *orderedTypeObjects;\n    NSMutableArray *orderedTypes;\n    NSMutableDictionary *encodedToSingular;\n    NSMutableDictionary *encodedToPlural;\n    NSMutableArray *orderedHeaders;\n}\n\n@property (retain) NSMutableArray *orderedTypeObjects;\n@property (retain) NSMutableArray *orderedTypes;\n@property (retain) NSMutableDictionary *encodedToSingular;\n@property (retain) NSMutableDictionary *encodedToPlural;\n@property (retain) NSMutableArray *orderedHeaders;\n\n+ (DHTypes *)sharedTypes;\n+ (NSString *)singularFromEncoded:(NSString *)encodedType notFoundReturn:(NSString *)notFound;\n+ (NSString *)pluralFromEncoded:(NSString *)encodedType;\n- (NSString *)typeFromScalaType:(NSString*)scalaType;\n- (NSString *)unifiedSQLiteOrder:(BOOL)isDashDocset platform:(NSString *)platform;\n\n@end"
  },
  {
    "path": "Dash/DHTypes.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHTypes.h\"\n#import \"DHType.h\"\n\n@implementation DHTypes\n\nstatic DHTypes *_types = nil;\n\n@synthesize orderedTypeObjects;\n@synthesize orderedTypes;\n@synthesize encodedToSingular;\n@synthesize encodedToPlural;\n@synthesize orderedHeaders;\n\n+ (DHTypes *)sharedTypes\n{\n    @synchronized([DHTypes class])\n\t{\n\t\tif(!_types)\n\t\t{\n\t\t\t_types = [[DHTypes alloc] init];\n            [_types setUp];\n\t\t}\n\t}\n\treturn _types;\n}\n\n- (void)setUp\n{\n    self.orderedTypeObjects = [NSMutableArray array];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Snippet\" humanPlural:@\"Snippets\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Class\" humanPlural:@\"Classes\" aliases:@[@\"cl\", @\"tmplt\", @\"specialization\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"_Struct\" humanPlural:@\"_Structs\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Tag\" humanPlural:@\"Tags\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Trait\" humanPlural:@\"Traits\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Database\" humanPlural:@\"Databases\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Protocol\" humanPlural:@\"Protocols\" aliases:@\"intf\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Delegate\" humanPlural:@\"Delegates\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Interface\" humanPlural:@\"Interfaces\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Template\" humanPlural:@\"Templates\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Indirection\" humanPlural:@\"Indirections\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Object\" humanPlural:@\"Objects\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Schema\" humanPlural:@\"Schemas\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Category\" humanPlural:@\"Categories\" aliases:@[@\"cat\", @\"Groups\", @\"Pages\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Collection\" humanPlural:@\"Collections\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Framework\" humanPlural:@\"Frameworks\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Module\" humanPlural:@\"Modules\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Library\" humanPlural:@\"Libraries\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Namespace\" humanPlural:@\"Namespaces\" aliases:@\"ns\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Package\" humanPlural:@\"Packages\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Exception\" humanPlural:@\"Exceptions\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Struct\" humanPlural:@\"Structs\" aliases:@[@\"Data Structures\", @\"struct\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Type\" humanPlural:@\"Types\" aliases:@[@\"tag\", @\"tdef\", @\"Public Types\", @\"Protected Types\", @\"Private Types\", @\"Typedefs\", @\"Package Types\", @\"Data Types\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Diagram\" humanPlural:@\"Diagrams\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Table\" humanPlural:@\"Tables\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Query\" humanPlural:@\"Queries\"]];\n\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Component\" humanPlural:@\"Components\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Constructor\" humanPlural:@\"Constructors\" aliases:@[@\"Public Constructors\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Element\" humanPlural:@\"Elements\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Resource\" humanPlural:@\"Resources\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Directive\" humanPlural:@\"Directives\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Extension\" humanPlural:@\"Extensions\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Plugin\" humanPlural:@\"Plugins\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Filter\" humanPlural:@\"Filters\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Service\" humanPlural:@\"Services\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Provider\" humanPlural:@\"Providers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Decorator\" humanPlural:@\"Decorators\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Method\" humanPlural:@\"Methods\" aliases:@[@\"instm\", @\"intfm\", @\"clm\", @\"intfcm\", @\"Class Methods\", @\"Instance Methods\", @\"Public Methods\", @\"Inherited Methods\", @\"Private Methods\", @\"Protected Methods\", @\"instctr\", @\"intfctr\", @\"enumm\", @\"intfsub\", @\"enumcm\", @\"structctr\", @\"structcm\", @\"enumctr\", @\"instsub\", @\"structsub\", @\"structm\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Property\" humanPlural:@\"Properties\" aliases:@[@\"intfp\", @\"instp\", @\"Protected Properties\", @\"Public Properties\", @\"Inherited Properties\", @\"Private Properties\", @\"structp\", @\"enump\", @\"intfdata\", @\"cldata\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Field\" humanPlural:@\"Fields\" aliases:@[@\"Data Fields\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Attribute\" humanPlural:@\"Attributes\" aliases:@[@\"XML Attributes\", @\"Public Attributes\", @\"Static Public Attributes\", @\"Protected Attributes\", @\"Static Protected Attributes\", @\"Private Attributes\", @\"Static Private Attributes\", @\"Package Attributes\", @\"Static Package Attributes\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Index\" humanPlural:@\"Indexes\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Mixin\" humanPlural:@\"Mixins\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Event\" humanPlural:@\"Events\" aliases:@[@\"event\", @\"Public Events\", @\"Inherited Events\", @\"Private Events\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Binding\" humanPlural:@\"Bindings\" aliases:@\"binding\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Foreign Key\" humanPlural:@\"Foreign Keys\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"View\" humanPlural:@\"Views\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Special Form\" humanPlural:@\"Special Forms\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Record\" humanPlural:@\"Records\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Report\" humanPlural:@\"Reports\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Modifier\" humanPlural:@\"Modifiers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Shortcut\" humanPlural:@\"Shortcuts\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Trigger\" humanPlural:@\"Triggers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Helper\" humanPlural:@\"Helpers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Pipe\" humanPlural:@\"Pipes\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Relationship\" humanPlural:@\"Relationships\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Column\" humanPlural:@\"Columns\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Function\" humanPlural:@\"Functions\" aliases:@[@\"func\", @\"ffunc\", @\"signal\", @\"slot\", @\"dcop\", @\"Public Member Functions\", @\"Static Public Member Functions\", @\"Protected Member Functions\", @\"Static Protected Member Functions\", @\"Private Member Functions\", @\"Static Private Member Functions\", @\"Package Functions\", @\"Static Package Functions\", @\"Functions/Subroutines\", @\"Function Prototypes\", @\"Public Slots\", @\"Signals\", @\"Protected Slots\", @\"Private Slots\", @\"Members\", @\"grammar\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Expression\" humanPlural:@\"Expressions\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Hook\" humanPlural:@\"Hooks\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Procedure\" humanPlural:@\"Procedures\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Subroutine\" humanPlural:@\"Subroutines\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Builtin\" humanPlural:@\"Builtins\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Word\" humanPlural:@\"Words\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Callback\" humanPlural:@\"Callbacks\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Handler\" humanPlural:@\"Handlers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Control Structure\" humanPlural:@\"Control Structures\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Annotation\" humanPlural:@\"Annotations\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"File\" humanPlural:@\"Files\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Error\" humanPlural:@\"Errors\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Enum\" humanPlural:@\"Enums\" aliases:@[@\"Enumerations\", @\"enum\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Tactic\" humanPlural:@\"Tactics\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Environment\" humanPlural:@\"Environments\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Command\" humanPlural:@\"Commands\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Provisioner\" humanPlural:@\"Provisioners\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Axiom\" humanPlural:@\"Axioms\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Lemma\" humanPlural:@\"Lemmas\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Inductive\" humanPlural:@\"Inductives\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Instance\" humanPlural:@\"Instances\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Global\" humanPlural:@\"Globals\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Union\" humanPlural:@\"Unions\" aliases:@[@\"union\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Variable\" humanPlural:@\"Variables\" aliases:@[@\"var\", @\"Class Variable\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Member\" humanPlural:@\"Members\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Block\" humanPlural:@\"Blocks\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Constant\" humanPlural:@\"Constants\" aliases:@[@\"clconst\", @\"econst\", @\"data\", @\"Notifications\", @\"enumelt\", @\"structdata\", @\"enumdata\", @\"writerid\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Macro\" humanPlural:@\"Macros\" aliases:@\"macro\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Value\" humanPlural:@\"Values\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Variant\" humanPlural:@\"Variants\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Define\" humanPlural:@\"Defines\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Iterator\" humanPlural:@\"Iterators\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Literal\" humanPlural:@\"Literals\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Widget\" humanPlural:@\"Widgets\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Keyword\" humanPlural:@\"Keywords\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Instruction\" humanPlural:@\"Instructions\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Request\" humanPlural:@\"Requests\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Message\" humanPlural:@\"Messages\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Option\" humanPlural:@\"Options\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Setting\" humanPlural:@\"Settings\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Style\" humanPlural:@\"Styles\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Script\" humanPlural:@\"Scripts\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Notation\" humanPlural:@\"Notations\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Abbreviation\" humanPlural:@\"Abbreviations\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Projection\" humanPlural:@\"Projection\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Parameter\" humanPlural:@\"Parameters\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Syntax\" humanPlural:@\"Syntaxes\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Signature\" humanPlural:@\"Signatures\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Conversion\" humanPlural:@\"Conversions\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Pattern\" humanPlural:@\"Patterns\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Test\" humanPlural:@\"Tests\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Operator\" humanPlural:@\"Operators\" aliases:@[@\"opfunc\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Statement\" humanPlural:@\"Statements\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Role\" humanPlural:@\"Roles\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Register\" humanPlural:@\"Registers\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"State\" humanPlural:@\"States\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Alias\" humanPlural:@\"Aliases\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Device\" humanPlural:@\"Devices\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Kind\" humanPlural:@\"Kinds\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Node\" humanPlural:@\"Nodes\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Flag\" humanPlural:@\"Flags\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Sender\" humanPlural:@\"Senders\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Data Source\" humanPlural:@\"Data Sources\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Reference\" humanPlural:@\"References\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Guide\" humanPlural:@\"Guides\" aliases:@[@\"doc\"]]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Sample\" humanPlural:@\"Samples\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Section\" humanPlural:@\"Sections\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Entry\" humanPlural:@\"Entries\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Glossary\" humanPlural:@\"Glossaries\"]];\n    [orderedTypeObjects addObject:[DHType typeWithHumanType:@\"Unknown\" humanPlural:@\"Unknown\"]];\n    self.orderedTypes = [NSMutableArray array];\n    self.encodedToSingular = [NSMutableDictionary dictionary];\n    self.encodedToPlural = [NSMutableDictionary dictionary];\n    self.orderedHeaders = [NSMutableArray array];\n    for(DHType *type in orderedTypeObjects)\n    {\n        [orderedTypes addObject:type.humanType];\n        encodedToSingular[type.humanType] = type.humanType;\n        encodedToSingular[type.humanTypePlural] = type.humanType;\n        encodedToPlural[type.humanType] = type.humanTypePlural;\n        [orderedHeaders addObject:type.humanTypePlural];\n        for(NSString *alias in type.aliases)\n        {\n            encodedToSingular[alias] = type.humanType;\n            encodedToPlural[alias] = type.humanTypePlural;\n            [orderedHeaders addObject:alias];\n        }\n    }\n    [orderedHeaders addObject:@\"See also\"];\n}\n\n+ (NSString *)singularFromEncoded:(NSString *)encodedType notFoundReturn:(NSString *)notFound\n{\n    NSString *singular = [[DHTypes sharedTypes] encodedToSingular][encodedType];\n    if(!singular)\n    {\n        return notFound;\n    }\n    return singular;\n}\n\n+ (NSString *)pluralFromEncoded:(NSString *)encodedType\n{\n    if([encodedType isEqualToString:@\"_Struct\"])\n    {\n        return @\"Structs\";\n    }\n    if([encodedType isEqualToString:@\"_Type\"])\n    {\n        return @\"Types\";\n    }\n    NSString *plural = [[DHTypes sharedTypes] encodedToPlural][encodedType];\n    if(!plural)\n    {\n        return @\"Unknown\";\n    }\n    return plural;\n}\n\n- (NSString *)typeFromScalaType:(NSString*)scalaType\n{\n    if([scalaType hasSuffix:@\"new\"])\n    {\n        return @\"Constructor\";\n    }\n    else if([scalaType hasSuffix:@\"def\"])\n    {\n        return @\"Function\";\n    }\n    else if([scalaType hasSuffix:@\"val\"])\n    {\n        return @\"Constant\";\n    }\n    else if([scalaType hasSuffix:@\"var\"])\n    {\n        return @\"Variable\";\n    }\n    else if([scalaType hasSuffix:@\"trait\"])\n    {\n        return @\"Trait\";\n    }\n    else if([scalaType hasSuffix:@\"class\"])\n    {\n        return @\"Class\";\n    }\n    else if([scalaType hasSuffix:@\"type\"])\n    {\n        return @\"Type\";\n    }\n    else if([scalaType hasSuffix:@\"object\"])\n    {\n        return @\"Object\";\n    }\n    else if([scalaType hasSuffix:@\"package\"])\n    {\n        return @\"Package\";\n    }\n    return nil;\n}\n\n- (NSString *)unifiedSQLiteOrder:(BOOL)isDashDocset platform:(NSString *)platform\n{\n    BOOL isPHP = [platform isEqualToString:@\"php\"];\n    BOOL isSwift = [platform isEqualToString:@\"swift\"];\n    BOOL isGo = [platform isEqualToString:@\"go\"] || [platform isEqualToString:@\"godoc\"];\n    NSMutableString *query = [NSMutableString stringWithString:@\"ORDER BY (CASE \"];\n    NSUInteger count = 1;\n    NSMutableArray *arrayToUse = (isPHP || isGo || isSwift) ? [NSMutableArray arrayWithArray:self.orderedTypeObjects] : self.orderedTypeObjects;\n    if(isPHP)\n    {\n        for(DHType *type in [NSArray arrayWithArray:arrayToUse])\n        {\n            if([type.humanType isEqualToString:@\"Function\"])\n            {\n                [arrayToUse removeObjectIdenticalTo:type];\n                [arrayToUse insertObject:type atIndex:0];\n                break;\n            }\n        }\n    }\n    if(isGo)\n    {\n        for(DHType *type in [NSArray arrayWithArray:arrayToUse])\n        {\n            if([type.humanType isEqualToString:@\"Type\"])\n            {\n                [arrayToUse removeObjectIdenticalTo:type];\n                [arrayToUse insertObject:type atIndex:0];\n                break;\n            }\n        }\n    }\n    if(isSwift)\n    {\n        for(DHType *type in [NSArray arrayWithArray:arrayToUse])\n        {\n            if([type.humanType isEqualToString:@\"Type\"])\n            {\n                [arrayToUse removeObjectIdenticalTo:type];\n                [arrayToUse insertObject:type atIndex:0];\n                break;\n            }\n        }\n    }\n    for(DHType *type in arrayToUse)\n    {\n        NSMutableArray *toAppend = [NSMutableArray array];\n        [toAppend addObject:type.humanType];\n        for(NSString *alias in type.aliases)\n        {\n            [toAppend addObject:alias];\n        }\n        for(NSString *append in toAppend)\n        {\n            [query appendFormat:(isDashDocset) ? @\"WHEN type = '%@' THEN %ld \" : @\"WHEN ty.ZTYPENAME = '%@' THEN %ld \", append, (unsigned long)count];\n        }\n        ++count;\n    }\n    [query appendFormat:@\"ELSE %ld END)\", (unsigned long)count];\n    [query appendString:(isDashDocset) ? @\", LENGTH(name) ASC;\" : @\", LENGTH(t.ZTOKENNAME) ASC;\"];\n    return query;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHUnarchiver.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface DHUnarchiver : NSObject\n\n+ (BOOL)unpackTarixDocset:(NSString *)path tarixPath:(NSString *)tarixPath delegate:(id)delegate;\n+ (BOOL)unarchiveArchive:(NSString *)path delegate:(id)delegate;\n+ (NSMutableData *)tarixReadFile:(NSString *)file toFile:(NSString *)outputPath;\n+ (NSMutableData *)tarixReadArchive:(NSString *)archive blockNum:(unsigned long)blocknum offset:(off_t)offset blockLength:(unsigned long)blocklength toFile:(NSString *)outputPath;\n\n@end\n"
  },
  {
    "path": "Dash/DHUnarchiver.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHUnarchiver.h\"\n#import \"archive.h\"\n#import \"archive_entry.h\"\n#import \"zlib.h\"\n\n@implementation DHUnarchiver\n\n+ (BOOL)unpackTarixDocset:(NSString *)archivePath tarixPath:(NSString *)tarixPath delegate:(id)delegate\n{\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *folder = [tarixPath stringByDeletingLastPathComponent];\n    BOOL success = NO;\n    FMDatabase *db = [FMDatabase databaseWithPath:tarixPath];\n    if([db openWithFlags:SQLITE_OPEN_READONLY])\n    {\n        FMResultSet *rs = [db executeQuery:@\"SELECT * FROM toextract\"];\n        while([rs next])\n        {\n            success = YES;\n            NSString *path = [rs stringForColumnIndex:0];\n            NSString *hash = [rs stringForColumnIndex:1];\n            NSString *fullPath = [folder stringByAppendingPathComponent:path];\n            NSString *blockNumString = [hash substringToString:@\" \"];\n            NSInteger blockNum = [blockNumString integerValue];\n            hash = [hash substringFromString:@\" \"];\n            NSString *offsetString = [hash substringToString:@\" \"];\n            NSInteger offset = [offsetString integerValue];\n            hash = [hash substringFromString:@\" \"];\n            NSString *blockLengthString = [hash substringToString:@\" \"];\n            NSInteger blockLength = [blockLengthString integerValue];\n\n            [fileManager createDirectoryAtPath:[fullPath stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:nil];\n            if(![self tarixReadArchive:archivePath blockNum:blockNum offset:offset blockLength:blockLength toFile:fullPath])\n            {\n                success = NO;\n                break;\n            }\n            if([delegate isCancelled])\n            {\n                success = NO;\n                break;\n            }\n        }\n    }\n    [db close];\n    return success;\n}\n\n+ (BOOL)unarchiveArchive:(NSString *)path delegate:(id)delegate\n{\n    [delegate setRightDetail:@\"Extracting...\"];\n    chdir([[path stringByDeletingLastPathComponent] UTF8String]);\n    if(extract([[path lastPathComponent] UTF8String], delegate) == 0)\n    {\n        return YES;\n    }\n    return NO;\n}\n\n// Only call this *after* the docset has been installed\n+ (NSMutableData *)tarixReadFile:(NSString *)file toFile:(NSString *)outputPath\n{\n    NSString *hash = [DHTarixIndex hashForFile:file];\n    if(hash)\n    {\n        NSArray *hashComponents = [hash componentsSeparatedByString:@\" \"];\n        if(hash && hashComponents.count == 3)\n        {\n            long long blockNum = [hashComponents[0] longLongValue];\n            long long offset = [hashComponents[1] longLongValue];\n            long long blockLength = [hashComponents[2] longLongValue];\n            NSString *archivePath = [[file substringToString:@\".docset/Contents/Resources/\"] stringByAppendingString:@\".docset/Contents/Resources/tarix.tgz\"];\n            return [DHUnarchiver tarixReadArchive:archivePath blockNum:(unsigned long)blockNum offset:offset blockLength:(unsigned long)blockLength toFile:outputPath];\n        }\n    }\n    return nil;\n}\n\n// Order in tarix file is 0 (file) or 5 (folder), blocknum, offset, blocklength\n+ (NSMutableData *)tarixReadArchive:(NSString *)archive blockNum:(unsigned long)blockNum offset:(off_t)offset blockLength:(unsigned long)blockLength toFile:(NSString *)outputPath\n{\n    NSString *tarPath = [outputPath stringByAppendingString:@\".tar\"];\n    NSOutputStream *stream = (tarPath) ? [NSOutputStream outputStreamToFileAtPath:tarPath append:NO] : nil;\n    [stream open];\n    NSMutableData *data = [[NSMutableData alloc] init];\n    int tarFile = open([archive UTF8String], O_RDONLY);\n    if(tarFile < 0)\n    {\n        NSLog(@\"Couldn't open tarfile\");\n        return nil;\n    }\n    Bytef *inBuffer = nil;\n    Bytef *outBuffer = nil;\n    z_streamp zlibStream = calloc(1, sizeof(z_stream));\n    @try {\n        if(inflateInit2(zlibStream, -MAX_WBITS) != Z_OK)\n        {\n            NSLog(@\"Couldn't init zlib stream\");\n            return nil;\n        }\n        if(lseek(tarFile, offset, SEEK_SET) < 0)\n        {\n            NSLog(@\"Couldn't seek tarfile\");\n            return nil;\n        }\n        int blockSize = 512;\n        inBuffer = malloc(blockSize*20);\n        outBuffer = malloc(blockSize*20);\n        NSInteger totalSizeRemaining = blockLength*blockSize;\n        for(NSUInteger i = 0; i < blockLength && totalSizeRemaining > 0; i += 20)\n        {\n            zlibStream->next_in = inBuffer;\n            NSInteger inLength = read(tarFile, inBuffer, (blockLength-i<20) ? blockSize*(blockLength-i) : blockSize*20);\n            if(inLength < 0)\n            {\n                NSLog(@\"Error reading tarfile\");\n                return nil;\n            }\n            zlibStream->avail_in = (uint)inLength;\n            while(zlibStream->avail_in > 0 && totalSizeRemaining > 0)\n            {\n                zlibStream->next_out = outBuffer;\n                zlibStream->avail_out = blockSize*20;\n                int status = inflate(zlibStream, Z_SYNC_FLUSH);\n                if(status != Z_OK && status != Z_STREAM_END)\n                {\n                    NSLog(@\"Error inflating buffer\");\n                    return nil;\n                }\n                NSUInteger outLength = blockSize*20-zlibStream->avail_out;\n                if(outLength > totalSizeRemaining)\n                {\n                    outLength = totalSizeRemaining;\n                    totalSizeRemaining = 0;\n                }\n                totalSizeRemaining -= outLength;\n                if(!stream)\n                {\n                    [data appendBytes:outBuffer length:outLength];\n                }\n                else\n                {\n                    [stream write:outBuffer maxLength:outLength];\n                }\n            }\n        }\n    }\n    @finally {\n        free(inBuffer);\n        free(outBuffer);\n        deflateEnd(zlibStream);\n        free(zlibStream);\n        close(tarFile);\n        [stream close];\n    }\n    \n    if(tarPath)\n    {\n        BOOL success = extract_single_file([tarPath UTF8String], outputPath) == 0;\n        [[NSFileManager defaultManager] removeItemAtPath:tarPath error:nil];\n        if(!success)\n        {\n            [[NSFileManager defaultManager] removeItemAtPath:outputPath error:nil];\n        }\n        return (success) ? data : nil;\n    }\n    return extract_from_memory([data bytes], data.length);\n}\n\nstatic int copy_data(struct archive *ar, struct archive *aw)\n{\n    int r;\n    const void *buff;\n    size_t size;\n    off_t offset;\n    \n    for (;;) {\n        r = tk_archive_read_data_block(ar, &buff, &size, &offset);\n        if (r == tk_archive_EOF)\n            return (tk_archive_OK);\n        if (r < tk_archive_OK)\n            return (r);\n        r = (int)tk_archive_write_data_block(aw, buff, size, offset);\n        if (r < tk_archive_OK) {\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(aw));\n            return (r);\n        }\n    }\n}\n\noff_t fsize(const char *filename) {\n    struct stat st;\n    \n    if (stat(filename, &st) == 0)\n        return st.st_size;\n    \n    return -1;\n}\n\nNSMutableData * extract_from_memory(const void * buff, size_t size)\n{\n    NSMutableData *data = [[NSMutableData alloc] init];\n    struct archive *a;\n    struct tk_archive_entry *entry;\n    int r;\n    \n    a = tk_archive_read_new();\n    tk_archive_read_support_format_tar(a);\n    tk_archive_read_support_compression_none(a);\n    \n    if ((r = tk_archive_read_open_memory(a, (void*)buff, size)))\n    {\n        data = nil;\n        goto cleanup;\n    }\n    for (;;) {\n        r = tk_archive_read_next_header(a, &entry);\n        if (r == tk_archive_EOF)\n            break;\n        if (r < tk_archive_OK)\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(a));\n        if (r < tk_archive_WARN)\n        {\n            data = nil;\n            goto cleanup;\n        }\n        if (tk_archive_entry_size(entry) > 0) {\n            const void *readBuff;\n            size_t readSize;\n            off_t offset;\n            \n            for (;;) {\n                r = tk_archive_read_data_block(a, &readBuff, &readSize, &offset);\n                if (r == tk_archive_EOF)\n                    break;\n                if (r < tk_archive_OK)\n                    break;\n                [data appendBytes:readBuff length:readSize];\n            }\n            \n            if (r < tk_archive_WARN)\n            {\n                data = nil;\n                goto cleanup;\n            }\n        }\n        if (r < tk_archive_WARN)\n        {\n            data = nil;\n            goto cleanup;\n        }\n    }\ncleanup:\n    tk_archive_read_close(a);\n    tk_archive_read_finish(a);\n    return data;\n}\n\nstatic int extract_single_file(const char *filename, NSString *output_file)\n{\n    NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:output_file append:NO];\n    [stream open];\n    \n    struct archive *a;\n    struct tk_archive_entry *entry;\n    int r = 0;\n    int ret = 0;\n    \n    a = tk_archive_read_new();\n    tk_archive_read_support_format_tar(a);\n    tk_archive_read_support_compression_none(a);\n    \n    if ((r = tk_archive_read_open_filename(a, filename, 10240)))\n    {\n        ret = 1;\n        goto cleanup;\n    }\n    for (;;) {\n        r = tk_archive_read_next_header(a, &entry);\n        if (r == tk_archive_EOF)\n            break;\n        if (r < tk_archive_OK)\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(a));\n        if (r < tk_archive_WARN)\n        {\n            ret = 1;\n            goto cleanup;\n        }\n        if (tk_archive_entry_size(entry) > 0) {\n            const void *buff;\n            size_t size;\n            off_t offset;\n            \n            for (;;) {\n                r = tk_archive_read_data_block(a, &buff, &size, &offset);\n                if (r == tk_archive_EOF)\n                    break;\n                if (r < tk_archive_OK)\n                    break;\n                [stream write:buff maxLength:size];\n            }\n            \n            if (r < tk_archive_WARN)\n            {\n                ret = 1;\n                goto cleanup;\n            }\n        }\n        if (r < tk_archive_WARN)\n        {\n            ret = 1;\n            goto cleanup;\n        }\n    }\ncleanup:\n    tk_archive_read_close(a);\n    tk_archive_read_finish(a);\n    [stream close];\n    return ret;\n}\n\nstatic int extract(const char *filename, id delegate)\n{\n    struct archive *a;\n    struct archive *ext;\n    struct tk_archive_entry *entry;\n    int flags;\n    int r;\n    \n    flags = tk_archive_EXTRACT_TIME;\n    flags |= tk_archive_EXTRACT_PERM;\n    flags |= tk_archive_EXTRACT_ACL;\n    flags |= tk_archive_EXTRACT_FFLAGS;\n    \n    a = tk_archive_read_new();\n    tk_archive_read_support_format_all(a);\n    tk_archive_read_support_compression_all(a);\n    \n    ext = tk_archive_write_disk_new();\n    tk_archive_write_disk_set_options(ext, flags);\n    tk_archive_write_disk_set_standard_lookup(ext);\n    int ret = 0;\n    if ((r = tk_archive_read_open_filename(a, filename, 10240)))\n    {\n        ret = 1;\n        goto cleanup;\n    }\n    off_t total = fsize(filename);\n    __LA_INT64_T previousProgress = 0;\n    double lastPercent = 0;\n    for (;;) {\n        if(total > 0)\n        {\n            __LA_INT64_T progress = tk_archive_position_compressed(a);\n            if(previousProgress != progress)\n            {\n                double currentPercent = (double)progress/total;\n                double delta = currentPercent - lastPercent;\n                if(delta > 0.005f || delta < -0.005f || progress == total)\n                {\n                    lastPercent = currentPercent;\n                    [delegate setUnarchiveProgress:currentPercent];\n                }\n                \n            }\n            previousProgress = progress;\n        }\n        if([delegate isCancelled])\n        {\n            goto cleanup;\n        }\n        \n        r = tk_archive_read_next_header(a, &entry);\n        if (r == tk_archive_EOF)\n            break;\n        if (r < tk_archive_OK)\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(a));\n        if (r < tk_archive_WARN)\n        {\n            ret = 1;\n            goto cleanup;\n        }\n        r = tk_archive_write_header(ext, entry);\n        if (r < tk_archive_OK)\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(ext));\n        else if (tk_archive_entry_size(entry) > 0) {\n            r = copy_data(a, ext);\n            if (r < tk_archive_OK)\n                fprintf(stderr, \"%s\\n\", tk_archive_error_string(ext));\n            if (r < tk_archive_WARN)\n            {\n                ret = 1;\n                goto cleanup;\n            }\n        }\n        r = tk_archive_write_finish_entry(ext);\n        if (r < tk_archive_OK)\n            fprintf(stderr, \"%s\\n\", tk_archive_error_string(ext));\n        if (r < tk_archive_WARN)\n        {\n            ret = 1;\n            goto cleanup;\n        }\n    }\ncleanup:\n    tk_archive_read_close(a);\n    tk_archive_read_finish(a);\n    tk_archive_write_close(ext);\n    tk_archive_write_finish(ext);\n    return ret;\n}\n\n- (void)setUnarchiveProgress:(double)progress\n{\n    \n}\n\n- (void)setRightDetail:(NSString *)detail\n{\n    \n}\n\n- (BOOL)isCancelled\n{\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHUserRepo.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHRepo.h\"\n\n@interface DHUserRepo : DHRepo\n\n@property (strong) NSDate *lastListLoad;\n\n+ (instancetype)sharedUserRepo;\n\n@end\n"
  },
  {
    "path": "Dash/DHUserRepo.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHUserRepo.h\"\n#import \"DHUserRepoList.h\"\n\n@implementation DHUserRepo\n\nstatic id singleton = nil;\n\n+ (instancetype)sharedUserRepo\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    id userRepo = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];\n    [userRepo setUp];\n    return userRepo;\n}\n\n- (void)setUp\n{\n    [super setUp];\n    [self reloadUserDocsetsIfNeeded];\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    [super viewWillAppear:animated];\n    [self reloadUserDocsetsIfNeeded];\n}\n\n- (void)reloadUserDocsetsIfNeeded\n{\n    if(!self.loading && (!self.lastListLoad || (!self.searchBar.text.length && [[NSDate date] timeIntervalSinceDate:self.lastListLoad] > 300)))\n    {\n        self.loading = YES;\n        BOOL shouldDelay = [self.loadingText contains:@\"Retrying\"];\n        self.loadingText = nil;\n        self.searchBar.userInteractionEnabled = NO;\n        self.searchBar.alpha = 0.5;\n        self.searchBar.placeholder = @\"Loading...\";\n        [self.tableView reloadData];\n        dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n        dispatch_async(queue, ^{\n            if(shouldDelay)\n            {\n                [NSThread sleepForTimeInterval:1.0];\n            }\n            [[DHUserRepoList sharedUserRepoList] reload];\n            NSMutableArray *feeds = [[DHUserRepoList sharedUserRepoList] allUserDocsets];\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                if(feeds.count)\n                {\n                    NSArray *savedFeeds = [[NSUserDefaults standardUserDefaults] objectForKey:[self defaultsKey]];\n                    for(NSDictionary *feedDictionary in savedFeeds)\n                    {\n                        DHFeed *savedFeed = [DHFeed feedWithDictionaryRepresentation:feedDictionary];\n                        NSUInteger index = [feeds indexOfObject:savedFeed];\n                        if(index != NSNotFound)\n                        {\n                            DHFeed *feed = feeds[index];\n                            feed.installed = savedFeed.installed;\n                            feed.installedVersion = savedFeed.installedVersion;\n                            feed.size = savedFeed.size;\n                        }\n                    }\n                    [feeds sortUsingFunction:compareFeeds context:nil];\n                    \n                    self.lastListLoad = [NSDate date];\n                    self.searchBar.userInteractionEnabled = YES;\n                    self.searchBar.alpha = 1.0;\n                    self.searchBar.placeholder = @\"Find docsets to download\";\n                    self.loading = NO;\n                    self.feeds = feeds;\n                    [self.tableView reloadData];\n                }\n                else\n                {\n                    self.loadingText = @\"Loading failed. Retrying...\";\n                    [self.tableView reloadData];\n                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                        self.loading = NO;\n                        [self reloadUserDocsetsIfNeeded];\n                    });\n                }\n             });\n        });\n    }\n}\n\n- (NSString *)installFeed:(DHFeed *)feed isAnUpdate:(BOOL)isAnUpdate\n{\n    NSObject *identifier = [[NSObject alloc] init];\n    feed.identifier = identifier;\n    feed.waiting = YES;\n    BOOL didStallOnce = NO;\n    BOOL didSetStallLabel = NO;\n    while([self shouldStall] && feed.installing && feed.identifier == identifier)\n    {\n        if(didStallOnce && !didSetStallLabel)\n        {\n            didSetStallLabel = YES;\n            dispatch_sync(dispatch_get_main_queue(), ^{\n                [feed setDetailString:@\"Waiting...\"];\n                [[feed cell].titleLabel setRightDetailText:@\"Waiting...\" adjustMainWidth:YES];\n                [feed setMaxRightDetailWidth:[feed cell].titleLabel.maxRightDetailWidth];\n            });\n        }\n        didStallOnce = YES;\n        [NSThread sleepForTimeInterval:1.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    feed.waiting = NO;\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSString *installPath = [self docsetPathForFeed:feed];\n    NSString *tempPath = [self uniqueTempDirAtPath:installPath];\n    NSString *tempFile = [tempPath stringByAppendingPathComponent:@\"dash_temp_docset.tgz\"];\n    NSString *tarixFile = [tempFile stringByAppendingString:@\".tarix\"];\n    \n    __block BOOL shouldWait = NO;\n    dispatch_sync(dispatch_get_main_queue(), ^{\n        shouldWait = [[DHLatencyTester sharedLatency] performTests:NO];\n    });\n    if(shouldWait)\n    {\n        [NSThread sleepForTimeInterval:3.0f];\n    }\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    NSString *error = nil;\n    DHFeedResult *feedResult = [self loadFeed:feed error:&error];\n    if(!feed.installing || feed.identifier != identifier)\n    {\n        return @\"cancelled\";\n    }\n    if(feedResult && feed.installing)\n    {\n        feed.feedResult = feedResult;\n        feedResult.feed = feed;\n        NSError *downloadError = nil;\n        if(feedResult.downloadURLs.count)\n        {\n            NSString *downloadURL = feedResult.downloadURLs[0];\n            [self emptyTrashAtPath:tempPath];\n            if(![fileManager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil])\n            {\n                return @\"Couldn't create install directory.\";\n            }\n            if([feedResult isCancelled])\n            {\n                [self emptyTrashAtPath:tempPath];\n                return @\"cancelled\";\n            }\n            NSURL *url = [NSURL URLWithString:downloadURL];\n            if(url)\n            {\n                BOOL result = NO;\n                NSURL *tarixURL = [NSURL URLWithString:[[downloadURL stringByAppendingString:@\".tarix\"] stringByConvertingKapeliHttpURLToHttps]];\n                feedResult.hasTarix = [NSURL URLIsFound:[tarixURL absoluteString] timeoutInterval:120.0f checkForRedirect:YES];\n                downloadError = nil;\n#ifdef DEBUG\n                NSLog(@\"Downloading %@\", url);\n#endif\n                if([DHFileDownload downloadItemAtURL:url toFile:tempFile error:&downloadError delegate:self identifier:feedResult] && !downloadError)\n                {\n                    if([feedResult isCancelled])\n                    {\n                        [self emptyTrashAtPath:tempPath];\n                        return @\"cancelled\";\n                    }\n                    \n                    [feedResult setRightDetail:@\"Waiting...\"];\n                    @synchronized([DHDocsetIndexer class])\n                    {\n                        if(!feedResult.hasTarix)\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            result = [DHUnarchiver unarchiveArchive:tempFile delegate:feedResult];\n                        }\n                        else\n                        {\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Preparing...\"];\n                            result = [DHFileDownload downloadItemAtURL:tarixURL toFile:tarixFile error:nil delegate:nil identifier:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't download index file.\";\n                            }\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            [feedResult setRightDetail:@\"Extracting...\"];\n                            result = [DHUnarchiver unarchiveArchive:tarixFile delegate:nil];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive index file.\";\n                            }\n                            [fileManager removeItemAtPath:tarixFile error:nil];\n                            tarixFile = [fileManager firstFileWithExtension:@\"tarix\" atPath:tempPath ignoreHidden:YES];\n                            if(!tarixFile)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't find index file.\";\n                            }\n                            tarixFile = [tempPath stringByAppendingPathComponent:tarixFile];\n                            result = [DHUnarchiver unpackTarixDocset:tempFile tarixPath:tarixFile delegate:feedResult];\n                            if([feedResult isCancelled])\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"cancelled\";\n                            }\n                            if(!result)\n                            {\n                                [self emptyTrashAtPath:tempPath];\n                                return @\"Couldn't unarchive docset.\";\n                            }\n                        }\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        if(!result)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't unarchive docset.\";\n                        }\n                        \n                        if(!feedResult.hasTarix)\n                        {\n                            [fileManager removeItemAtPath:tempFile error:nil];\n                        }\n                        DHDocset *docset = [DHDocset firstDocsetInsideFolder:tempPath];\n                        if(!docset)\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"Couldn't install docset.\";\n                        }\n                        else if(feedResult.hasTarix)\n                        {\n                            [fileManager moveItemAtPath:tarixFile toPath:docset.tarixIndexPath error:nil];\n                            [fileManager moveItemAtPath:tempFile toPath:docset.tarixPath error:nil];\n                        }\n                        \n                        NSString *iconPath = [docset.path stringByAppendingPathComponent:@\"icon.png\"];\n                        [fileManager removeItemAtPath:iconPath error:nil];\n                        NSString *icon2xPath = [docset.path stringByAppendingPathComponent:@\"icon@2x.png\"];\n                        [fileManager removeItemAtPath:icon2xPath error:nil];\n                        [fileManager removeItemAtPath:[docset.path stringByAppendingPathComponent:@\"icon.tiff\"] error:nil];\n                        NSString *base64 = [DHUserRepoList sharedUserRepoList].json[@\"docsets\"][feed.uniqueIdentifier][@\"icon\"];\n                        if(base64.length)\n                        {\n                            [[[NSData alloc] initWithBase64EncodedString:base64 options:NSDataBase64DecodingIgnoreUnknownCharacters] writeToFile:iconPath atomically:NO];\n                        }\n                        base64 = [DHUserRepoList sharedUserRepoList].json[@\"docsets\"][feed.uniqueIdentifier][@\"icon@2x\"];\n                        if(base64.length)\n                        {\n                            [[[NSData alloc] initWithBase64EncodedString:base64 options:NSDataBase64DecodingIgnoreUnknownCharacters] writeToFile:icon2xPath atomically:NO];\n                        }\n                        NSString *plistPath = [docset.path stringByAppendingPathComponent:@\"Contents/Info.plist\"];\n                        NSMutableDictionary *plist = [[NSDictionary dictionaryWithContentsOfFile:plistPath] mutableCopy];\n                        NSString *platform = [plist[@\"DocSetPlatformFamily\"] trimWhitespace];\n                        if(platform && platform.length)\n                        {\n                            plist[@\"DashDocSetKeyword\"] =  (plist[@\"DashDocSetKeyword\"]) ? plist[@\"DashDocSetKeyword\"] : platform;\n                            plist[@\"DashDocSetPluginKeyword\"] = (plist[@\"DashDocSetPluginKeyword\"]) ? plist[@\"DashDocSetPluginKeyword\"] : platform;\n                            plist[@\"DashWebSearchKeyword\"] = (plist[@\"DashWebSearchKeyword\"]) ? plist[@\"DashWebSearchKeyword\"] : platform;\n                            plist[@\"DocSetPlatformFamily\"] = [@\"usercontrib\" stringByAppendingString:feed.uniqueIdentifier];\n                            [plist writeToFile:plistPath atomically:NO];\n                        }\n                        \n                        [DHDocsetIndexer indexerForDocset:docset delegate:feedResult];\n                        [fileManager removeItemAtPath:docset.sqlPath error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-shm\"] error:nil];\n                        [fileManager removeItemAtPath:[docset.sqlPath stringByAppendingString:@\"-wal\"] error:nil];\n                        if([feedResult isCancelled])\n                        {\n                            [self emptyTrashAtPath:tempPath];\n                            return @\"cancelled\";\n                        }\n                        \n                        NSDirectoryEnumerator *dirEnum = [fileManager enumeratorAtPath:installPath];\n                        NSString *file = nil;\n                        while(file = [dirEnum nextObject])\n                        {\n                            [dirEnum skipDescendents];\n                            NSString *filePath = [installPath stringByAppendingPathComponent:file];\n                            if(![filePath isEqualToString:tempPath])\n                            {\n                                NSString *trashPath = [self uniqueTrashPath];\n                                [fileManager moveItemAtPath:filePath toPath:trashPath error:nil];\n                                dispatch_queue_t queue = dispatch_queue_create([[NSString stringWithFormat:@\"%u\", arc4random() % 100000] UTF8String], 0);\n                                dispatch_async(queue, ^{\n                                    [self emptyTrashAtPath:trashPath];\n                                });\n                            }\n                        }\n                        [fileManager moveItemAtPath:docset.path toPath:[installPath stringByAppendingPathComponent:[docset.path lastPathComponent]] error:nil];\n                        [self emptyTrashAtPath:tempPath];\n                        return nil;\n                    }\n                }\n                else if(downloadError.code == DHDownloadCancelled)\n                {\n                    [self emptyTrashAtPath:tempPath];\n                    return @\"cancelled\";\n                }\n                else\n                {\n                    [self emptyTrashAtPath:tempPath];\n                }\n            }\n        }\n        return @\"Couldn't download docset.\";\n    }\n    else\n    {\n        return error;\n    }\n    return nil;\n}\n\n- (DHFeedResult *)loadFeed:(DHFeed *)feed error:(NSString **)returnError\n{\n    DHFeedResult *feedResult = [[DHFeedResult alloc] init];\n    DHUserRepoList *list = [DHUserRepoList sharedUserRepoList];\n    feedResult.downloadURLs = @[[list downloadURLForEntry:feed]];\n    feedResult.version = [list versionForEntry:feed];\n    return feedResult;\n}\n\n- (NSString *)docsetInstallFolderName\n{\n    return @\"User Contributed\";\n}\n\n- (void)showUpdateRequestForFeeds:(NSArray *)toUpdate count:(NSInteger)feedCount docsetList:(NSString *)docsetList\n{\n    [[NSUserDefaults standardUserDefaults] setInteger:0 forKey:[self defaultsScheduledUpdateKey]];\n    [UIAlertView showWithTitle:@\"Updates Found\" message:[NSString stringWithFormat:@\"Updates are available for %ld %@:%@%@\", (long)feedCount, (feedCount > 1) ? @\"user contributed docsets\" : @\"user contributed docset\", (feedCount > 1) ? @\"\\n\\n\" : @\" \", docsetList] cancelButtonTitle:@\"Maybe Later\" otherButtonTitles:@[@\"Update\"] tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n        if(buttonIndex != alertView.cancelButtonIndex)\n        {\n            if(toUpdate)\n            {\n                [self updateFeeds:toUpdate];\n            }\n            else\n            {\n                [self checkForUpdatesAndShowInterface:NO updateWithoutAsking:YES];\n            }\n        }\n    }];\n}\n\n+ (id)alloc\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    return [super alloc];\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    self = [super initWithCoder:aDecoder];\n    singleton = self;\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHUserRepoList.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n#import \"DHFeed.h\"\n\n@interface DHUserRepoList : NSObject\n\n@property (retain) NSDictionary *json;\n\n+ (DHUserRepoList *)sharedUserRepoList;\n- (NSMutableArray *)allUserDocsets;\n- (NSString *)versionForEntry:(DHFeed *)entry;\n- (NSString *)downloadURLForEntry:(DHFeed *)entry;\n- (void)reload;\n- (NSMutableArray *)allVersionsForEntry:(DHFeed *)entry;\n- (NSString *)downloadURLForVersionedEntry:(DHFeed *)versionedEntry parentEntry:(DHFeed *)parentEntry;\n- (UIImage *)imageForEntry:(DHFeed *)entry;\n\n@end\n"
  },
  {
    "path": "Dash/DHUserRepoList.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHUserRepoList.h\"\n#import \"DHLatencyTester.h\"\n\n@implementation DHUserRepoList\n\n+ (DHUserRepoList *)sharedUserRepoList\n{\n    static dispatch_once_t pred;\n    static DHUserRepoList *_userList = nil;\n    \n    dispatch_once(&pred, ^{\n        _userList = [[DHUserRepoList alloc] init];\n        [_userList setUp];\n    });\n    return _userList;\n}\n\n- (void)setUp\n{\n}\n\n- (void)reload\n{\n    BOOL success = NO;\n    NSString *url = [[[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingString:@\"zzz/user_contributed/build/index.json\"] stringByConvertingKapeliHttpURLToHttps];\n    NSString *json = [NSString stringWithContentsOfURLString:url];\n    if(json)\n    {\n        NSDictionary *newJSON = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];\n        if(newJSON)\n        {\n            self.json = newJSON;\n            success = YES;\n        }\n    }\n    if(!success)\n    {\n        dispatch_sync(dispatch_get_main_queue(), ^{\n            [[DHLatencyTester sharedLatency] performTests:YES];\n        });\n    }\n}\n\n- (NSMutableArray *)allUserDocsets\n{\n    NSMutableArray *entries = [NSMutableArray array];\n    [self.json[@\"docsets\"] enumerateKeysAndObjectsUsingBlock:^(id key, NSDictionary *value, BOOL *stop) {\n        if([value[@\"minimum_dash_version\"] integerValue] <= 1 && (!value[@\"enabled\"] || [value[@\"enabled\"] boolValue]))\n        {\n            NSString *platform = [@\"usercontrib\" stringByAppendingString:key];\n            DHFeed *entry = [DHFeed entryWithName:value[@\"name\"] platform:platform icon:nil];\n            entry.aliases = value[@\"aliases\"];\n            entry._isMajorVersioned = [value[@\"major_versioned\"] boolValue];\n            entry._uniqueIdentifier = key;\n            entry.authorLinkText = value[@\"author\"][@\"name\"];\n            entry.authorLinkHref = [NSString stringWithFormat:@\"https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/%@#readme\", entry.uniqueIdentifier];\n            BOOL hasVersions = [self allVersionsForEntry:entry].count > 0;\n            entry.doesNotHaveVersions = !hasVersions;\n            entry._icon = [self imageForEntry:entry];\n            [entries addObject:entry];\n        }\n    }];\n    if(!entries.count)\n    {\n        return nil;\n    }\n    return entries;\n}\n\n- (UIImage *)imageForEntry:(DHFeed *)entry\n{\n    NSString *base64 = self.json[@\"docsets\"][entry.uniqueIdentifier][@\"icon@2x\"];\n    if(base64.length)\n    {\n        return [UIImage imageWithData:[[NSData alloc] initWithBase64EncodedString:base64 options:NSDataBase64DecodingIgnoreUnknownCharacters] scale:2];\n    }\n    return nil;\n}\n\n- (NSString *)versionForEntry:(DHFeed *)entry\n{\n    NSString *version = self.json[@\"docsets\"][entry.uniqueIdentifier][@\"version\"];\n    if(version)\n    {\n        return version;\n    }\n    return nil;\n}\n\n- (NSMutableArray *)allVersionsForEntry:(DHFeed *)entry\n{\n    NSMutableArray *versions = [NSMutableArray array];\n    NSArray *jsonVersions = self.json[@\"docsets\"][entry.uniqueIdentifier][@\"specific_versions\"];\n    for(NSDictionary *jsonVersion in jsonVersions)\n    {\n        if([jsonVersion[@\"archive\"] length] && [jsonVersion[@\"version\"] length])\n        {\n            [versions addObject:[jsonVersion[@\"version\"] substringToString:@\"/\"]];\n        }\n    }\n    if(!versions.count)\n    {\n        return nil;\n    }\n    return versions;\n}\n\n- (NSString *)downloadURLForEntry:(DHFeed *)entry\n{\n    if(!self.json)\n    {\n        return nil;\n    }\n    return [[[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingFormat:@\"zzz/user_contributed/build/%@/%@\", entry.uniqueIdentifier, self.json[@\"docsets\"][entry.uniqueIdentifier][@\"archive\"]] stringByConvertingKapeliHttpURLToHttps];\n}\n\n- (NSString *)downloadURLForVersionedEntry:(DHFeed *)versionedEntry parentEntry:(DHFeed *)parentEntry\n{\n    for(NSDictionary *specificVersion in self.json[@\"docsets\"][parentEntry.uniqueIdentifier][@\"specific_versions\"])\n    {\n        if([[specificVersion[@\"version\"] substringToString:@\"/\"] isEqualToString:versionedEntry.uniqueIdentifier])\n        {\n            return [[[[DHLatencyTester sharedLatency] bestMirror] stringByAppendingFormat:@\"zzz/user_contributed/build/%@/%@\", parentEntry.uniqueIdentifier, specificVersion[@\"archive\"]] stringByConvertingKapeliHttpURLToHttps];\n        }\n    }\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHWebProgressView.h",
    "content": "#import <UIKit/UIKit.h>\n\n@interface DHWebProgressView : UIView\n\n@property (nonatomic) float progress;\n@property (nonatomic) float actualProgress;\n\n@property (retain) NSTimer *fakeLoadTimer;\n@property (nonatomic) UIView *progressBarView;\n@property (nonatomic) NSTimeInterval barAnimationDuration; // default 0.1\n@property (nonatomic) NSTimeInterval fadeAnimationDuration; // default 0.27\n@property (nonatomic) NSTimeInterval fadeOutDelay; // default 0.1\n\n- (void)setProgress:(float)progress animated:(BOOL)animated;\n- (void)fakeSetProgress:(float)progress;\n\n@end\n"
  },
  {
    "path": "Dash/DHWebProgressView.m",
    "content": "//\n// The MIT License (MIT)\n//\n// Copyright (c) 2013 Satoshi Asano\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 deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// 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 FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n//\n\n#import \"DHWebProgressView.h\"\n\n@implementation DHWebProgressView\n\n- (id)initWithFrame:(CGRect)frame\n{\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self configureViews];\n    }\n    return self;\n}\n\n- (void)awakeFromNib\n{\n    [super awakeFromNib];\n    [self configureViews];\n}\n\n-(void)configureViews\n{\n    self.userInteractionEnabled = NO;\n    self.autoresizingMask = UIViewAutoresizingFlexibleWidth;\n    _progressBarView = [[UIView alloc] initWithFrame:CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 0, self.bounds.size.height)];\n    UIColor *tintColor = [UIColor colorWithRed:22.f / 255.f green:126.f / 255.f blue:251.f / 255.f alpha:1.0]; // iOS7 Safari bar color\n    if ([UIApplication.sharedApplication.delegate.window respondsToSelector:@selector(setTintColor:)] && UIApplication.sharedApplication.delegate.window.tintColor) {\n        tintColor = UIApplication.sharedApplication.delegate.window.tintColor;\n    }\n    _progressBarView.backgroundColor = tintColor;\n    [self addSubview:_progressBarView];\n    \n    _barAnimationDuration = 0.27f;\n    _fadeAnimationDuration = 0.27f;\n    _fadeOutDelay = 0.1f;\n}\n\n- (void)fakeSetProgress:(float)progress\n{\n    self.fakeLoadTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 block:^{\n        self.barAnimationDuration = 3.0;\n        self.fadeAnimationDuration = 3.0;\n        [self setProgress:progress animated:YES];\n        self.barAnimationDuration = 0.27;\n        self.fadeAnimationDuration = 0.27;\n    } repeats:NO];\n}\n\n-(void)setProgress:(float)progress\n{\n    [self setProgress:progress animated:NO];\n}\n\n- (void)setProgress:(float)progress animated:(BOOL)animated\n{\n    self.fakeLoadTimer = [self.fakeLoadTimer invalidateTimer];\n    if(self.actualProgress == progress)\n    {\n        return;\n    }\n    self.actualProgress = progress;\n    CGRect currentFrame = [self.progressBarView.layer.presentationLayer frame];\n    [self.progressBarView.layer removeAllAnimations];\n    if(!CGRectEqualToRect(currentFrame, CGRectZero))\n    {\n        self.progressBarView.frame = currentFrame;\n    }\n    BOOL isGrowing = progress > 0.0;\n    [UIView animateWithDuration:(isGrowing && animated) ? _barAnimationDuration : 0.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{\n        CGRect frame = _progressBarView.frame;\n        frame.size.width = progress * self.bounds.size.width;\n        _progressBarView.frame = frame;\n    } completion:nil];\n    \n    if (progress >= 1.0) {\n        [UIView animateWithDuration:animated ? _fadeAnimationDuration : 0.0 delay:_fadeOutDelay options:UIViewAnimationOptionCurveEaseInOut animations:^{\n            _progressBarView.alpha = 0.0;\n        } completion:^(BOOL completed){\n            CGRect frame = _progressBarView.frame;\n            frame.size.width = 0;\n            _progressBarView.frame = frame;\n        }];\n    }\n    else {\n        [UIView animateWithDuration:animated ? _fadeAnimationDuration : 0.0 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{\n            _progressBarView.alpha = 1.0;\n        } completion:nil];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHWebView.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHWebView : UIWebView\n\n+ (NSString *)viewportContent:(CGRect)frame;\n- (void)setHasHistory:(BOOL)hasHistory;\n- (void)resetHistory;\n- (void)updateViewPortContent:(CGRect)frame;\n\n@end\n"
  },
  {
    "path": "Dash/DHWebView.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHWebView.h\"\n#import \"DHCSS.h\"\n\n@implementation DHWebView\n\n- (void)layoutSubviews\n{\n    [super layoutSubviews];\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [self updateViewPortContent:self.frame];\n    });\n}\n\n- (void)updateViewPortContent:(CGRect)frame\n{\n    [self stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@\"document.getElementById('dash_viewport').setAttribute('content', '%@');\", [DHWebView viewportContent:frame]]];\n}\n\n+ (NSString *)viewportContent:(CGRect)frame\n{\n    NSString *content = [NSString stringWithFormat:@\"width=%ld\", (long)frame.size.width];\n    return [content stringByAppendingString:@\", initial-scale=1\"];\n}\n\n- (void)setHasHistory:(BOOL)hasHistory\n{\n    @try {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n        id documentView = [self performSelector:NSSelectorFromString(@\"_documentView\")];\n        id webView = [documentView performSelector:NSSelectorFromString(@\"webView\")];\n        SEL selector = NSSelectorFromString(@\"setMaintainsBackForwardList:\");\n        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[webView methodSignatureForSelector:selector]];\n        [invocation setSelector:selector];\n        [invocation setTarget:webView];\n        [invocation setArgument:&hasHistory atIndex:2];\n        [invocation invoke];\n#pragma clang diagnostic pop\n    }\n    @catch(NSException *exception) { NSLog(@\"%@ %@\", exception, [exception callStackSymbols]); }\n}\n\n- (void)resetHistory\n{\n    [self setHasHistory:NO];\n    [self setHasHistory:YES];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHWebViewController.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n#import <WebKit/WebKit.h>\n#import \"DHDBResult.h\"\n#import <JavaScriptCore/JavaScriptCore.h>\n#import \"DHWebProgressView.h\"\n\n@class DHTocBrowser;\n\n@interface DHWebViewController : UIViewController <UISplitViewControllerDelegate, UINavigationControllerDelegate, UIWebViewDelegate, UIScrollViewDelegate>\n\n@property (assign) IBOutlet UIWebView *webView;\n@property (strong) UIBarButtonItem *backButton;\n@property (strong) UIBarButtonItem *forwardButton;\n//@property (strong) UIBarButtonItem *stopButton;\n//@property (strong) UIBarButtonItem *reloadButton;\n@property (strong) UIBarButtonItem *zoomOutButton;\n@property (strong) UIBarButtonItem *zoomInButton;\n@property (strong) DHWebProgressView *progressView;\n@property (strong) DHDBResult *result;\n@property (assign) BOOL ignoreScroll;\n@property (strong) NSString *mainFrameURL;\n@property (strong) NSString *previousMainFrameURL;\n@property (strong) NSArray *currentMethods;\n@property (strong) UIPopoverController *methodsPopover;\n@property (assign) BOOL anchorChangeInProgress;\n@property (assign) BOOL visible;\n@property (strong) id lastTocBrowser;\n@property (weak) UIBarButtonItem *toggleSplitViewButton;\n@property (assign) BOOL isRestoring;\n@property (assign) BOOL isDecoding;\n@property (strong) NSDate *lastLoadDate;\n@property (assign) BOOL stopButtonIsShown;\n@property (assign) BOOL nextAnchorChangeNotCausedByUserNavigation;\n@property (assign) BOOL didLoadInitialRequest;\n@property (assign) BOOL didLoadOnce;\n@property (strong) NSString *urlToLoad;\n@property (assign) BOOL isRestoreScroll;\n@property (assign) CGPoint webViewOffset;\n\n+ (instancetype)sharedWebViewController;\n- (void)loadURL:(NSString *)urlString;\n- (void)loadResult:(DHDBResult *)result;\n- (BOOL)dismissMethodsPopoverIfVisible:(BOOL)animated;\n- (BOOL)isLocalURL;\n- (void)webViewDidChangeLocationWithinPage;\n- (NSString *)loadedURL;\n- (DHTocBrowser *)actualTOCBrowser;\n- (void)updateBackForwardButtonState;\n- (void)removeDashClearedClass;\n- (void)snippetUseButtonPressed:(id)sender;\n- (IBAction)tocButtonPressed:(id)sender;\n- (void)reload;\n\n@end\n"
  },
  {
    "path": "Dash/DHWebViewController.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHWebViewController.h\"\n#import \"DHWebViewController.h\"\n#import \"DHNavigationAnimator.h\"\n#import \"JGMethodSwizzler.h\"\n#import \"DHDocsetManager.h\"\n#import \"DHJavaScript.h\"\n#import \"DHCSS.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHUnarchiver.h\"\n#import \"DHTocBrowser.h\"\n#import \"DHJavaScriptBridge.h\"\n#import \"DHRemoteProtocol.h\"\n#import \"DHTypeBrowser.h\"\n#import \"DHEntryBrowser.h\"\n#import \"DHWebView.h\"\n\n@implementation DHWebViewController\n\nstatic id singleton = nil;\n\n\n- (void)viewDidLoad\n{\n    if([self callStackIsRestoring] && !self.isRestoring)\n    {\n        return;\n    }\n    [super viewDidLoad];\n    if(self.didLoadOnce)\n    {\n        return;\n    }\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(prepareForURLSearch:) name:DHPrepareForURLSearch object:nil];\n    self.title = @\"\";\n    self.webView.scrollView.delegate = self;\n    self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;\n    self.webView.allowsInlineMediaPlayback = YES;\n    self.webView.delegate = self;\n    self.webView.dataDetectorTypes = UIDataDetectorTypeNone;\n    CGFloat progressBarHeight = 2.f;\n    CGRect navigationBarBounds = self.navigationController.navigationBar.bounds;\n    CGRect barFrame = CGRectMake(0, navigationBarBounds.size.height - progressBarHeight, navigationBarBounds.size.width, progressBarHeight);\n    self.progressView = [[DHWebProgressView alloc] initWithFrame:barFrame];\n    [self.progressView setProgress:0.0f];\n    self.progressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;\n\n    [self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];\n    self.splitViewController.presentsWithGesture = NO;\n    \n    if(isRegularHorizontalClass)\n    {\n        self.navigationController.delegate = self;\n    }\n    \n    self.backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"back\"] style:UIBarButtonItemStylePlain target:self action:@selector(goBack)];\n    self.forwardButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"forward\"] style:UIBarButtonItemStylePlain target:self action:@selector(goForward)];\n    self.zoomOutButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"zoomOut\"] style:UIBarButtonItemStylePlain target:self action:@selector(zoomOut)];\n    self.zoomInButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"zoomIn\"] style:UIBarButtonItemStylePlain target:self action:@selector(zoomIn)];\n//    self.stopButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop target:self.webView action:@selector(stopLoading)];\n//    self.reloadButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reload)];\n    \n    [self updateBackForwardButtonState];\n    \n    self.toolbarItems = @[self.backButton, UIBarButtonWithFixedWidth(10), self.forwardButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], self.zoomOutButton, UIBarButtonWithFixedWidth(3), self.zoomInButton];\n    [self updateStopReloadButtonState];\n    self.didLoadOnce = YES;\n}\n\n- (void)goBack\n{\n    self.ignoreScroll = YES;\n    [self.webView goBack];\n    self.ignoreScroll = NO;\n    [self performSelector:@selector(updateBackForwardButtonState) withObject:self afterDelay:0.01];\n}\n\n- (void)goForward\n{\n    self.ignoreScroll = YES;\n    [self.webView goForward];\n    self.ignoreScroll = NO;\n    [self performSelector:@selector(updateBackForwardButtonState) withObject:self afterDelay:0.01];\n}\n\n- (void)zoomIn\n{\n    [[DHCSS sharedCSS] modifyTextSize:YES];\n    [self refreshTextSize];\n}\n\n- (void)zoomOut\n{\n    [[DHCSS sharedCSS] modifyTextSize:NO];\n    [self refreshTextSize];\n}\n\n- (void)refreshTextSize\n{\n    if(!isRegularHorizontalClass)\n    {\n        [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] zoomScriptWithFrame:self.webView.frame]];\n    }\n    NSString *js = [[NSString alloc] initWithFormat:@\"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%@'\", [[DHCSS sharedCSS] textSizeAdjust]];\n    [self.webView stringByEvaluatingJavaScriptFromString:js];\n}\n\n- (void)loadResult:(DHDBResult *)result\n{\n    NSString *webViewURL = result.webViewURL;\n    if(webViewURL)\n    {\n        [self loadURL:webViewURL];\n    }\n}\n\n- (void)viewWillAppear:(BOOL)animated\n{\n    if(!self.didLoadInitialRequest && !self.isRestoring)\n    {\n        if(self.result)\n        {\n            [self loadResult:self.result];\n            if([DHRemoteServer sharedServer].connectedRemote)\n            {\n                [[DHRemoteServer sharedServer] processRemoteTableOfContents];\n            }\n        }\n        else if(self.urlToLoad)\n        {\n            [self loadURL:self.urlToLoad];\n            self.urlToLoad = nil;\n        }\n        else\n        {\n            id masterViewController = [(UINavigationController*)[self.splitViewController.viewControllers firstObject] topViewController];\n            if([masterViewController isKindOfClass:[DHTypeBrowser class]] || [masterViewController isKindOfClass:[DHEntryBrowser class]])\n            {\n                [self loadURL:[[masterViewController docset] indexFilePath]];\n            }\n            else\n            {\n                [self loadURL:[[NSBundle mainBundle] pathForResource:@\"home\" ofType:@\"html\"]];\n            }\n        }\n        self.didLoadInitialRequest = YES;\n    }\n    self.jsContext[@\"window\"][@\"dash\"] = [DHJavaScriptBridge sharedBridge];\n    [super viewWillAppear:animated];\n    self.ignoreScroll = YES;\n    if(![DHRemoteServer sharedServer].connectedRemote)\n    {\n        self.navigationController.toolbarHidden = NO;        \n    }\n    CGFloat progressBarHeight = 2.f;\n    CGRect navigationBarBounds = self.navigationController.navigationBar.bounds;\n    CGRect barFrame = CGRectMake(0, navigationBarBounds.size.height - progressBarHeight, navigationBarBounds.size.width, progressBarHeight);\n    [self.navigationController.navigationBar addSubview:self.progressView];\n    [self.progressView setFrame:barFrame];\n    [self traitCollectionDidChange:nil];\n}\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    if(previousTraitCollection)\n    {\n        [super traitCollectionDidChange:previousTraitCollection];\n    }\n    if(isRegularHorizontalClass)\n    {\n        UIBarButtonItem *expand = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"expand\"] style:UIBarButtonItemStylePlain target:self action:@selector(toggleSplitView:)];\n        self.toggleSplitViewButton = expand;\n        self.navigationItem.leftBarButtonItems = @[expand];\n    }\n    else\n    {\n        self.navigationItem.leftBarButtonItems = nil;\n    }\n    self.toolbarItems = @[self.backButton, UIBarButtonWithFixedWidth(10), self.forwardButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], self.zoomOutButton, UIBarButtonWithFixedWidth(3), self.zoomInButton];\n    \n}\n\n- (void)viewWillDisappear:(BOOL)animated\n{\n    [super viewWillDisappear:animated];\n    [self.navigationController.toolbar setHidden:YES];\n    [self.navigationController setToolbarHidden:YES];\n}\n\n- (void)viewDidDisappear:(BOOL)animated\n{\n    [super viewDidDisappear:animated];\n    self.jsContext[@\"window\"][@\"dash\"] = nil;\n    self.ignoreScroll = YES;\n    [self.progressView removeFromSuperview];\n    if(!isRegularHorizontalClass)\n    {\n        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@\"document.body.className = document.body.className+' dash_cleared'; document.title = \\\"%@\\\";\", self.title]];\n        self.title = @\"\";\n    }\n}\n\n- (void)viewDidAppear:(BOOL)animated\n{\n    [super viewDidAppear:animated];\n    self.ignoreScroll = NO;\n    if(self.isDecoding)\n    {\n        [self.webView reload];\n        self.isDecoding = NO;\n    }\n}\n\n- (void)webViewDidStartLoad:(UIWebView *)webView\n{\n//    self.title = @\"Loading...\";\n    [self updateBackForwardButtonState];\n    [self.progressView setProgress:0 animated:NO];\n    [self.progressView fakeSetProgress:0.6];\n}\n\n- (void)webViewDidChangeLocationWithinPage\n{\n    if(!self.nextAnchorChangeNotCausedByUserNavigation && [DHRemoteServer sharedServer].connectedRemote)\n    {\n        [[DHRemoteServer sharedServer] sendWebViewURL:[self.webView stringByEvaluatingJavaScriptFromString:@\"window.location.href\"]];\n    }\n    self.nextAnchorChangeNotCausedByUserNavigation = NO;\n}\n\n- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType\n{\n    if([[request URL].absoluteString isEqualToString:@\"about:blank\"])\n    {\n        return NO;\n    }\n    BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];\n    if(!isFrame)\n    {\n        self.lastLoadDate = [NSDate date];\n        self.previousMainFrameURL = self.mainFrameURL;\n        self.mainFrameURL = request.URL.absoluteString;\n        if(!self.anchorChangeInProgress)\n        {\n            [self updateStopReloadButtonState];\n            [self setToolbarHidden:NO];\n        }\n    }\n    if(!self.anchorChangeInProgress && [[[request URL] scheme] isCaseInsensitiveEqual:@\"file\"])\n    {\n        BOOL isMain = [request.URL isEqual:request.mainDocumentURL];\n        NSMutableURLRequest *mutRequest = (id)request;\n        NSString *url = [[[request URL] absoluteString] stringByReplacingOccurrencesOfString:@\"file://\" withString:@\"dash-tarix://\"];\n        NSURL *newURL = [NSURL URLWithString:url];\n        [mutRequest setURL:newURL];\n        if(isMain)\n        {\n            [mutRequest setMainDocumentURL:newURL];\n        }\n        [self performSelector:@selector(updateBackForwardButtonState) withObject:self afterDelay:0.1];\n        return YES;\n    }\n    if(navigationType == UIWebViewNavigationTypeLinkClicked || navigationType == UIWebViewNavigationTypeFormSubmitted || navigationType == UIWebViewNavigationTypeFormResubmitted)\n    {\n        [[DHRemoteServer sharedServer] sendWebViewURL:[request URL].absoluteString];\n    }\n    [self performSelector:@selector(updateBackForwardButtonState) withObject:self afterDelay:0.1];\n    return YES;\n}\n\n- (void)webViewDidFinishLoad:(UIWebView *)webView\n{\n    if([self stopButtonIsShown])\n    {\n        [self updateStopReloadButtonState];\n    }\n    [self updateBackForwardButtonState];\n    [self updateTitle];\n    [self setUpScripts];\n    [self setUpTOC];\n    [self.progressView setProgress:1.0 animated:YES];\n    if (self.isRestoreScroll) {\n        [self.webView.scrollView setContentOffset:self.webViewOffset animated:NO];\n        self.isRestoreScroll = NO;\n    }\n}\n\n- (void)setUpTOC\n{\n    if([DHRemoteServer sharedServer].connectedRemote || [[self loadedURL] hasPrefix:@\"dash-apple-api://\"])\n    {\n        return;\n    }\n    self.lastTocBrowser = nil;\n    NSString *path = [[[[[self loadedURL] substringFromString:@\"://\"] substringToString:@\"#\"] substringToString:@\"?\"] stringByReplacingPercentEscapes];\n    NSString *tocPath = [path stringByAppendingString:@\".dashtoc\"];\n    NSFileManager *fileManager = [NSFileManager defaultManager];\n    NSData *jsonData = nil;\n    if([fileManager fileExistsAtPath:tocPath])\n    {\n        jsonData = [NSData dataWithContentsOfFile:tocPath];\n    }\n    else\n    {\n        jsonData = [DHUnarchiver tarixReadFile:tocPath toFile:nil];\n    }\n    NSDictionary *json = (jsonData) ? [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil] : nil;\n    if(json && [json isKindOfClass:[NSDictionary class]])\n    {\n        NSArray *methods = json[@\"entries\"];\n        if([DHCSS activeAppleLanguage] == DHActiveAppleLanguageSwift && json[@\"entries_swift\"])\n        {\n            methods = json[@\"entries_swift\"];\n        }\n        NSMutableArray *actualMethods = [NSMutableArray array];\n        for(NSDictionary *method in methods)\n        {\n            if([method[@\"isSpacer\"] boolValue])\n            {\n                continue;\n            }\n            [actualMethods addObject:method];\n        }\n        self.currentMethods = actualMethods;\n        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@\"tocMenu\"] style:UIBarButtonItemStylePlain target:self action:@selector(tocButtonPressed:)];\n        if(json[@\"title\"] && [[json[@\"title\"] trimWhitespace] length])\n        {\n            self.title = [json[@\"title\"] trimWhitespace];\n        }\n    }\n    else\n    {\n        self.navigationItem.rightBarButtonItem = nil;\n    }\n}\n\n- (void)snippetUseButtonPressed:(id)sender\n{\n    [[DHRemoteServer sharedServer] sendObject:@{@\"selector\": @\"useSnippet\"} forRequestName:@\"performWebSelector\" encrypted:YES toMacName:[DHRemoteServer sharedServer].connectedRemote.name];\n}\n\n- (void)tocButtonPressed:(id)sender\n{\n    if(iPad && isRegularHorizontalClass)\n    {\n        if([self dismissMethodsPopoverIfVisible:YES])\n        {\n            return;\n        }\n        id tocBrowser = (self.lastTocBrowser && [self.lastTocBrowser isKindOfClass:[DHTocBrowser class]]) ? self.lastTocBrowser : [self.storyboard instantiateViewControllerWithIdentifier:@\"DHTocBrowser\"];\n        if(self.lastTocBrowser != tocBrowser)\n        {\n            self.lastTocBrowser = tocBrowser;\n            [self prepareTocBrowser:tocBrowser];\n        }\n        self.methodsPopover = [[UIPopoverController alloc] initWithContentViewController:tocBrowser];\n        [tocBrowser setPreferredContentSize:CGSizeMake(400, 600)];\n        [self.methodsPopover presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];\n    }\n    else\n    {\n        id tocBrowser = (self.lastTocBrowser && [self.lastTocBrowser isKindOfClass:[UINavigationController class]]) ? self.lastTocBrowser : [self.storyboard instantiateViewControllerWithIdentifier:@\"DHTocBrowserNavigationController\"];\n        if(self.lastTocBrowser != tocBrowser)\n        {\n            self.lastTocBrowser = tocBrowser;\n            [self prepareTocBrowser:(id)[tocBrowser topViewController]];\n        }\n        [self presentViewController:tocBrowser animated:YES completion:nil];\n    }\n}\n\n- (void)prepareTocBrowser:(DHTocBrowser *)tocBrowser\n{\n    tocBrowser.title = self.title;\n    NSMutableArray *sections = [NSMutableArray array];\n    NSMutableArray *sectionTitles = [NSMutableArray array];\n    for(NSDictionary *method in self.currentMethods)\n    {\n        if([method[@\"isHeader\"] boolValue])\n        {\n            [sectionTitles addObject:method[@\"name\"]];\n            [sections addObject:[NSMutableArray array]];\n        }\n        else\n        {\n            [[sections lastObject] addObject:method];\n        }\n    }\n    [tocBrowser setSections:sections];\n    [tocBrowser setSectionTitles:sectionTitles];\n}\n\n- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error\n{\n    if([self stopButtonIsShown])\n    {\n        [self updateStopReloadButtonState];\n    }\n    NSString *customMessage = nil;\n    [self updateTitle];\n    if([error code] == NSURLErrorCancelled || ([error.domain isEqualToString:@\"WebKitErrorDomain\"] && error.code == 204) || ([error.domain isEqualToString:@\"WebKitErrorDomain\"] && error.code == 102 && ![[[error userInfo][NSURLErrorFailingURLStringErrorKey] substringFromString:@\"://\"] isCaseInsensitiveEqual:[self.mainFrameURL substringFromString:@\"://\"]]))\n    {\n        return;\n    }\n    else if([error.domain isEqualToString:@\"WebKitErrorDomain\"] && error.code == 102)\n    {\n        customMessage = @\"Invalid URL.\";\n    }\n    self.mainFrameURL = self.previousMainFrameURL;\n    [self.progressView setProgress:1.0 animated:YES];\n    [[[UIAlertView alloc] initWithTitle:@\"Error Loading Page\" message:(customMessage) ? customMessage : error.localizedDescription delegate:nil cancelButtonTitle:@\"OK\" otherButtonTitles:nil] show];\n}\n\n- (JSContext *)jsContext\n{\n    JSContext *ctx = [self.webView valueForKeyPath:@\"documentView.webView.mainFrame.javaScriptContext\"];\n    return ctx;\n}\n\n- (void)setUpScripts\n{\n    self.jsContext[@\"window\"][@\"alert\"] = [DHJavaScriptBridge sharedBridge].alertBlock;\n    self.jsContext[@\"window\"][@\"dash\"] = [DHJavaScriptBridge sharedBridge];\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"scroll_to_current_anchor\"]];\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"hash_change_notifier\"]];\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"on_page_load\"]];\n    NSString *platform = nil;\n    DHDocset *docset = nil;\n    if([DHRemoteServer sharedServer].connectedRemote)\n    {\n        platform = [DHRemoteProtocol lastResponseUserInfo][@\"platform\"];\n    }\n    else\n    {\n        docset = [[DHDocsetManager sharedManager] docsetForDocumentationPage:self.mainFrameURL];\n        platform = docset.platform;\n    }\n    if(!platform && [self.mainFrameURL contains:@\"developer.apple.com\"])\n    {\n        platform = @\"osx\";\n    }\n    if(platform)\n    {\n        if([platform isEqualToString:@\"macosx\"] || [platform isEqualToString:@\"osx\"] || [platform isEqualToString:@\"iphoneos\"] || [platform isEqualToString:@\"ios\"] || [platform isEqualToString:@\"watchos\"] || [platform isEqualToString:@\"tvos\"])\n        {\n            [self setUpCocoaScripts:docset];\n        }\n        else if([platform isEqualToString:@\"apple\"])\n        {\n            [self setUpAppleScripts:docset];\n        }\n        else if([platform isEqualToString:@\"rails\"])\n        {\n            [self setUpRailsScripts:docset];\n        }\n        else if([platform isEqualToString:@\"ruby\"])\n        {\n            [self setUpRubyScripts:docset];\n        }\n        else if([platform isEqualToString:@\"net\"])\n        {\n            [self setUpMSDNScripts:docset];\n        }\n        else if([platform isEqualToString:@\"unity3d\"])\n        {\n            [self setUpUnityScripts:docset];\n        }\n    }\n    if([self.mainFrameURL hasCaseInsensitivePrefix:@\"http\"] && [self.mainFrameURL contains:@\"developer.apple.com\"])\n    {\n        [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] injectCSSScript]];\n        [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] injectViewPortScript]];\n    }\n}\n\n- (void)setUpAppleScripts:(DHDocset *)docset\n{\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"apple\"]];\n}\n\n- (void)setUpCocoaScripts:(DHDocset *)docset\n{\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"cocoa\"]];\n}\n\n- (void)setUpRailsScripts:(DHDocset *)docset\n{\n    [self.webView stringByEvaluatingJavaScriptFromString:@\"function toggleSource(e){var t=$('#'+e).toggle();var n=t.is(':visible');$('#l_'+e).html(n?'hide':'show')}$(function(){$('.description pre').each(function(){hljs.highlightBlock(this)})})\"];\n}\n\n- (void)setUpRubyScripts:(DHDocset *)docset\n{\n    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"ruby\"]];\n}\n\n- (void)setUpMSDNScripts:(DHDocset *)docset\n{\n//    [self.webView stringByEvaluatingJavaScriptFromString:[[DHJavaScript sharedJavaScript] javaScriptInFile:@\"msdn\"]];\n}\n\n- (void)setUpUnityScripts:(DHDocset *)docset\n{\n    NSString *prefLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:@\"unitySelectedSnippetLanguage\"];\n    if(prefLanguage)\n    {\n        [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@\"var uls=document.getElementsByClassName('cSelectWidth');var found=false;for(var i=0;i<uls.length;i++){var ul=uls[i];if(ul.nodeName=='UL'){for(var j=0;j<ul.children.length;j++){var li=ul.children[j];if(li.innerText=='%@'){jQuery(li).click();found=true;break}}}if(found){break}}\", prefLanguage]];\n    }\n    [self.webView stringByEvaluatingJavaScriptFromString:@\"console.log = function(s) { window.dash.unityConsoleLog(s)}\"];\n}\n\n- (void)setToolbarHidden:(BOOL)hidden\n{\n    if(self.navigationController.toolbarHidden != hidden && [self isActive] && (![DHRemoteServer sharedServer].connectedRemote || hidden))\n    {\n        self.ignoreScroll = YES;\n        [self.navigationController setToolbarHidden:hidden animated:YES];\n        self.ignoreScroll = NO;\n    }\n}\n\n- (void)scrollViewDidScroll:(UIScrollView *)scrollView\n{\n    if(self.ignoreScroll)\n    {\n        return;\n    }\n    if(!self.navigationController.toolbarHidden && [scrollView.panGestureRecognizer translationInView:self.view].y < 0.0f && scrollView.contentSize.height > scrollView.frame.size.height && ![self stopButtonIsShown] && [[NSDate date] timeIntervalSinceDate:self.lastLoadDate] > 0.1)\n    {\n        [self setToolbarHidden:YES];\n    }\n    else if(self.navigationController.toolbarHidden && [scrollView.panGestureRecognizer translationInView:self.view].y > 0.0f && ![self stopButtonIsShown])\n    {\n        [self setToolbarHidden:NO];\n    }\n}\n\n- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view\n{\n    self.ignoreScroll = YES;\n}\n\n- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale\n{\n    self.ignoreScroll = NO;\n}\n\n- (void)updateBackForwardButtonState\n{\n    self.backButton.enabled = self.webView.canGoBack;\n    self.forwardButton.enabled = self.webView.canGoForward;\n}\n\n- (void)updateStopReloadButtonState\n{\n    if((self.webView.loading && ![self stopButtonIsShown]) || (!self.webView.loading && [self stopButtonIsShown]))\n    {\n        self.stopButtonIsShown = self.webView.loading;\n//        NSMutableArray *items = [self.toolbarItems mutableCopy];\n//        [items replaceObjectAtIndex:[items count]-1 withObject:(self.webView.loading) ? self.stopButton : self.reloadButton];\n//        [self setToolbarItems:items animated:YES];\n    }\n}\n\n- (void)loadURL:(NSString *)urlString\n{\n    NSString *anchor = [[urlString substringFromStringReturningNil:@\"#\"] stringByReplacingOccurrencesOfString:@\" \" withString:@\"%20\"];\n    NSString *urlWithoutAnchor = [[urlString substringToString:@\"#\"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n    urlString = (anchor) ? [urlWithoutAnchor stringByAppendingFormat:@\"#%@\", anchor] : urlWithoutAnchor;\n    \n    if(![urlString hasCaseInsensitivePrefix:@\"file://\"] && [urlString hasPrefix:@\"/\"])\n    {\n        urlString = [@\"dash-tarix://\" stringByAppendingString:urlString];\n        urlWithoutAnchor = [@\"dash-tarix://\" stringByAppendingString:urlWithoutAnchor];\n    }\n    urlString = [urlString stringByReplacingOccurrencesOfString:@\"file://\" withString:@\"dash-tarix://\"];\n    urlWithoutAnchor = [urlWithoutAnchor stringByReplacingOccurrencesOfString:@\"file://\" withString:@\"dash-tarix://\"];\n    NSURL *url = [NSURL URLWithString:urlString];\n    if(!url && anchor.length)\n    {\n        urlString = [urlWithoutAnchor stringByAppendingFormat:@\"#%@\", [anchor stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];\n        url = [NSURL URLWithString:urlString];\n    }\n    if(url)\n    {\n        if(!self.webView.isLoading && [[[[self.mainFrameURL substringFromString:@\"://\"] stringByDeletingPathFragment] stringByReplacingPercentEscapes] isCaseInsensitiveEqual:[[[urlString substringFromString:@\"://\"] stringByDeletingPathFragment] stringByReplacingPercentEscapes]] && ![self.mainFrameURL contains:@\"dash-remote-snippet://\"])\n        {\n            self.nextAnchorChangeNotCausedByUserNavigation = YES;\n            self.anchorChangeInProgress = YES;\n            self.ignoreScroll = YES;\n            NSString *hash = [urlString pathFragment];\n            if(hash && hash.length)\n            {\n                [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@\"if(window.location.hash == \\\"#%@\\\") { window.location.hash = ''; } window.location.href = \\\"#%@\\\"\", hash, hash]];\n            }\n            else\n            {\n                [self.webView stringByEvaluatingJavaScriptFromString:@\"scroll(0,0)\"];\n            }\n            self.ignoreScroll = NO;\n            [self removeDashClearedClass];\n            self.anchorChangeInProgress = NO;\n            if(self.navigationController.toolbarHidden && ![DHRemoteServer sharedServer].connectedRemote)\n            {\n                self.ignoreScroll = YES;\n                [self.navigationController setToolbarHidden:NO animated:YES];\n                self.ignoreScroll = NO;\n            }\n            return;\n        }\n        [self.webView loadRequest:[NSURLRequest requestWithURL:url]];\n    }\n}\n\n- (void)removeDashClearedClass\n{\n    if([[self.webView stringByEvaluatingJavaScriptFromString:@\"document.body.className\"] contains:@\"dash_cleared\"])\n    {\n        [self.webView stringByEvaluatingJavaScriptFromString:@\"document.body.className = document.body.className.replace(/\\\\bdash_cleared\\\\b/, \\\" \\\");\"];\n        self.title = [[self.webView stringByEvaluatingJavaScriptFromString:@\"document.title\"] trimWhitespace];\n    }\n}\n\n- (NSString *)loadedURL\n{\n    return self.webView.request.URL.absoluteString;\n}\n\n- (void)reload\n{\n    [self.webView stringByEvaluatingJavaScriptFromString:@\"location.reload(true)\"];\n}\n\n- (void)updateTitle\n{\n    NSString *newTitle = self.pageTitle;\n    if(![self.title isEqualToString:newTitle])\n    {\n        self.title = self.pageTitle;\n        [self.actualTOCBrowser setTitle:self.title];\n    }\n}\n\n- (DHTocBrowser *)actualTOCBrowser\n{\n    return [self.lastTocBrowser isKindOfClass:[DHTocBrowser class]] ? self.lastTocBrowser : [self.lastTocBrowser topViewController];\n}\n\n- (NSString *)pageTitle\n{\n    NSString *title = [[self.webView stringByEvaluatingJavaScriptFromString:@\"document.title\"] trimWhitespace];\n    if(!title.length && [[self loadedURL] contains:@\"://\"])\n    {\n        title = [[[[self mainFrameURL] stringByDeletingPathFragment] lastPathComponent] stringByDeletingPathExtension];\n        title = (title.length) ? title : @\"No Title\";\n    }\n    return title;\n}\n\n- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController*)fromVC toViewController:(UIViewController*)toVC\n{\n    Class class = [DHWebViewController class];\n    BOOL fromIs = ![fromVC isKindOfClass:class];\n    BOOL toIs = ![toVC isKindOfClass:class];\n    if((fromIs && !toIs) || (toIs && !fromIs))\n    {\n        return [[DHNavigationAnimator alloc] init];\n    }\n    else if(fromIs && toIs)\n    {\n        DHNavigationAnimator *animator = [[DHNavigationAnimator alloc] init];\n        animator.noAnimation = YES;\n        return animator;\n    }\n    return nil;\n}\n\n- (void)toggleSplitView:(id)sender\n{\n    [self.webView.window.rootViewController.view endEditing:YES];\n    [UIView animateWithDuration:0.3 animations:^{\n        if(self.splitViewController.preferredDisplayMode == UISplitViewControllerDisplayModePrimaryHidden)\n        {\n            [sender setImage:[UIImage imageNamed:@\"expand\"]];\n            [self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];\n        }\n        else\n        {\n            [sender setImage:[UIImage imageNamed:@\"collapse\"]];\n            [self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryHidden];\n        }\n    }];\n}\n\n- (BOOL)isLocalURL\n{\n    if(!self.mainFrameURL)\n    {\n        return NO;\n    }\n    if([[self mainFrameURL] rangeOfString:@\"file://\"].location != NSNotFound || [[self mainFrameURL] hasPrefix:@\"dash-stack://\"] || [[self mainFrameURL] hasPrefix:@\"dash-apple-api://\"] || [[self mainFrameURL] hasPrefix:@\"dash-tarix://\"])\n    {\n        return YES;\n    }\n    return NO;\n}\n\n- (void)prepareForURLSearch:(id)sender\n{\n    if(iPad && isRegularHorizontalClass)\n    {\n        [self dismissMethodsPopoverIfVisible:YES];\n    }\n    if(isRegularHorizontalClass)\n    {\n        if(self.splitViewController.preferredDisplayMode == UISplitViewControllerDisplayModePrimaryHidden)\n        {\n            [self.toggleSplitViewButton setImage:[UIImage imageNamed:@\"expand\"]];\n            [self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];\n        }\n    }\n}\n\n- (BOOL)dismissMethodsPopoverIfVisible:(BOOL)animated\n{\n    if(self.methodsPopover.popoverVisible)\n    {\n        [self.methodsPopover dismissPopoverAnimated:animated];\n        return YES;\n    }\n    return NO;\n}\n\n- (void)encodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super encodeRestorableStateWithCoder:coder];\n    [coder encodeObject:self.webView.request.URL.absoluteString forKey:@\"webViewURL\"];\n    [coder encodeObject:homePath forKey:@\"homePath\"];\n    [coder encodeCGPoint:self.webView.scrollView.contentOffset forKey:@\"webViewOffset\"];\n}\n\n- (void)decodeRestorableStateWithCoder:(NSCoder *)coder\n{\n    [super decodeRestorableStateWithCoder:coder];\n    NSString *loadURL = [coder decodeObjectForKey:@\"webViewURL\"];\n    NSString *lastHomePath = [coder decodeObjectForKey:@\"homePath\"];\n    self.webViewOffset = [coder decodeCGPointForKey:@\"webViewOffset\"];\n    if (lastHomePath) {\n        loadURL = [[loadURL stringByReplacingOccurrencesOfString:lastHomePath withString:homePath] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n    }\n    \n    self.isRestoring = YES;\n    [self viewDidLoad];\n    self.isRestoring = NO;\n    self.isDecoding = YES;\n    [self loadURL:loadURL];\n    if (isRegularHorizontalClass) {\n        [self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModeAllVisible];\n    }\n    self.isRestoreScroll = YES;\n}\n\n- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender\n{\n    \n}\n\nstatic inline UIBarButtonItem *UIBarButtonWithFixedWidth(CGFloat width)\n{\n    UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];\n    button.width = width;\n    return button;\n}\n\n+ (instancetype)sharedWebViewController\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    id webViewController = [[DHAppDelegate mainStoryboard] instantiateViewControllerWithIdentifier:NSStringFromClass([self class])];\n    return webViewController;\n}\n\n+ (id)alloc\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    return [super alloc];\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder\n{\n    if(singleton)\n    {\n        return singleton;\n    }\n    self = [super initWithCoder:aDecoder];\n    singleton = self;\n    return self;\n}\n\n- (void)dealloc\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self];\n    self.navigationController.delegate = nil;\n    self.webView.scrollView.delegate = nil;\n    self.webView.delegate = nil;\n    [self.webView loadHTMLString:@\"\" baseURL:nil];\n    [self.webView stopLoading];\n    [self.webView removeFromSuperview];\n}\n\n@end\n"
  },
  {
    "path": "Dash/DHWindow.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface DHWindow : UIWindow\n\n@end\n"
  },
  {
    "path": "Dash/DHWindow.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"DHWindow.h\"\n\n@implementation DHWindow\n\n- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection\n{\n    [super traitCollectionDidChange:previousTraitCollection];\n    [[NSNotificationCenter defaultCenter] postNotificationName:DHWindowChangedTraitCollection object:nil];\n}\n\n@end\n"
  },
  {
    "path": "Dash/Dash iOS.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\t26480C2B1E2E9ABB00E3145E /* docset_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 26480C2A1E2E9ABB00E3145E /* docset_icon.png */; };\n\t\t3A2F71C185D6471649E8F3A7 /* libPods-Dash-Dash App Store.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FB91D369AD27465BED375AD /* libPods-Dash-Dash App Store.a */; };\n\t\t4303A3BC19C6584F00A7CD85 /* whitespace_tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B119C6584F00A7CD85 /* whitespace_tokenizer.c */; };\n\t\t4303A3BD19C6584F00A7CD85 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B319C6584F00A7CD85 /* FMDatabase.m */; };\n\t\t4303A3BE19C6584F00A7CD85 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B519C6584F00A7CD85 /* FMDatabaseAdditions.m */; };\n\t\t4303A3BF19C6584F00A7CD85 /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B719C6584F00A7CD85 /* FMResultSet.m */; };\n\t\t4303A3C019C6584F00A7CD85 /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B919C6584F00A7CD85 /* FMDatabasePool.m */; };\n\t\t4303A3C119C6584F00A7CD85 /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3BB19C6584F00A7CD85 /* FMDatabaseQueue.m */; };\n\t\t4303A3C419C658B000A7CD85 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4303A3C319C658B000A7CD85 /* libsqlite3.dylib */; };\n\t\t4303A3C719C6590000A7CD85 /* DHDocset.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3C619C6590000A7CD85 /* DHDocset.m */; };\n\t\t4303A3CD19C65E6A00A7CD85 /* DHDocsetIndexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3CC19C65E6A00A7CD85 /* DHDocsetIndexer.m */; };\n\t\t4303A3D119C668BC00A7CD85 /* DHType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3D019C668BC00A7CD85 /* DHType.m */; };\n\t\t4303A3D419C668C200A7CD85 /* DHTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3D319C668C200A7CD85 /* DHTypes.m */; };\n\t\t430C768B19E52B7F006F0DE0 /* DHTarixProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 430C768A19E52B7F006F0DE0 /* DHTarixProtocol.m */; };\n\t\t430C768D19E55E6E006F0DE0 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 430C768C19E55E6E006F0DE0 /* MobileCoreServices.framework */; };\n\t\t431108D519C7AE6D0050174C /* DHUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 431108D419C7AE6D0050174C /* DHUnarchiver.m */; };\n\t\t431173DC19DA3513007E238E /* DHImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 431173DB19DA3513007E238E /* DHImageCache.m */; };\n\t\t432321E21AA1BBF70045BA77 /* DHRemoteBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 432321E11AA1BBF70045BA77 /* DHRemoteBrowser.m */; };\n\t\t43256F0719F7A6A8003919BA /* DHBrowserTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43256F0619F7A6A8003919BA /* DHBrowserTableView.m */; };\n\t\t43256F0A19F7B4B9003919BA /* UITableView+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43256F0919F7B4B9003919BA /* UITableView+DHUtils.m */; };\n\t\t43280F541DDE4A7B001C2062 /* DHUserRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 43280F531DDE4A7B001C2062 /* DHUserRepo.m */; };\n\t\t43328E3619EDA0D8000D44AE /* scroll_to_current_anchor.js in Resources */ = {isa = PBXBuildFile; fileRef = 43328E3419EDA0D8000D44AE /* scroll_to_current_anchor.js */; };\n\t\t43352F6519C7A69900D4B1D8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 43352F6419C7A69900D4B1D8 /* libz.dylib */; };\n\t\t4338AB601AAF70AF007B85DE /* DHWebProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4338AB5F1AAF70AF007B85DE /* DHWebProgressView.m */; };\n\t\t433BDDAE1DC3BE7700B0B145 /* ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 433BDDAD1DC3BE7700B0B145 /* ionicons.ttf */; };\n\t\t433BDDB21DC3C3AC00B0B145 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 433BDDB11DC3C3AC00B0B145 /* Settings.bundle */; };\n\t\t43418C281A0B63B00014EFB6 /* DHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43418C271A0B63B00014EFB6 /* DHWebView.m */; };\n\t\t4341A1F619BFE89A00AD164A /* DHDocsetTransferrer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4341A1F519BFE89A00AD164A /* DHDocsetTransferrer.m */; };\n\t\t4342C8A519E93FF200BE66A2 /* DHNestedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4342C8A419E93FF200BE66A2 /* DHNestedViewController.m */; };\n\t\t434A77DC1BAE590C00CCF84B /* DHSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 434A77DB1BAE590C00CCF84B /* DHSplitViewController.m */; };\n\t\t434AB15719C2738900791E07 /* DHRepoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 434AB15619C2738900791E07 /* DHRepoTableViewCell.m */; };\n\t\t435145971DEB7035000874A8 /* DHCheatRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 435145961DEB7035000874A8 /* DHCheatRepo.m */; };\n\t\t4351459A1DEB7099000874A8 /* DHCheatRepoList.m in Sources */ = {isa = PBXBuildFile; fileRef = 435145991DEB7099000874A8 /* DHCheatRepoList.m */; };\n\t\t43573F781A997EC7000E6F2D /* DHRemoteServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 43573F771A997EC7000E6F2D /* DHRemoteServer.m */; };\n\t\t4361651D19CCF8500026F08E /* NSTimer+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4361651C19CCF8500026F08E /* NSTimer+DHUtils.m */; };\n\t\t436DF78019FFA926008814F8 /* DHRepoTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 436DF77F19FFA926008814F8 /* DHRepoTableView.m */; };\n\t\t436F3E4319D4F617007BBC25 /* DHRightDetailLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 436F3E4219D4F617007BBC25 /* DHRightDetailLabel.m */; };\n\t\t436FDF5E19FE57CD00553931 /* SourceCodePro-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5819FE57CD00553931 /* SourceCodePro-Black.ttf */; };\n\t\t436FDF5F19FE57CD00553931 /* SourceCodePro-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5919FE57CD00553931 /* SourceCodePro-Bold.ttf */; };\n\t\t436FDF6019FE57CD00553931 /* SourceCodePro-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5A19FE57CD00553931 /* SourceCodePro-ExtraLight.ttf */; };\n\t\t436FDF6119FE57CD00553931 /* SourceCodePro-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5B19FE57CD00553931 /* SourceCodePro-Light.ttf */; };\n\t\t436FDF6219FE57CD00553931 /* SourceCodePro-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5C19FE57CD00553931 /* SourceCodePro-Regular.ttf */; };\n\t\t436FDF6319FE57CD00553931 /* SourceCodePro-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5D19FE57CD00553931 /* SourceCodePro-Semibold.ttf */; };\n\t\t437699A719D8FD3D008B37F4 /* DHTransferFeed.m in Sources */ = {isa = PBXBuildFile; fileRef = 437699A619D8FD3D008B37F4 /* DHTransferFeed.m */; };\n\t\t437AD41719E26C9500BA0FE4 /* DHBrowserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 437AD41619E26C9500BA0FE4 /* DHBrowserCell.xib */; };\n\t\t437B6F8719EBC98A003023E8 /* DHCSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 437B6F8619EBC98A003023E8 /* DHCSS.m */; };\n\t\t437B6F8919EBCBCA003023E8 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 437B6F8819EBCBCA003023E8 /* style.css */; };\n\t\t437FE06619E2AC0D0022ADF4 /* DHTypeBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 437FE06519E2AC0D0022ADF4 /* DHTypeBrowser.m */; };\n\t\t437FE06819E2B4010022ADF4 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 437FE06719E2B4010022ADF4 /* WebKit.framework */; };\n\t\t438525E119C129FC002BAFD1 /* DHFeed.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E019C129FC002BAFD1 /* DHFeed.m */; };\n\t\t438525E519C13E42002BAFD1 /* NSArray+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E419C13E42002BAFD1 /* NSArray+DHUtils.m */; };\n\t\t438525E819C13ECE002BAFD1 /* NSString+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E719C13ECE002BAFD1 /* NSString+DHUtils.m */; };\n\t\t438525EC19C150AC002BAFD1 /* DHDBResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525EB19C150AC002BAFD1 /* DHDBResult.m */; };\n\t\t438B06DF19FFA2DF009A539D /* Launch.xib in Resources */ = {isa = PBXBuildFile; fileRef = 438B06DE19FFA2DF009A539D /* Launch.xib */; };\n\t\t438B45B91A10BB6F0047A156 /* DHJavaScriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 438B45B81A10BB6F0047A156 /* DHJavaScriptBridge.m */; };\n\t\t438D58C219E575D600012881 /* DHLoadingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 438D58C119E575D600012881 /* DHLoadingCell.xib */; };\n\t\t438E864A1D1D4A3C00FB6CD8 /* apple.js in Resources */ = {isa = PBXBuildFile; fileRef = 438E86491D1D4A3C00FB6CD8 /* apple.js */; };\n\t\t438F622419D5E81A00AF71BC /* NSFileManager+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438F622319D5E81A00AF71BC /* NSFileManager+DHUtils.m */; };\n\t\t439051F619E67D840083A55E /* DHBrowserTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051F519E67D840083A55E /* DHBrowserTableViewCell.m */; };\n\t\t439051F919E684160083A55E /* DHEntryBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051F819E684160083A55E /* DHEntryBrowser.m */; };\n\t\t439051FC19E68FE20083A55E /* NSString+GTM.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051FB19E68FE20083A55E /* NSString+GTM.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; }; };\n\t\t4390520019E692D90083A55E /* DHDBResultSorter.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051FF19E692D90083A55E /* DHDBResultSorter.m */; };\n\t\t43915EE919C5D2FD002806FF /* UIView+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43915EE819C5D2FD002806FF /* UIView+DHUtils.m */; };\n\t\t4398D34619BF55B500457CAF /* DHPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 4398D34519BF55B500457CAF /* DHPreferences.m */; };\n\t\t43A1C2642001700600512DB3 /* Apple_Docs_Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t43A1C269200175B900512DB3 /* DHAppleAPIProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A1C268200175B900512DB3 /* DHAppleAPIProtocol.m */; };\n\t\t43A1C26A200175B900512DB3 /* DHAppleAPIProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A1C268200175B900512DB3 /* DHAppleAPIProtocol.m */; };\n\t\t43A1C26D200175E500512DB3 /* Apple_Docs_Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */; };\n\t\t43A1C26E200175E500512DB3 /* Apple_Docs_Framework.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };\n\t\t43A356CB19FFCE4D0073D143 /* UIViewController+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A356CA19FFCE4D0073D143 /* UIViewController+DHUtils.m */; };\n\t\t43A6D9C919E0D69700780BC8 /* DHDocsetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A6D9C819E0D69700780BC8 /* DHDocsetManager.m */; };\n\t\t43AAB7821AAE776800DB76F3 /* DHRemoteProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AAB7811AAE776800DB76F3 /* DHRemoteProtocol.m */; };\n\t\t43AB65341ED19D2F00A6EC18 /* DHAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EF519BB8D87007E594D /* DHAppDelegate.m */; };\n\t\t43AB65351ED19D2F00A6EC18 /* DHType.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3D019C668BC00A7CD85 /* DHType.m */; };\n\t\t43AB65361ED19D2F00A6EC18 /* UIViewController+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A356CA19FFCE4D0073D143 /* UIViewController+DHUtils.m */; };\n\t\t43AB65371ED19D2F00A6EC18 /* NSObject+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BB044519ED1BB8000FBC0D /* NSObject+DHUtils.m */; };\n\t\t43AB65381ED19D2F00A6EC18 /* UIView+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43915EE819C5D2FD002806FF /* UIView+DHUtils.m */; };\n\t\t43AB65391ED19D2F00A6EC18 /* NSString+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E719C13ECE002BAFD1 /* NSString+DHUtils.m */; };\n\t\t43AB653A1ED19D2F00A6EC18 /* FMDatabase.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B319C6584F00A7CD85 /* FMDatabase.m */; };\n\t\t43AB653B1ED19D2F00A6EC18 /* DHPreferences.m in Sources */ = {isa = PBXBuildFile; fileRef = 4398D34519BF55B500457CAF /* DHPreferences.m */; };\n\t\t43AB653C1ED19D2F00A6EC18 /* DHTypeBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 437FE06519E2AC0D0022ADF4 /* DHTypeBrowser.m */; };\n\t\t43AB653D1ED19D2F00A6EC18 /* DHCheatRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 435145961DEB7035000874A8 /* DHCheatRepo.m */; };\n\t\t43AB653E1ED19D2F00A6EC18 /* NSURL+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CF8AF019D5DA060010E698 /* NSURL+DHUtils.m */; };\n\t\t43AB653F1ED19D2F00A6EC18 /* DHFeedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19E19C52E3400A0EBEC /* DHFeedResult.m */; };\n\t\t43AB65401ED19D2F00A6EC18 /* DHWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2F0119BB8D87007E594D /* DHWebViewController.m */; };\n\t\t43AB65411ED19D2F00A6EC18 /* NSData+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DCAEB71A9C3C8500A28A95 /* NSData+DHUtils.m */; };\n\t\t43AB65421ED19D2F00A6EC18 /* FMDatabaseAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B519C6584F00A7CD85 /* FMDatabaseAdditions.m */; };\n\t\t43AB65431ED19D2F00A6EC18 /* DHRepoTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 436DF77F19FFA926008814F8 /* DHRepoTableView.m */; };\n\t\t43AB65441ED19D2F00A6EC18 /* DHBlockProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F25F9B19EBDEF30025CDC4 /* DHBlockProtocol.m */; };\n\t\t43AB65451ED19D2F00A6EC18 /* DHRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956B19BFD57500F8611B /* DHRepo.m */; };\n\t\t43AB65461ED19D2F00A6EC18 /* DHWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D7E4EF1BB4C62E00FC1DEF /* DHWindow.m */; };\n\t\t43AB65471ED19D2F00A6EC18 /* DHAppUpdateChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BD6BF31DCE379B0005A1E7 /* DHAppUpdateChecker.m */; };\n\t\t43AB65481ED19D2F00A6EC18 /* NSString+GTM.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051FB19E68FE20083A55E /* NSString+GTM.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc\"; }; };\n\t\t43AB65491ED19D2F00A6EC18 /* DHDBSearcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06619E7D68100C22AF5 /* DHDBSearcher.m */; };\n\t\t43AB654A1ED19D2F00A6EC18 /* DHRemoteImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DFED821A9EE104008F7795 /* DHRemoteImage.m */; };\n\t\t43AB654B1ED19D2F00A6EC18 /* DHAppleActiveLanguage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0E141D1861CE00F0D8A0 /* DHAppleActiveLanguage.m */; };\n\t\t43AB654C1ED19D2F00A6EC18 /* DHBrowserTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43256F0619F7A6A8003919BA /* DHBrowserTableView.m */; };\n\t\t43AB654D1ED19D2F00A6EC18 /* DHRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DFED7F1A9EBEA5008F7795 /* DHRemote.m */; };\n\t\t43AB654E1ED19D2F00A6EC18 /* DHWebProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4338AB5F1AAF70AF007B85DE /* DHWebProgressView.m */; };\n\t\t43AB654F1ED19D2F00A6EC18 /* DHDocset.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3C619C6590000A7CD85 /* DHDocset.m */; };\n\t\t43AB65501ED19D2F00A6EC18 /* UITableView+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43256F0919F7B4B9003919BA /* UITableView+DHUtils.m */; };\n\t\t43AB65511ED19D2F00A6EC18 /* NSArray+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E419C13E42002BAFD1 /* NSArray+DHUtils.m */; };\n\t\t43AB65521ED19D2F00A6EC18 /* DHDBNestedResultSorter.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06919E7DF3900C22AF5 /* DHDBNestedResultSorter.m */; };\n\t\t43AB65531ED19D2F00A6EC18 /* DHCSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 437B6F8619EBC98A003023E8 /* DHCSS.m */; };\n\t\t43AB65541ED19D2F00A6EC18 /* DHDBResultSorter.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051FF19E692D90083A55E /* DHDBResultSorter.m */; };\n\t\t43AB65551ED19D2F00A6EC18 /* DHRemoteBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 432321E11AA1BBF70045BA77 /* DHRemoteBrowser.m */; };\n\t\t43AB65561ED19D2F00A6EC18 /* FMDatabaseQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3BB19C6584F00A7CD85 /* FMDatabaseQueue.m */; };\n\t\t43AB65571ED19D2F00A6EC18 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EF119BB8D87007E594D /* main.m */; };\n\t\t43AB65581ED19D2F00A6EC18 /* DHTocBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D28EBA19F97D5500FDC5EE /* DHTocBrowser.m */; };\n\t\t43AB65591ED19D2F00A6EC18 /* DHDocsetDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956E19BFDBDC00F8611B /* DHDocsetDownloader.m */; };\n\t\t43AB655A1ED19D2F00A6EC18 /* UIButton+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7527219CD1C2000D76F58 /* UIButton+DHUtils.m */; };\n\t\t43AB655B1ED19D2F00A6EC18 /* DHSplitViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 434A77DB1BAE590C00CCF84B /* DHSplitViewController.m */; };\n\t\t43AB655C1ED19D2F00A6EC18 /* DHWebView.m in Sources */ = {isa = PBXBuildFile; fileRef = 43418C271A0B63B00014EFB6 /* DHWebView.m */; };\n\t\t43AB655D1ED19D2F00A6EC18 /* DHBrowserTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051F519E67D840083A55E /* DHBrowserTableViewCell.m */; };\n\t\t43AB655E1ED19D2F00A6EC18 /* DHDocsetManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 43A6D9C819E0D69700780BC8 /* DHDocsetManager.m */; };\n\t\t43AB655F1ED19D2F00A6EC18 /* DHTransferFeed.m in Sources */ = {isa = PBXBuildFile; fileRef = 437699A619D8FD3D008B37F4 /* DHTransferFeed.m */; };\n\t\t43AB65601ED19D2F00A6EC18 /* NSFileManager+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 438F622319D5E81A00AF71BC /* NSFileManager+DHUtils.m */; };\n\t\t43AB65611ED19D2F00A6EC18 /* whitespace_tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B119C6584F00A7CD85 /* whitespace_tokenizer.c */; };\n\t\t43AB65621ED19D2F00A6EC18 /* DHJavaScriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 438B45B81A10BB6F0047A156 /* DHJavaScriptBridge.m */; };\n\t\t43AB65631ED19D2F00A6EC18 /* NSTimer+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 4361651C19CCF8500026F08E /* NSTimer+DHUtils.m */; };\n\t\t43AB65641ED19D2F00A6EC18 /* DHTarixProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 430C768A19E52B7F006F0DE0 /* DHTarixProtocol.m */; };\n\t\t43AB65651ED19D2F00A6EC18 /* DHTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3D319C668C200A7CD85 /* DHTypes.m */; };\n\t\t43AB65661ED19D2F00A6EC18 /* FMDatabasePool.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B919C6584F00A7CD85 /* FMDatabasePool.m */; };\n\t\t43AB65671ED19D2F00A6EC18 /* DHDocsetTransferrer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4341A1F519BFE89A00AD164A /* DHDocsetTransferrer.m */; };\n\t\t43AB65681ED19D2F00A6EC18 /* DHSearchDisplayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F760B119EA61B5002BD8A6 /* DHSearchDisplayController.m */; settings = {COMPILER_FLAGS = \"-w\"; }; };\n\t\t43AB65691ED19D2F00A6EC18 /* DHNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DF51931A07B4C0006AB295 /* DHNavigationController.m */; };\n\t\t43AB656A1ED19D2F00A6EC18 /* DHRepoTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 434AB15619C2738900791E07 /* DHRepoTableViewCell.m */; };\n\t\t43AB656B1ED19D2F00A6EC18 /* DHFeed.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525E019C129FC002BAFD1 /* DHFeed.m */; };\n\t\t43AB656C1ED19D2F00A6EC18 /* DHRemoteServer.m in Sources */ = {isa = PBXBuildFile; fileRef = 43573F771A997EC7000E6F2D /* DHRemoteServer.m */; };\n\t\t43AB656D1ED19D2F00A6EC18 /* DHLatencyTestResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19919C51E9C00A0EBEC /* DHLatencyTestResult.m */; };\n\t\t43AB656E1ED19D2F00A6EC18 /* DHDBSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06C19E7E88400C22AF5 /* DHDBSearchController.m */; };\n\t\t43AB656F1ED19D2F00A6EC18 /* DHCheatRepoList.m in Sources */ = {isa = PBXBuildFile; fileRef = 435145991DEB7099000874A8 /* DHCheatRepoList.m */; };\n\t\t43AB65701ED19D2F00A6EC18 /* DHQueuedDB.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06319E7CEC500C22AF5 /* DHQueuedDB.m */; };\n\t\t43AB65711ED19D2F00A6EC18 /* FMResultSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3B719C6584F00A7CD85 /* FMResultSet.m */; };\n\t\t43AB65721ED19D2F00A6EC18 /* DHUserRepoList.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FC34011DE784C40089F134 /* DHUserRepoList.m */; };\n\t\t43AB65731ED19D2F00A6EC18 /* DHUserRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 43280F531DDE4A7B001C2062 /* DHUserRepo.m */; };\n\t\t43AB65741ED19D2F00A6EC18 /* DHNavigationAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956819BFD19900F8611B /* DHNavigationAnimator.m */; };\n\t\t43AB65751ED19D2F00A6EC18 /* DHEntryBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 439051F819E684160083A55E /* DHEntryBrowser.m */; };\n\t\t43AB65761ED19D2F00A6EC18 /* DHUnarchiver.m in Sources */ = {isa = PBXBuildFile; fileRef = 431108D419C7AE6D0050174C /* DHUnarchiver.m */; };\n\t\t43AB65771ED19D2F00A6EC18 /* DHDocsetIndexer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4303A3CC19C65E6A00A7CD85 /* DHDocsetIndexer.m */; };\n\t\t43AB65781ED19D2F00A6EC18 /* DHRightDetailLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 436F3E4219D4F617007BBC25 /* DHRightDetailLabel.m */; };\n\t\t43AB65791ED19D2F00A6EC18 /* DHTarixIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F84A7519EEBD1A008FE85C /* DHTarixIndex.m */; };\n\t\t43AB657A1ED19D2F00A6EC18 /* DHJavaScript.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BB043819ED07DD000FBC0D /* DHJavaScript.m */; };\n\t\t43AB657B1ED19D2F00A6EC18 /* DHDBResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 438525EB19C150AC002BAFD1 /* DHDBResult.m */; };\n\t\t43AB657C1ED19D2F00A6EC18 /* DHNestedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4342C8A419E93FF200BE66A2 /* DHNestedViewController.m */; };\n\t\t43AB657D1ED19D2F00A6EC18 /* DHFileDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD1A119C5309300A0EBEC /* DHFileDownload.m */; };\n\t\t43AB657E1ED19D2F00A6EC18 /* DHLatencyTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19719C51E9C00A0EBEC /* DHLatencyTester.m */; };\n\t\t43AB657F1ED19D2F00A6EC18 /* DHImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 431173DB19DA3513007E238E /* DHImageCache.m */; };\n\t\t43AB65801ED19D2F00A6EC18 /* DHDocsetBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EFE19BB8D87007E594D /* DHDocsetBrowser.m */; };\n\t\t43AB65811ED19D2F00A6EC18 /* DHRemoteProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AAB7811AAE776800DB76F3 /* DHRemoteProtocol.m */; };\n\t\t43AB65831ED19D2F00A6EC18 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43BB043E19ED0B19000FBC0D /* JavaScriptCore.framework */; };\n\t\t43AB65841ED19D2F00A6EC18 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 430C768C19E55E6E006F0DE0 /* MobileCoreServices.framework */; };\n\t\t43AB65851ED19D2F00A6EC18 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 437FE06719E2B4010022ADF4 /* WebKit.framework */; };\n\t\t43AB65861ED19D2F00A6EC18 /* libarchive.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43EE932919CD079600FFF30C /* libarchive.a */; };\n\t\t43AB65871ED19D2F00A6EC18 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 43352F6419C7A69900D4B1D8 /* libz.dylib */; };\n\t\t43AB65881ED19D2F00A6EC18 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4303A3C319C658B000A7CD85 /* libsqlite3.dylib */; };\n\t\t43AB65891ED19D2F00A6EC18 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE719BB8D87007E594D /* CoreGraphics.framework */; };\n\t\t43AB658A1ED19D2F00A6EC18 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE919BB8D87007E594D /* UIKit.framework */; };\n\t\t43AB658B1ED19D2F00A6EC18 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE519BB8D87007E594D /* Foundation.framework */; };\n\t\t43AB658E1ED19D2F00A6EC18 /* SourceCodePro-ExtraLight.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5A19FE57CD00553931 /* SourceCodePro-ExtraLight.ttf */; };\n\t\t43AB658F1ED19D2F00A6EC18 /* SourceCodePro-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5C19FE57CD00553931 /* SourceCodePro-Regular.ttf */; };\n\t\t43AB65901ED19D2F00A6EC18 /* on_page_load.js in Resources */ = {isa = PBXBuildFile; fileRef = 43EED91B1B607DB800F3DC35 /* on_page_load.js */; };\n\t\t43AB65911ED19D2F00A6EC18 /* ClassRuby.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045019ED48BD000FBC0D /* ClassRuby.png */; };\n\t\t43AB65921ED19D2F00A6EC18 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2EFA19BB8D87007E594D /* Main.storyboard */; };\n\t\t43AB65931ED19D2F00A6EC18 /* Launch.xib in Resources */ = {isa = PBXBuildFile; fileRef = 438B06DE19FFA2DF009A539D /* Launch.xib */; };\n\t\t43AB65941ED19D2F00A6EC18 /* cocoa.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BB044019ED0C86000FBC0D /* cocoa.js */; };\n\t\t43AB65951ED19D2F00A6EC18 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2F0319BB8D87007E594D /* Images.xcassets */; };\n\t\t43AB65961ED19D2F00A6EC18 /* DHRepoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 43F7527419CD31D100D76F58 /* DHRepoCell.xib */; };\n\t\t43AB65971ED19D2F00A6EC18 /* SourceCodePro-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5819FE57CD00553931 /* SourceCodePro-Black.ttf */; };\n\t\t43AB65981ED19D2F00A6EC18 /* DHLoadingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 438D58C119E575D600012881 /* DHLoadingCell.xib */; };\n\t\t43AB65991ED19D2F00A6EC18 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 433BDDB11DC3C3AC00B0B145 /* Settings.bundle */; };\n\t\t43AB659A1ED19D2F00A6EC18 /* SourceCodePro-Semibold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5D19FE57CD00553931 /* SourceCodePro-Semibold.ttf */; };\n\t\t43AB659B1ED19D2F00A6EC18 /* ruby.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BB044B19ED3E78000FBC0D /* ruby.js */; };\n\t\t43AB659C1ED19D2F00A6EC18 /* SourceCodePro-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5919FE57CD00553931 /* SourceCodePro-Bold.ttf */; };\n\t\t43AB659D1ED19D2F00A6EC18 /* SourceCodePro-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 436FDF5B19FE57CD00553931 /* SourceCodePro-Light.ttf */; };\n\t\t43AB659E1ED19D2F00A6EC18 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 43F70ABF19CBBD20000849C8 /* Defaults.plist */; };\n\t\t43AB659F1ED19D2F00A6EC18 /* ModuleRuby.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045219ED48BD000FBC0D /* ModuleRuby.png */; };\n\t\t43AB65A01ED19D2F00A6EC18 /* home.html in Resources */ = {isa = PBXBuildFile; fileRef = 43AC700019E4530400E0DB43 /* home.html */; };\n\t\t43AB65A11ED19D2F00A6EC18 /* style.css in Resources */ = {isa = PBXBuildFile; fileRef = 437B6F8819EBCBCA003023E8 /* style.css */; };\n\t\t43AB65A21ED19D2F00A6EC18 /* DHBrowserCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 437AD41619E26C9500BA0FE4 /* DHBrowserCell.xib */; };\n\t\t43AB65A31ED19D2F00A6EC18 /* hash_change_notifier.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BD91ED1AB31A9E001058C4 /* hash_change_notifier.js */; };\n\t\t43AB65A41ED19D2F00A6EC18 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2EEE19BB8D87007E594D /* InfoPlist.strings */; };\n\t\t43AB65A51ED19D2F00A6EC18 /* ModuleRubyRetina.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045319ED48BD000FBC0D /* ModuleRubyRetina.png */; };\n\t\t43AB65A61ED19D2F00A6EC18 /* docset_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 26480C2A1E2E9ABB00E3145E /* docset_icon.png */; };\n\t\t43AB65A71ED19D2F00A6EC18 /* ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 433BDDAD1DC3BE7700B0B145 /* ionicons.ttf */; };\n\t\t43AB65A81ED19D2F00A6EC18 /* ClassRubyRetina.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045119ED48BD000FBC0D /* ClassRubyRetina.png */; };\n\t\t43AB65A91ED19D2F00A6EC18 /* apple.js in Resources */ = {isa = PBXBuildFile; fileRef = 438E86491D1D4A3C00FB6CD8 /* apple.js */; };\n\t\t43AB65AA1ED19D2F00A6EC18 /* scroll_to_current_anchor.js in Resources */ = {isa = PBXBuildFile; fileRef = 43328E3419EDA0D8000D44AE /* scroll_to_current_anchor.js */; };\n\t\t43AB65AB1ED19D2F00A6EC18 /* msdn.js in Resources */ = {isa = PBXBuildFile; fileRef = 43B98F6219EE740F00C46BD9 /* msdn.js */; };\n\t\t43AC700119E4530400E0DB43 /* home.html in Resources */ = {isa = PBXBuildFile; fileRef = 43AC700019E4530400E0DB43 /* home.html */; };\n\t\t43AF0E151D1861CE00F0D8A0 /* DHAppleActiveLanguage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43AF0E141D1861CE00F0D8A0 /* DHAppleActiveLanguage.m */; };\n\t\t43B0956919BFD19900F8611B /* DHNavigationAnimator.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956819BFD19900F8611B /* DHNavigationAnimator.m */; };\n\t\t43B0956C19BFD57500F8611B /* DHRepo.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956B19BFD57500F8611B /* DHRepo.m */; };\n\t\t43B0956F19BFDBDC00F8611B /* DHDocsetDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 43B0956E19BFDBDC00F8611B /* DHDocsetDownloader.m */; };\n\t\t43B98F6419EE740F00C46BD9 /* msdn.js in Resources */ = {isa = PBXBuildFile; fileRef = 43B98F6219EE740F00C46BD9 /* msdn.js */; };\n\t\t43BB043919ED07DD000FBC0D /* DHJavaScript.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BB043819ED07DD000FBC0D /* DHJavaScript.m */; };\n\t\t43BB043F19ED0B19000FBC0D /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43BB043E19ED0B19000FBC0D /* JavaScriptCore.framework */; };\n\t\t43BB044219ED0C86000FBC0D /* cocoa.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BB044019ED0C86000FBC0D /* cocoa.js */; };\n\t\t43BB044619ED1BB8000FBC0D /* NSObject+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BB044519ED1BB8000FBC0D /* NSObject+DHUtils.m */; };\n\t\t43BB044D19ED3E78000FBC0D /* ruby.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BB044B19ED3E78000FBC0D /* ruby.js */; };\n\t\t43BB045419ED48BD000FBC0D /* ClassRuby.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045019ED48BD000FBC0D /* ClassRuby.png */; };\n\t\t43BB045519ED48BD000FBC0D /* ClassRubyRetina.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045119ED48BD000FBC0D /* ClassRubyRetina.png */; };\n\t\t43BB045619ED48BD000FBC0D /* ModuleRuby.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045219ED48BD000FBC0D /* ModuleRuby.png */; };\n\t\t43BB045719ED48BD000FBC0D /* ModuleRubyRetina.png in Resources */ = {isa = PBXBuildFile; fileRef = 43BB045319ED48BD000FBC0D /* ModuleRubyRetina.png */; };\n\t\t43BCC3E4200442CA00DE24FE /* Apple_Docs_Framework.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */; };\n\t\t43BD6BF41DCE379B0005A1E7 /* DHAppUpdateChecker.m in Sources */ = {isa = PBXBuildFile; fileRef = 43BD6BF31DCE379B0005A1E7 /* DHAppUpdateChecker.m */; };\n\t\t43BD91EE1AB31A9E001058C4 /* hash_change_notifier.js in Resources */ = {isa = PBXBuildFile; fileRef = 43BD91ED1AB31A9E001058C4 /* hash_change_notifier.js */; };\n\t\t43CF8AF119D5DA060010E698 /* NSURL+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43CF8AF019D5DA060010E698 /* NSURL+DHUtils.m */; };\n\t\t43D28EBB19F97D5500FDC5EE /* DHTocBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D28EBA19F97D5500FDC5EE /* DHTocBrowser.m */; };\n\t\t43D4F06419E7CEC500C22AF5 /* DHQueuedDB.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06319E7CEC500C22AF5 /* DHQueuedDB.m */; };\n\t\t43D4F06719E7D68100C22AF5 /* DHDBSearcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06619E7D68100C22AF5 /* DHDBSearcher.m */; };\n\t\t43D4F06A19E7DF3900C22AF5 /* DHDBNestedResultSorter.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06919E7DF3900C22AF5 /* DHDBNestedResultSorter.m */; };\n\t\t43D4F06D19E7E88400C22AF5 /* DHDBSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D4F06C19E7E88400C22AF5 /* DHDBSearchController.m */; };\n\t\t43D7E4F01BB4C62E00FC1DEF /* DHWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 43D7E4EF1BB4C62E00FC1DEF /* DHWindow.m */; };\n\t\t43DCAEB81A9C3C8500A28A95 /* NSData+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DCAEB71A9C3C8500A28A95 /* NSData+DHUtils.m */; };\n\t\t43DF51941A07B4C0006AB295 /* DHNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DF51931A07B4C0006AB295 /* DHNavigationController.m */; };\n\t\t43DFED801A9EBEA5008F7795 /* DHRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DFED7F1A9EBEA5008F7795 /* DHRemote.m */; };\n\t\t43DFED831A9EE104008F7795 /* DHRemoteImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DFED821A9EE104008F7795 /* DHRemoteImage.m */; };\n\t\t43EDD19A19C51E9C00A0EBEC /* DHLatencyTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19719C51E9C00A0EBEC /* DHLatencyTester.m */; };\n\t\t43EDD19B19C51E9C00A0EBEC /* DHLatencyTestResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19919C51E9C00A0EBEC /* DHLatencyTestResult.m */; };\n\t\t43EDD19F19C52E3400A0EBEC /* DHFeedResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD19E19C52E3400A0EBEC /* DHFeedResult.m */; };\n\t\t43EDD1A219C5309300A0EBEC /* DHFileDownload.m in Sources */ = {isa = PBXBuildFile; fileRef = 43EDD1A119C5309300A0EBEC /* DHFileDownload.m */; };\n\t\t43EE932A19CD079600FFF30C /* libarchive.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 43EE932919CD079600FFF30C /* libarchive.a */; };\n\t\t43EED91C1B607DB800F3DC35 /* on_page_load.js in Resources */ = {isa = PBXBuildFile; fileRef = 43EED91B1B607DB800F3DC35 /* on_page_load.js */; };\n\t\t43F25F9C19EBDEF30025CDC4 /* DHBlockProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F25F9B19EBDEF30025CDC4 /* DHBlockProtocol.m */; };\n\t\t43F31AAE200BB52F0082066C /* DHDocsetBrowserViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C39BFF200A836D00734571 /* DHDocsetBrowserViewModel.m */; };\n\t\t43F70AC019CBBD20000849C8 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 43F70ABF19CBBD20000849C8 /* Defaults.plist */; };\n\t\t43F7527319CD1C2000D76F58 /* UIButton+DHUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F7527219CD1C2000D76F58 /* UIButton+DHUtils.m */; };\n\t\t43F7527519CD31D100D76F58 /* DHRepoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 43F7527419CD31D100D76F58 /* DHRepoCell.xib */; };\n\t\t43F760B219EA61B5002BD8A6 /* DHSearchDisplayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F760B119EA61B5002BD8A6 /* DHSearchDisplayController.m */; settings = {COMPILER_FLAGS = \"-w\"; }; };\n\t\t43F84A7619EEBD1A008FE85C /* DHTarixIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F84A7519EEBD1A008FE85C /* DHTarixIndex.m */; };\n\t\t43FC34041DE784C40089F134 /* DHUserRepoList.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FC34011DE784C40089F134 /* DHUserRepoList.m */; };\n\t\t43FD2EE619BB8D87007E594D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE519BB8D87007E594D /* Foundation.framework */; };\n\t\t43FD2EE819BB8D87007E594D /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE719BB8D87007E594D /* CoreGraphics.framework */; };\n\t\t43FD2EEA19BB8D87007E594D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43FD2EE919BB8D87007E594D /* UIKit.framework */; };\n\t\t43FD2EF019BB8D87007E594D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2EEE19BB8D87007E594D /* InfoPlist.strings */; };\n\t\t43FD2EF219BB8D87007E594D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EF119BB8D87007E594D /* main.m */; };\n\t\t43FD2EF619BB8D87007E594D /* DHAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EF519BB8D87007E594D /* DHAppDelegate.m */; };\n\t\t43FD2EFC19BB8D87007E594D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2EFA19BB8D87007E594D /* Main.storyboard */; };\n\t\t43FD2EFF19BB8D87007E594D /* DHDocsetBrowser.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2EFE19BB8D87007E594D /* DHDocsetBrowser.m */; };\n\t\t43FD2F0219BB8D87007E594D /* DHWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43FD2F0119BB8D87007E594D /* DHWebViewController.m */; };\n\t\t43FD2F0419BB8D87007E594D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 43FD2F0319BB8D87007E594D /* Images.xcassets */; };\n\t\t45D28F8ABD1FC392B1930467 /* libPods-Dash.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A2364AD2032B0714BCD2265 /* libPods-Dash.a */; };\n\t\tF5C39C00200A836D00734571 /* DHDocsetBrowserViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C39BFF200A836D00734571 /* DHDocsetBrowserViewModel.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t43A1C24E200161D100512DB3 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t43A1C2642001700600512DB3 /* Apple_Docs_Framework.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43A1C26F200175E500512DB3 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t\t43A1C26E200175E500512DB3 /* Apple_Docs_Framework.framework in Embed Frameworks */,\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t26480C2A1E2E9ABB00E3145E /* docset_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = docset_icon.png; sourceTree = \"<group>\"; };\n\t\t4303A3B019C6584F00A7CD85 /* whitespace_tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = whitespace_tokenizer.h; sourceTree = \"<group>\"; };\n\t\t4303A3B119C6584F00A7CD85 /* whitespace_tokenizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = whitespace_tokenizer.c; sourceTree = \"<group>\"; };\n\t\t4303A3B219C6584F00A7CD85 /* FMDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabase.h; sourceTree = \"<group>\"; };\n\t\t4303A3B319C6584F00A7CD85 /* FMDatabase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabase.m; sourceTree = \"<group>\"; };\n\t\t4303A3B419C6584F00A7CD85 /* FMDatabaseAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseAdditions.h; sourceTree = \"<group>\"; };\n\t\t4303A3B519C6584F00A7CD85 /* FMDatabaseAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseAdditions.m; sourceTree = \"<group>\"; };\n\t\t4303A3B619C6584F00A7CD85 /* FMResultSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMResultSet.h; sourceTree = \"<group>\"; };\n\t\t4303A3B719C6584F00A7CD85 /* FMResultSet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMResultSet.m; sourceTree = \"<group>\"; };\n\t\t4303A3B819C6584F00A7CD85 /* FMDatabasePool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabasePool.h; sourceTree = \"<group>\"; };\n\t\t4303A3B919C6584F00A7CD85 /* FMDatabasePool.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabasePool.m; sourceTree = \"<group>\"; };\n\t\t4303A3BA19C6584F00A7CD85 /* FMDatabaseQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FMDatabaseQueue.h; sourceTree = \"<group>\"; };\n\t\t4303A3BB19C6584F00A7CD85 /* FMDatabaseQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FMDatabaseQueue.m; sourceTree = \"<group>\"; };\n\t\t4303A3C319C658B000A7CD85 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };\n\t\t4303A3C519C6590000A7CD85 /* DHDocset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDocset.h; sourceTree = \"<group>\"; };\n\t\t4303A3C619C6590000A7CD85 /* DHDocset.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDocset.m; sourceTree = \"<group>\"; };\n\t\t4303A3CB19C65E6A00A7CD85 /* DHDocsetIndexer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDocsetIndexer.h; sourceTree = \"<group>\"; };\n\t\t4303A3CC19C65E6A00A7CD85 /* DHDocsetIndexer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDocsetIndexer.m; sourceTree = \"<group>\"; };\n\t\t4303A3CF19C668BC00A7CD85 /* DHType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHType.h; sourceTree = \"<group>\"; };\n\t\t4303A3D019C668BC00A7CD85 /* DHType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHType.m; sourceTree = \"<group>\"; };\n\t\t4303A3D219C668C200A7CD85 /* DHTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTypes.h; sourceTree = \"<group>\"; };\n\t\t4303A3D319C668C200A7CD85 /* DHTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTypes.m; sourceTree = \"<group>\"; };\n\t\t430C768919E52B7F006F0DE0 /* DHTarixProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTarixProtocol.h; sourceTree = \"<group>\"; };\n\t\t430C768A19E52B7F006F0DE0 /* DHTarixProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTarixProtocol.m; sourceTree = \"<group>\"; };\n\t\t430C768C19E55E6E006F0DE0 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };\n\t\t431108D319C7AE6D0050174C /* DHUnarchiver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHUnarchiver.h; sourceTree = \"<group>\"; };\n\t\t431108D419C7AE6D0050174C /* DHUnarchiver.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHUnarchiver.m; sourceTree = \"<group>\"; };\n\t\t431173DA19DA3513007E238E /* DHImageCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHImageCache.h; sourceTree = \"<group>\"; };\n\t\t431173DB19DA3513007E238E /* DHImageCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHImageCache.m; sourceTree = \"<group>\"; };\n\t\t432321E01AA1BBF70045BA77 /* DHRemoteBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRemoteBrowser.h; sourceTree = \"<group>\"; };\n\t\t432321E11AA1BBF70045BA77 /* DHRemoteBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRemoteBrowser.m; sourceTree = \"<group>\"; };\n\t\t43256F0519F7A6A8003919BA /* DHBrowserTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHBrowserTableView.h; sourceTree = \"<group>\"; };\n\t\t43256F0619F7A6A8003919BA /* DHBrowserTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHBrowserTableView.m; sourceTree = \"<group>\"; };\n\t\t43256F0819F7B4B9003919BA /* UITableView+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UITableView+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43256F0919F7B4B9003919BA /* UITableView+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UITableView+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43280F521DDE4A7B001C2062 /* DHUserRepo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHUserRepo.h; sourceTree = \"<group>\"; };\n\t\t43280F531DDE4A7B001C2062 /* DHUserRepo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHUserRepo.m; sourceTree = \"<group>\"; };\n\t\t43328E3419EDA0D8000D44AE /* scroll_to_current_anchor.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = scroll_to_current_anchor.js; sourceTree = \"<group>\"; };\n\t\t43352F5F19C7A67200D4B1D8 /* archive_entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = archive_entry.h; sourceTree = \"<group>\"; };\n\t\t43352F6019C7A67200D4B1D8 /* archive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = archive.h; sourceTree = \"<group>\"; };\n\t\t43352F6419C7A69900D4B1D8 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; };\n\t\t4338AB5E1AAF70AF007B85DE /* DHWebProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHWebProgressView.h; sourceTree = \"<group>\"; };\n\t\t4338AB5F1AAF70AF007B85DE /* DHWebProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHWebProgressView.m; sourceTree = \"<group>\"; };\n\t\t433BDDAD1DC3BE7700B0B145 /* ionicons.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = ionicons.ttf; sourceTree = \"<group>\"; };\n\t\t433BDDB11DC3C3AC00B0B145 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.plug-in\"; path = Settings.bundle; sourceTree = \"<group>\"; };\n\t\t43418C261A0B63B00014EFB6 /* DHWebView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHWebView.h; sourceTree = \"<group>\"; };\n\t\t43418C271A0B63B00014EFB6 /* DHWebView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHWebView.m; sourceTree = \"<group>\"; };\n\t\t4341A1F419BFE89A00AD164A /* DHDocsetTransferrer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDocsetTransferrer.h; sourceTree = \"<group>\"; };\n\t\t4341A1F519BFE89A00AD164A /* DHDocsetTransferrer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDocsetTransferrer.m; sourceTree = \"<group>\"; };\n\t\t4342C8A319E93FF200BE66A2 /* DHNestedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHNestedViewController.h; sourceTree = \"<group>\"; };\n\t\t4342C8A419E93FF200BE66A2 /* DHNestedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHNestedViewController.m; sourceTree = \"<group>\"; };\n\t\t434A77DA1BAE590C00CCF84B /* DHSplitViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHSplitViewController.h; sourceTree = \"<group>\"; };\n\t\t434A77DB1BAE590C00CCF84B /* DHSplitViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHSplitViewController.m; sourceTree = \"<group>\"; };\n\t\t434AB15519C2738900791E07 /* DHRepoTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRepoTableViewCell.h; sourceTree = \"<group>\"; };\n\t\t434AB15619C2738900791E07 /* DHRepoTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRepoTableViewCell.m; sourceTree = \"<group>\"; };\n\t\t435145951DEB7035000874A8 /* DHCheatRepo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHCheatRepo.h; sourceTree = \"<group>\"; };\n\t\t435145961DEB7035000874A8 /* DHCheatRepo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHCheatRepo.m; sourceTree = \"<group>\"; };\n\t\t435145981DEB7099000874A8 /* DHCheatRepoList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHCheatRepoList.h; sourceTree = \"<group>\"; };\n\t\t435145991DEB7099000874A8 /* DHCheatRepoList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHCheatRepoList.m; sourceTree = \"<group>\"; };\n\t\t43573F761A997EC7000E6F2D /* DHRemoteServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRemoteServer.h; sourceTree = \"<group>\"; };\n\t\t43573F771A997EC7000E6F2D /* DHRemoteServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRemoteServer.m; sourceTree = \"<group>\"; };\n\t\t4361651B19CCF8500026F08E /* NSTimer+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSTimer+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t4361651C19CCF8500026F08E /* NSTimer+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSTimer+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t436DF77E19FFA926008814F8 /* DHRepoTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRepoTableView.h; sourceTree = \"<group>\"; };\n\t\t436DF77F19FFA926008814F8 /* DHRepoTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRepoTableView.m; sourceTree = \"<group>\"; };\n\t\t436F3E4119D4F617007BBC25 /* DHRightDetailLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRightDetailLabel.h; sourceTree = \"<group>\"; };\n\t\t436F3E4219D4F617007BBC25 /* DHRightDetailLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRightDetailLabel.m; sourceTree = \"<group>\"; };\n\t\t436FDF5819FE57CD00553931 /* SourceCodePro-Black.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-Black.ttf\"; sourceTree = \"<group>\"; };\n\t\t436FDF5919FE57CD00553931 /* SourceCodePro-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-Bold.ttf\"; sourceTree = \"<group>\"; };\n\t\t436FDF5A19FE57CD00553931 /* SourceCodePro-ExtraLight.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-ExtraLight.ttf\"; sourceTree = \"<group>\"; };\n\t\t436FDF5B19FE57CD00553931 /* SourceCodePro-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-Light.ttf\"; sourceTree = \"<group>\"; };\n\t\t436FDF5C19FE57CD00553931 /* SourceCodePro-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-Regular.ttf\"; sourceTree = \"<group>\"; };\n\t\t436FDF5D19FE57CD00553931 /* SourceCodePro-Semibold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = \"SourceCodePro-Semibold.ttf\"; sourceTree = \"<group>\"; };\n\t\t437699A519D8FD3D008B37F4 /* DHTransferFeed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTransferFeed.h; sourceTree = \"<group>\"; };\n\t\t437699A619D8FD3D008B37F4 /* DHTransferFeed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTransferFeed.m; sourceTree = \"<group>\"; };\n\t\t437AD41619E26C9500BA0FE4 /* DHBrowserCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DHBrowserCell.xib; sourceTree = \"<group>\"; };\n\t\t437B6F8519EBC98A003023E8 /* DHCSS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHCSS.h; sourceTree = \"<group>\"; };\n\t\t437B6F8619EBC98A003023E8 /* DHCSS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHCSS.m; sourceTree = \"<group>\"; };\n\t\t437B6F8819EBCBCA003023E8 /* style.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = style.css; sourceTree = \"<group>\"; };\n\t\t437FE06419E2AC0D0022ADF4 /* DHTypeBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTypeBrowser.h; sourceTree = \"<group>\"; };\n\t\t437FE06519E2AC0D0022ADF4 /* DHTypeBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTypeBrowser.m; sourceTree = \"<group>\"; };\n\t\t437FE06719E2B4010022ADF4 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };\n\t\t438525DF19C129FC002BAFD1 /* DHFeed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHFeed.h; sourceTree = \"<group>\"; };\n\t\t438525E019C129FC002BAFD1 /* DHFeed.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHFeed.m; sourceTree = \"<group>\"; };\n\t\t438525E319C13E42002BAFD1 /* NSArray+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSArray+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t438525E419C13E42002BAFD1 /* NSArray+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSArray+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t438525E619C13ECE002BAFD1 /* NSString+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t438525E719C13ECE002BAFD1 /* NSString+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t438525EA19C150AC002BAFD1 /* DHDBResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDBResult.h; sourceTree = \"<group>\"; };\n\t\t438525EB19C150AC002BAFD1 /* DHDBResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDBResult.m; sourceTree = \"<group>\"; };\n\t\t438B06DE19FFA2DF009A539D /* Launch.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Launch.xib; sourceTree = \"<group>\"; };\n\t\t438B45B71A10BB6F0047A156 /* DHJavaScriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHJavaScriptBridge.h; sourceTree = \"<group>\"; };\n\t\t438B45B81A10BB6F0047A156 /* DHJavaScriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHJavaScriptBridge.m; sourceTree = \"<group>\"; };\n\t\t438D58C119E575D600012881 /* DHLoadingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DHLoadingCell.xib; sourceTree = \"<group>\"; };\n\t\t438E86491D1D4A3C00FB6CD8 /* apple.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = apple.js; sourceTree = \"<group>\"; };\n\t\t438F622219D5E81A00AF71BC /* NSFileManager+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSFileManager+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t438F622319D5E81A00AF71BC /* NSFileManager+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSFileManager+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t439051F419E67D840083A55E /* DHBrowserTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHBrowserTableViewCell.h; sourceTree = \"<group>\"; };\n\t\t439051F519E67D840083A55E /* DHBrowserTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHBrowserTableViewCell.m; sourceTree = \"<group>\"; };\n\t\t439051F719E684160083A55E /* DHEntryBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHEntryBrowser.h; sourceTree = \"<group>\"; };\n\t\t439051F819E684160083A55E /* DHEntryBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHEntryBrowser.m; sourceTree = \"<group>\"; };\n\t\t439051FA19E68FE20083A55E /* NSString+GTM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+GTM.h\"; sourceTree = \"<group>\"; };\n\t\t439051FB19E68FE20083A55E /* NSString+GTM.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+GTM.m\"; sourceTree = \"<group>\"; };\n\t\t439051FE19E692D90083A55E /* DHDBResultSorter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDBResultSorter.h; sourceTree = \"<group>\"; };\n\t\t439051FF19E692D90083A55E /* DHDBResultSorter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDBResultSorter.m; sourceTree = \"<group>\"; };\n\t\t43915EE719C5D2FD002806FF /* UIView+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIView+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43915EE819C5D2FD002806FF /* UIView+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIView+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t4398D34419BF55B500457CAF /* DHPreferences.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHPreferences.h; sourceTree = \"<group>\"; };\n\t\t4398D34519BF55B500457CAF /* DHPreferences.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHPreferences.m; sourceTree = \"<group>\"; };\n\t\t43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Apple_Docs_Framework.framework; path = ../Frameworks/Apple_Docs_Framework.framework; sourceTree = \"<group>\"; };\n\t\t43A1C267200175B900512DB3 /* DHAppleAPIProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DHAppleAPIProtocol.h; sourceTree = \"<group>\"; };\n\t\t43A1C268200175B900512DB3 /* DHAppleAPIProtocol.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DHAppleAPIProtocol.m; sourceTree = \"<group>\"; };\n\t\t43A356C919FFCE4D0073D143 /* UIViewController+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIViewController+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43A356CA19FFCE4D0073D143 /* UIViewController+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIViewController+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43A6D9C719E0D69700780BC8 /* DHDocsetManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDocsetManager.h; sourceTree = \"<group>\"; };\n\t\t43A6D9C819E0D69700780BC8 /* DHDocsetManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDocsetManager.m; sourceTree = \"<group>\"; };\n\t\t43AAB7801AAE776800DB76F3 /* DHRemoteProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRemoteProtocol.h; sourceTree = \"<group>\"; };\n\t\t43AAB7811AAE776800DB76F3 /* DHRemoteProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRemoteProtocol.m; sourceTree = \"<group>\"; };\n\t\t43AB65B21ED19D2F00A6EC18 /* Dash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Dash.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t43AC700019E4530400E0DB43 /* home.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = home.html; sourceTree = \"<group>\"; };\n\t\t43AF0E131D1861C600F0D8A0 /* DHAppleActiveLanguage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHAppleActiveLanguage.h; sourceTree = \"<group>\"; };\n\t\t43AF0E141D1861CE00F0D8A0 /* DHAppleActiveLanguage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHAppleActiveLanguage.m; sourceTree = \"<group>\"; };\n\t\t43B0956719BFD19900F8611B /* DHNavigationAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHNavigationAnimator.h; sourceTree = \"<group>\"; };\n\t\t43B0956819BFD19900F8611B /* DHNavigationAnimator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHNavigationAnimator.m; sourceTree = \"<group>\"; };\n\t\t43B0956A19BFD57500F8611B /* DHRepo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRepo.h; sourceTree = \"<group>\"; };\n\t\t43B0956B19BFD57500F8611B /* DHRepo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRepo.m; sourceTree = \"<group>\"; };\n\t\t43B0956D19BFDBDC00F8611B /* DHDocsetDownloader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDocsetDownloader.h; sourceTree = \"<group>\"; };\n\t\t43B0956E19BFDBDC00F8611B /* DHDocsetDownloader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDocsetDownloader.m; sourceTree = \"<group>\"; };\n\t\t43B98F6219EE740F00C46BD9 /* msdn.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = msdn.js; sourceTree = \"<group>\"; };\n\t\t43BB043719ED07DD000FBC0D /* DHJavaScript.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHJavaScript.h; sourceTree = \"<group>\"; };\n\t\t43BB043819ED07DD000FBC0D /* DHJavaScript.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHJavaScript.m; sourceTree = \"<group>\"; };\n\t\t43BB043E19ED0B19000FBC0D /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n\t\t43BB044019ED0C86000FBC0D /* cocoa.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = cocoa.js; sourceTree = \"<group>\"; };\n\t\t43BB044419ED1BB8000FBC0D /* NSObject+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSObject+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43BB044519ED1BB8000FBC0D /* NSObject+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSObject+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43BB044B19ED3E78000FBC0D /* ruby.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ruby.js; sourceTree = \"<group>\"; };\n\t\t43BB045019ED48BD000FBC0D /* ClassRuby.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ClassRuby.png; sourceTree = \"<group>\"; };\n\t\t43BB045119ED48BD000FBC0D /* ClassRubyRetina.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ClassRubyRetina.png; sourceTree = \"<group>\"; };\n\t\t43BB045219ED48BD000FBC0D /* ModuleRuby.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ModuleRuby.png; sourceTree = \"<group>\"; };\n\t\t43BB045319ED48BD000FBC0D /* ModuleRubyRetina.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ModuleRubyRetina.png; sourceTree = \"<group>\"; };\n\t\t43BD6BF21DCE379B0005A1E7 /* DHAppUpdateChecker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHAppUpdateChecker.h; sourceTree = \"<group>\"; };\n\t\t43BD6BF31DCE379B0005A1E7 /* DHAppUpdateChecker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHAppUpdateChecker.m; sourceTree = \"<group>\"; };\n\t\t43BD91ED1AB31A9E001058C4 /* hash_change_notifier.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = hash_change_notifier.js; sourceTree = \"<group>\"; };\n\t\t43CF8AEF19D5DA060010E698 /* NSURL+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSURL+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43CF8AF019D5DA060010E698 /* NSURL+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSURL+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43D28EB919F97D5500FDC5EE /* DHTocBrowser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTocBrowser.h; sourceTree = \"<group>\"; };\n\t\t43D28EBA19F97D5500FDC5EE /* DHTocBrowser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTocBrowser.m; sourceTree = \"<group>\"; };\n\t\t43D4F06219E7CEC500C22AF5 /* DHQueuedDB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHQueuedDB.h; sourceTree = \"<group>\"; };\n\t\t43D4F06319E7CEC500C22AF5 /* DHQueuedDB.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHQueuedDB.m; sourceTree = \"<group>\"; };\n\t\t43D4F06519E7D68100C22AF5 /* DHDBSearcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDBSearcher.h; sourceTree = \"<group>\"; };\n\t\t43D4F06619E7D68100C22AF5 /* DHDBSearcher.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDBSearcher.m; sourceTree = \"<group>\"; };\n\t\t43D4F06819E7DF3900C22AF5 /* DHDBNestedResultSorter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDBNestedResultSorter.h; sourceTree = \"<group>\"; };\n\t\t43D4F06919E7DF3900C22AF5 /* DHDBNestedResultSorter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDBNestedResultSorter.m; sourceTree = \"<group>\"; };\n\t\t43D4F06B19E7E88400C22AF5 /* DHDBSearchController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHDBSearchController.h; sourceTree = \"<group>\"; };\n\t\t43D4F06C19E7E88400C22AF5 /* DHDBSearchController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHDBSearchController.m; sourceTree = \"<group>\"; };\n\t\t43D7E4EE1BB4C62E00FC1DEF /* DHWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHWindow.h; sourceTree = \"<group>\"; };\n\t\t43D7E4EF1BB4C62E00FC1DEF /* DHWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHWindow.m; sourceTree = \"<group>\"; };\n\t\t43DCAEB61A9C3C8500A28A95 /* NSData+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSData+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43DCAEB71A9C3C8500A28A95 /* NSData+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSData+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43DF51921A07B4C0006AB295 /* DHNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHNavigationController.h; sourceTree = \"<group>\"; };\n\t\t43DF51931A07B4C0006AB295 /* DHNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHNavigationController.m; sourceTree = \"<group>\"; };\n\t\t43DFED7E1A9EBEA5008F7795 /* DHRemote.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRemote.h; sourceTree = \"<group>\"; };\n\t\t43DFED7F1A9EBEA5008F7795 /* DHRemote.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRemote.m; sourceTree = \"<group>\"; };\n\t\t43DFED811A9EE104008F7795 /* DHRemoteImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHRemoteImage.h; sourceTree = \"<group>\"; };\n\t\t43DFED821A9EE104008F7795 /* DHRemoteImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHRemoteImage.m; sourceTree = \"<group>\"; };\n\t\t43EDD19619C51E9C00A0EBEC /* DHLatencyTester.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHLatencyTester.h; sourceTree = \"<group>\"; };\n\t\t43EDD19719C51E9C00A0EBEC /* DHLatencyTester.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHLatencyTester.m; sourceTree = \"<group>\"; };\n\t\t43EDD19819C51E9C00A0EBEC /* DHLatencyTestResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHLatencyTestResult.h; sourceTree = \"<group>\"; };\n\t\t43EDD19919C51E9C00A0EBEC /* DHLatencyTestResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHLatencyTestResult.m; sourceTree = \"<group>\"; };\n\t\t43EDD19D19C52E3400A0EBEC /* DHFeedResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHFeedResult.h; sourceTree = \"<group>\"; };\n\t\t43EDD19E19C52E3400A0EBEC /* DHFeedResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHFeedResult.m; sourceTree = \"<group>\"; };\n\t\t43EDD1A019C5309300A0EBEC /* DHFileDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHFileDownload.h; sourceTree = \"<group>\"; };\n\t\t43EDD1A119C5309300A0EBEC /* DHFileDownload.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHFileDownload.m; sourceTree = \"<group>\"; };\n\t\t43EE932919CD079600FFF30C /* libarchive.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libarchive.a; sourceTree = \"<group>\"; };\n\t\t43EED91B1B607DB800F3DC35 /* on_page_load.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = on_page_load.js; sourceTree = \"<group>\"; };\n\t\t43F25F9A19EBDEF30025CDC4 /* DHBlockProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHBlockProtocol.h; sourceTree = \"<group>\"; };\n\t\t43F25F9B19EBDEF30025CDC4 /* DHBlockProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHBlockProtocol.m; sourceTree = \"<group>\"; };\n\t\t43F70ABF19CBBD20000849C8 /* Defaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Defaults.plist; sourceTree = \"<group>\"; };\n\t\t43F7527119CD1C2000D76F58 /* UIButton+DHUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIButton+DHUtils.h\"; sourceTree = \"<group>\"; };\n\t\t43F7527219CD1C2000D76F58 /* UIButton+DHUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIButton+DHUtils.m\"; sourceTree = \"<group>\"; };\n\t\t43F7527419CD31D100D76F58 /* DHRepoCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DHRepoCell.xib; sourceTree = \"<group>\"; };\n\t\t43F760B019EA61B5002BD8A6 /* DHSearchDisplayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHSearchDisplayController.h; sourceTree = \"<group>\"; };\n\t\t43F760B119EA61B5002BD8A6 /* DHSearchDisplayController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHSearchDisplayController.m; sourceTree = \"<group>\"; };\n\t\t43F84A7419EEBD1A008FE85C /* DHTarixIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHTarixIndex.h; sourceTree = \"<group>\"; };\n\t\t43F84A7519EEBD1A008FE85C /* DHTarixIndex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHTarixIndex.m; sourceTree = \"<group>\"; };\n\t\t43FC34001DE784C40089F134 /* DHUserRepoList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DHUserRepoList.h; sourceTree = \"<group>\"; };\n\t\t43FC34011DE784C40089F134 /* DHUserRepoList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DHUserRepoList.m; sourceTree = \"<group>\"; };\n\t\t43FD2EE219BB8D87007E594D /* Dash.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Dash.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t43FD2EE519BB8D87007E594D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\t43FD2EE719BB8D87007E594D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };\n\t\t43FD2EE919BB8D87007E594D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };\n\t\t43FD2EED19BB8D87007E594D /* Dash-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = \"Dash-Info.plist\"; sourceTree = \"<group>\"; };\n\t\t43FD2EEF19BB8D87007E594D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = \"<group>\"; };\n\t\t43FD2EF119BB8D87007E594D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t43FD2EF319BB8D87007E594D /* Dash-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"Dash-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t43FD2EF419BB8D87007E594D /* DHAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DHAppDelegate.h; sourceTree = \"<group>\"; };\n\t\t43FD2EF519BB8D87007E594D /* DHAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DHAppDelegate.m; sourceTree = \"<group>\"; };\n\t\t43FD2EFB19BB8D87007E594D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t43FD2EFD19BB8D87007E594D /* DHDocsetBrowser.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DHDocsetBrowser.h; sourceTree = \"<group>\"; };\n\t\t43FD2EFE19BB8D87007E594D /* DHDocsetBrowser.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DHDocsetBrowser.m; sourceTree = \"<group>\"; };\n\t\t43FD2F0019BB8D87007E594D /* DHWebViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DHWebViewController.h; sourceTree = \"<group>\"; };\n\t\t43FD2F0119BB8D87007E594D /* DHWebViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DHWebViewController.m; sourceTree = \"<group>\"; };\n\t\t43FD2F0319BB8D87007E594D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t642921D57BB2F4B0450331EC /* Pods-Dash-Dash App Store.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Dash-Dash App Store.debug.xcconfig\"; path = \"../Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t6BB3997912C96D08897BF444 /* Pods-Dash-Dash App Store.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Dash-Dash App Store.release.xcconfig\"; path = \"../Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t7E45E2662CBB7671D0D844A3 /* Pods-Dash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Dash.release.xcconfig\"; path = \"../Pods/Target Support Files/Pods-Dash/Pods-Dash.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t9A2364AD2032B0714BCD2265 /* libPods-Dash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-Dash.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9FB91D369AD27465BED375AD /* libPods-Dash-Dash App Store.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-Dash-Dash App Store.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBAE47FF5DEE33300EBFF9AEA /* Pods-Dash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-Dash.debug.xcconfig\"; path = \"../Pods/Target Support Files/Pods-Dash/Pods-Dash.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tF5C39BFE200A836D00734571 /* DHDocsetBrowserViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DHDocsetBrowserViewModel.h; sourceTree = \"<group>\"; };\n\t\tF5C39BFF200A836D00734571 /* DHDocsetBrowserViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DHDocsetBrowserViewModel.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t43AB65821ED19D2F00A6EC18 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43AB65831ED19D2F00A6EC18 /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t43AB65841ED19D2F00A6EC18 /* MobileCoreServices.framework in Frameworks */,\n\t\t\t\t43AB65851ED19D2F00A6EC18 /* WebKit.framework in Frameworks */,\n\t\t\t\t43AB65861ED19D2F00A6EC18 /* libarchive.a in Frameworks */,\n\t\t\t\t43AB65871ED19D2F00A6EC18 /* libz.dylib in Frameworks */,\n\t\t\t\t43AB65881ED19D2F00A6EC18 /* libsqlite3.dylib in Frameworks */,\n\t\t\t\t43AB65891ED19D2F00A6EC18 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t43AB658A1ED19D2F00A6EC18 /* UIKit.framework in Frameworks */,\n\t\t\t\t43AB658B1ED19D2F00A6EC18 /* Foundation.framework in Frameworks */,\n\t\t\t\t3A2F71C185D6471649E8F3A7 /* libPods-Dash-Dash App Store.a in Frameworks */,\n\t\t\t\t43BCC3E4200442CA00DE24FE /* Apple_Docs_Framework.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43FD2EDF19BB8D87007E594D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43BB043F19ED0B19000FBC0D /* JavaScriptCore.framework in Frameworks */,\n\t\t\t\t430C768D19E55E6E006F0DE0 /* MobileCoreServices.framework in Frameworks */,\n\t\t\t\t437FE06819E2B4010022ADF4 /* WebKit.framework in Frameworks */,\n\t\t\t\t43EE932A19CD079600FFF30C /* libarchive.a in Frameworks */,\n\t\t\t\t43352F6519C7A69900D4B1D8 /* libz.dylib in Frameworks */,\n\t\t\t\t4303A3C419C658B000A7CD85 /* libsqlite3.dylib in Frameworks */,\n\t\t\t\t43FD2EE819BB8D87007E594D /* CoreGraphics.framework in Frameworks */,\n\t\t\t\t43FD2EEA19BB8D87007E594D /* UIKit.framework in Frameworks */,\n\t\t\t\t43FD2EE619BB8D87007E594D /* Foundation.framework in Frameworks */,\n\t\t\t\t45D28F8ABD1FC392B1930467 /* libPods-Dash.a in Frameworks */,\n\t\t\t\t43A1C26D200175E500512DB3 /* Apple_Docs_Framework.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\t4303A3AF19C657FE00A7CD85 /* Database */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4303A3C219C6585500A7CD85 /* FMDB */,\n\t\t\t\t43A6D9C719E0D69700780BC8 /* DHDocsetManager.h */,\n\t\t\t\t43A6D9C819E0D69700780BC8 /* DHDocsetManager.m */,\n\t\t\t\t4303A3C519C6590000A7CD85 /* DHDocset.h */,\n\t\t\t\t4303A3C619C6590000A7CD85 /* DHDocset.m */,\n\t\t\t\t4303A3CB19C65E6A00A7CD85 /* DHDocsetIndexer.h */,\n\t\t\t\t4303A3CC19C65E6A00A7CD85 /* DHDocsetIndexer.m */,\n\t\t\t\t43A1C2662001757700512DB3 /* Apple API Docs */,\n\t\t\t\t4303A3CE19C668B500A7CD85 /* Types */,\n\t\t\t\t431173D919DA3503007E238E /* Others */,\n\t\t\t);\n\t\t\tname = Database;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4303A3C219C6585500A7CD85 /* FMDB */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4303A3B019C6584F00A7CD85 /* whitespace_tokenizer.h */,\n\t\t\t\t4303A3B119C6584F00A7CD85 /* whitespace_tokenizer.c */,\n\t\t\t\t4303A3B219C6584F00A7CD85 /* FMDatabase.h */,\n\t\t\t\t4303A3B319C6584F00A7CD85 /* FMDatabase.m */,\n\t\t\t\t4303A3B419C6584F00A7CD85 /* FMDatabaseAdditions.h */,\n\t\t\t\t4303A3B519C6584F00A7CD85 /* FMDatabaseAdditions.m */,\n\t\t\t\t4303A3B619C6584F00A7CD85 /* FMResultSet.h */,\n\t\t\t\t4303A3B719C6584F00A7CD85 /* FMResultSet.m */,\n\t\t\t\t4303A3B819C6584F00A7CD85 /* FMDatabasePool.h */,\n\t\t\t\t4303A3B919C6584F00A7CD85 /* FMDatabasePool.m */,\n\t\t\t\t4303A3BA19C6584F00A7CD85 /* FMDatabaseQueue.h */,\n\t\t\t\t4303A3BB19C6584F00A7CD85 /* FMDatabaseQueue.m */,\n\t\t\t);\n\t\t\tname = FMDB;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4303A3CE19C668B500A7CD85 /* Types */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4303A3D219C668C200A7CD85 /* DHTypes.h */,\n\t\t\t\t4303A3D319C668C200A7CD85 /* DHTypes.m */,\n\t\t\t\t4303A3CF19C668BC00A7CD85 /* DHType.h */,\n\t\t\t\t4303A3D019C668BC00A7CD85 /* DHType.m */,\n\t\t\t);\n\t\t\tname = Types;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t431108D219C7ADA60050174C /* Unarchiver */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t431108D319C7AE6D0050174C /* DHUnarchiver.h */,\n\t\t\t\t431108D419C7AE6D0050174C /* DHUnarchiver.m */,\n\t\t\t\t431108D619C7AEC00050174C /* libarchive */,\n\t\t\t);\n\t\t\tname = Unarchiver;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t431108D619C7AEC00050174C /* libarchive */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43352F5F19C7A67200D4B1D8 /* archive_entry.h */,\n\t\t\t\t43352F6019C7A67200D4B1D8 /* archive.h */,\n\t\t\t\t43EE932919CD079600FFF30C /* libarchive.a */,\n\t\t\t);\n\t\t\tname = libarchive;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t431173D919DA3503007E238E /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t431173DA19DA3513007E238E /* DHImageCache.h */,\n\t\t\t\t431173DB19DA3513007E238E /* DHImageCache.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t432321DF1AA1BBE20045BA77 /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43DFED811A9EE104008F7795 /* DHRemoteImage.h */,\n\t\t\t\t43DFED821A9EE104008F7795 /* DHRemoteImage.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43280F511DDE4A4C001C2062 /* User Contributed */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43280F521DDE4A7B001C2062 /* DHUserRepo.h */,\n\t\t\t\t43280F531DDE4A7B001C2062 /* DHUserRepo.m */,\n\t\t\t\t43FC34001DE784C40089F134 /* DHUserRepoList.h */,\n\t\t\t\t43FC34011DE784C40089F134 /* DHUserRepoList.m */,\n\t\t\t);\n\t\t\tname = \"User Contributed\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4338AB5D1AAF7091007B85DE /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4338AB5E1AAF70AF007B85DE /* DHWebProgressView.h */,\n\t\t\t\t4338AB5F1AAF70AF007B85DE /* DHWebProgressView.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4341A1F119BFE6B500AD164A /* Repos */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43F7527419CD31D100D76F58 /* DHRepoCell.xib */,\n\t\t\t\t43B0956A19BFD57500F8611B /* DHRepo.h */,\n\t\t\t\t43B0956B19BFD57500F8611B /* DHRepo.m */,\n\t\t\t\t437699A319D8FD0B008B37F4 /* Downloader */,\n\t\t\t\t43280F511DDE4A4C001C2062 /* User Contributed */,\n\t\t\t\t435145941DEB701E000874A8 /* Cheat Sheets */,\n\t\t\t\t437699A219D8FD00008B37F4 /* Transferrer */,\n\t\t\t\t434AB15819C273A500791E07 /* Others */,\n\t\t\t);\n\t\t\tname = Repos;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4341A1F219BFE6CA00AD164A /* Preferences */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4398D34419BF55B500457CAF /* DHPreferences.h */,\n\t\t\t\t4398D34519BF55B500457CAF /* DHPreferences.m */,\n\t\t\t);\n\t\t\tname = Preferences;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4341A1F319BFE6D200AD164A /* Browser */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t437AD41619E26C9500BA0FE4 /* DHBrowserCell.xib */,\n\t\t\t\t438D58C119E575D600012881 /* DHLoadingCell.xib */,\n\t\t\t\t43FD2EFD19BB8D87007E594D /* DHDocsetBrowser.h */,\n\t\t\t\t43FD2EFE19BB8D87007E594D /* DHDocsetBrowser.m */,\n\t\t\t\tF5C39BFE200A836D00734571 /* DHDocsetBrowserViewModel.h */,\n\t\t\t\tF5C39BFF200A836D00734571 /* DHDocsetBrowserViewModel.m */,\n\t\t\t\t437FE06419E2AC0D0022ADF4 /* DHTypeBrowser.h */,\n\t\t\t\t437FE06519E2AC0D0022ADF4 /* DHTypeBrowser.m */,\n\t\t\t\t439051F719E684160083A55E /* DHEntryBrowser.h */,\n\t\t\t\t439051F819E684160083A55E /* DHEntryBrowser.m */,\n\t\t\t\t439051F319E67D5B0083A55E /* Others */,\n\t\t\t);\n\t\t\tname = Browser;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t434AB15819C273A500791E07 /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t438525DF19C129FC002BAFD1 /* DHFeed.h */,\n\t\t\t\t438525E019C129FC002BAFD1 /* DHFeed.m */,\n\t\t\t\t43EDD19D19C52E3400A0EBEC /* DHFeedResult.h */,\n\t\t\t\t43EDD19E19C52E3400A0EBEC /* DHFeedResult.m */,\n\t\t\t\t436DF77E19FFA926008814F8 /* DHRepoTableView.h */,\n\t\t\t\t436DF77F19FFA926008814F8 /* DHRepoTableView.m */,\n\t\t\t\t434AB15519C2738900791E07 /* DHRepoTableViewCell.h */,\n\t\t\t\t434AB15619C2738900791E07 /* DHRepoTableViewCell.m */,\n\t\t\t\t43EDD1A019C5309300A0EBEC /* DHFileDownload.h */,\n\t\t\t\t43EDD1A119C5309300A0EBEC /* DHFileDownload.m */,\n\t\t\t\t436F3E4119D4F617007BBC25 /* DHRightDetailLabel.h */,\n\t\t\t\t436F3E4219D4F617007BBC25 /* DHRightDetailLabel.m */,\n\t\t\t\t431108D219C7ADA60050174C /* Unarchiver */,\n\t\t\t\t43EDD19C19C51E9F00A0EBEC /* Latency Tester */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t435145941DEB701E000874A8 /* Cheat Sheets */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t435145951DEB7035000874A8 /* DHCheatRepo.h */,\n\t\t\t\t435145961DEB7035000874A8 /* DHCheatRepo.m */,\n\t\t\t\t435145981DEB7099000874A8 /* DHCheatRepoList.h */,\n\t\t\t\t435145991DEB7099000874A8 /* DHCheatRepoList.m */,\n\t\t\t);\n\t\t\tname = \"Cheat Sheets\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43573F751A997EB0000E6F2D /* Remote */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43573F761A997EC7000E6F2D /* DHRemoteServer.h */,\n\t\t\t\t43573F771A997EC7000E6F2D /* DHRemoteServer.m */,\n\t\t\t\t43DFED7E1A9EBEA5008F7795 /* DHRemote.h */,\n\t\t\t\t43DFED7F1A9EBEA5008F7795 /* DHRemote.m */,\n\t\t\t\t432321E01AA1BBF70045BA77 /* DHRemoteBrowser.h */,\n\t\t\t\t432321E11AA1BBF70045BA77 /* DHRemoteBrowser.m */,\n\t\t\t\t43AAB7801AAE776800DB76F3 /* DHRemoteProtocol.h */,\n\t\t\t\t43AAB7811AAE776800DB76F3 /* DHRemoteProtocol.m */,\n\t\t\t\t432321DF1AA1BBE20045BA77 /* Others */,\n\t\t\t);\n\t\t\tname = Remote;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t436FDF5719FE57C600553931 /* Fonts */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t436FDF5819FE57CD00553931 /* SourceCodePro-Black.ttf */,\n\t\t\t\t436FDF5919FE57CD00553931 /* SourceCodePro-Bold.ttf */,\n\t\t\t\t436FDF5A19FE57CD00553931 /* SourceCodePro-ExtraLight.ttf */,\n\t\t\t\t436FDF5B19FE57CD00553931 /* SourceCodePro-Light.ttf */,\n\t\t\t\t436FDF5C19FE57CD00553931 /* SourceCodePro-Regular.ttf */,\n\t\t\t\t436FDF5D19FE57CD00553931 /* SourceCodePro-Semibold.ttf */,\n\t\t\t\t433BDDAD1DC3BE7700B0B145 /* ionicons.ttf */,\n\t\t\t);\n\t\t\tname = Fonts;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t437699A219D8FD00008B37F4 /* Transferrer */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4341A1F419BFE89A00AD164A /* DHDocsetTransferrer.h */,\n\t\t\t\t4341A1F519BFE89A00AD164A /* DHDocsetTransferrer.m */,\n\t\t\t\t437699A519D8FD3D008B37F4 /* DHTransferFeed.h */,\n\t\t\t\t437699A619D8FD3D008B37F4 /* DHTransferFeed.m */,\n\t\t\t);\n\t\t\tname = Transferrer;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t437699A319D8FD0B008B37F4 /* Downloader */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43B0956D19BFDBDC00F8611B /* DHDocsetDownloader.h */,\n\t\t\t\t43B0956E19BFDBDC00F8611B /* DHDocsetDownloader.m */,\n\t\t\t);\n\t\t\tname = Downloader;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t437AD41819E26F0A00BA0FE4 /* WebView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2F0019BB8D87007E594D /* DHWebViewController.h */,\n\t\t\t\t43FD2F0119BB8D87007E594D /* DHWebViewController.m */,\n\t\t\t\t43418C261A0B63B00014EFB6 /* DHWebView.h */,\n\t\t\t\t43418C271A0B63B00014EFB6 /* DHWebView.m */,\n\t\t\t\t43D28EB919F97D5500FDC5EE /* DHTocBrowser.h */,\n\t\t\t\t43D28EBA19F97D5500FDC5EE /* DHTocBrowser.m */,\n\t\t\t\t43BB043419ED07B8000FBC0D /* Protocols */,\n\t\t\t\t43BB043519ED07BE000FBC0D /* CSS */,\n\t\t\t\t43BB043619ED07C3000FBC0D /* JavaScript */,\n\t\t\t\t43AC6FFF19E452D100E0DB43 /* Web Pages */,\n\t\t\t\t4338AB5D1AAF7091007B85DE /* Others */,\n\t\t\t);\n\t\t\tname = WebView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t438525E219C13E31002BAFD1 /* Utils */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43BB044419ED1BB8000FBC0D /* NSObject+DHUtils.h */,\n\t\t\t\t43BB044519ED1BB8000FBC0D /* NSObject+DHUtils.m */,\n\t\t\t\t438525E319C13E42002BAFD1 /* NSArray+DHUtils.h */,\n\t\t\t\t438525E419C13E42002BAFD1 /* NSArray+DHUtils.m */,\n\t\t\t\t438525E619C13ECE002BAFD1 /* NSString+DHUtils.h */,\n\t\t\t\t438525E719C13ECE002BAFD1 /* NSString+DHUtils.m */,\n\t\t\t\t439051FA19E68FE20083A55E /* NSString+GTM.h */,\n\t\t\t\t439051FB19E68FE20083A55E /* NSString+GTM.m */,\n\t\t\t\t43915EE719C5D2FD002806FF /* UIView+DHUtils.h */,\n\t\t\t\t43915EE819C5D2FD002806FF /* UIView+DHUtils.m */,\n\t\t\t\t43256F0819F7B4B9003919BA /* UITableView+DHUtils.h */,\n\t\t\t\t43256F0919F7B4B9003919BA /* UITableView+DHUtils.m */,\n\t\t\t\t4361651B19CCF8500026F08E /* NSTimer+DHUtils.h */,\n\t\t\t\t4361651C19CCF8500026F08E /* NSTimer+DHUtils.m */,\n\t\t\t\t43F7527119CD1C2000D76F58 /* UIButton+DHUtils.h */,\n\t\t\t\t43F7527219CD1C2000D76F58 /* UIButton+DHUtils.m */,\n\t\t\t\t43CF8AEF19D5DA060010E698 /* NSURL+DHUtils.h */,\n\t\t\t\t43CF8AF019D5DA060010E698 /* NSURL+DHUtils.m */,\n\t\t\t\t438F622219D5E81A00AF71BC /* NSFileManager+DHUtils.h */,\n\t\t\t\t438F622319D5E81A00AF71BC /* NSFileManager+DHUtils.m */,\n\t\t\t\t43A356C919FFCE4D0073D143 /* UIViewController+DHUtils.h */,\n\t\t\t\t43A356CA19FFCE4D0073D143 /* UIViewController+DHUtils.m */,\n\t\t\t\t43DCAEB61A9C3C8500A28A95 /* NSData+DHUtils.h */,\n\t\t\t\t43DCAEB71A9C3C8500A28A95 /* NSData+DHUtils.m */,\n\t\t\t);\n\t\t\tname = Utils;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t438525E919C1509A002BAFD1 /* Searcher */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t438525EA19C150AC002BAFD1 /* DHDBResult.h */,\n\t\t\t\t438525EB19C150AC002BAFD1 /* DHDBResult.m */,\n\t\t\t\t43D4F06519E7D68100C22AF5 /* DHDBSearcher.h */,\n\t\t\t\t43D4F06619E7D68100C22AF5 /* DHDBSearcher.m */,\n\t\t\t\t43D4F06219E7CEC500C22AF5 /* DHQueuedDB.h */,\n\t\t\t\t43D4F06319E7CEC500C22AF5 /* DHQueuedDB.m */,\n\t\t\t\t43D4F06B19E7E88400C22AF5 /* DHDBSearchController.h */,\n\t\t\t\t43D4F06C19E7E88400C22AF5 /* DHDBSearchController.m */,\n\t\t\t\t4342C8A319E93FF200BE66A2 /* DHNestedViewController.h */,\n\t\t\t\t4342C8A419E93FF200BE66A2 /* DHNestedViewController.m */,\n\t\t\t\t439051FD19E692BE0083A55E /* Others */,\n\t\t\t);\n\t\t\tname = Searcher;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t439051F319E67D5B0083A55E /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43256F0519F7A6A8003919BA /* DHBrowserTableView.h */,\n\t\t\t\t43256F0619F7A6A8003919BA /* DHBrowserTableView.m */,\n\t\t\t\t439051F419E67D840083A55E /* DHBrowserTableViewCell.h */,\n\t\t\t\t439051F519E67D840083A55E /* DHBrowserTableViewCell.m */,\n\t\t\t\t434A77DA1BAE590C00CCF84B /* DHSplitViewController.h */,\n\t\t\t\t434A77DB1BAE590C00CCF84B /* DHSplitViewController.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t439051FD19E692BE0083A55E /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t439051FE19E692D90083A55E /* DHDBResultSorter.h */,\n\t\t\t\t439051FF19E692D90083A55E /* DHDBResultSorter.m */,\n\t\t\t\t43D4F06819E7DF3900C22AF5 /* DHDBNestedResultSorter.h */,\n\t\t\t\t43D4F06919E7DF3900C22AF5 /* DHDBNestedResultSorter.m */,\n\t\t\t\t43F760B019EA61B5002BD8A6 /* DHSearchDisplayController.h */,\n\t\t\t\t43F760B119EA61B5002BD8A6 /* DHSearchDisplayController.m */,\n\t\t\t\t43AF0E131D1861C600F0D8A0 /* DHAppleActiveLanguage.h */,\n\t\t\t\t43AF0E141D1861CE00F0D8A0 /* DHAppleActiveLanguage.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43A1C2662001757700512DB3 /* Apple API Docs */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43A1C267200175B900512DB3 /* DHAppleAPIProtocol.h */,\n\t\t\t\t43A1C268200175B900512DB3 /* DHAppleAPIProtocol.m */,\n\t\t\t);\n\t\t\tname = \"Apple API Docs\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43AC6FFF19E452D100E0DB43 /* Web Pages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43AC700019E4530400E0DB43 /* home.html */,\n\t\t\t);\n\t\t\tname = \"Web Pages\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43B0956619BFD16C00F8611B /* Others */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43B0956719BFD19900F8611B /* DHNavigationAnimator.h */,\n\t\t\t\t43B0956819BFD19900F8611B /* DHNavigationAnimator.m */,\n\t\t\t\t43DF51921A07B4C0006AB295 /* DHNavigationController.h */,\n\t\t\t\t43DF51931A07B4C0006AB295 /* DHNavigationController.m */,\n\t\t\t\t43D7E4EE1BB4C62E00FC1DEF /* DHWindow.h */,\n\t\t\t\t43D7E4EF1BB4C62E00FC1DEF /* DHWindow.m */,\n\t\t\t\t43BD6BF21DCE379B0005A1E7 /* DHAppUpdateChecker.h */,\n\t\t\t\t43BD6BF31DCE379B0005A1E7 /* DHAppUpdateChecker.m */,\n\t\t\t);\n\t\t\tname = Others;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43BB043419ED07B8000FBC0D /* Protocols */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t430C768919E52B7F006F0DE0 /* DHTarixProtocol.h */,\n\t\t\t\t430C768A19E52B7F006F0DE0 /* DHTarixProtocol.m */,\n\t\t\t\t43F84A7419EEBD1A008FE85C /* DHTarixIndex.h */,\n\t\t\t\t43F84A7519EEBD1A008FE85C /* DHTarixIndex.m */,\n\t\t\t\t43F25F9A19EBDEF30025CDC4 /* DHBlockProtocol.h */,\n\t\t\t\t43F25F9B19EBDEF30025CDC4 /* DHBlockProtocol.m */,\n\t\t\t);\n\t\t\tname = Protocols;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43BB043519ED07BE000FBC0D /* CSS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t437B6F8519EBC98A003023E8 /* DHCSS.h */,\n\t\t\t\t437B6F8619EBC98A003023E8 /* DHCSS.m */,\n\t\t\t\t437B6F8819EBCBCA003023E8 /* style.css */,\n\t\t\t);\n\t\t\tname = CSS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43BB043619ED07C3000FBC0D /* JavaScript */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43BB043719ED07DD000FBC0D /* DHJavaScript.h */,\n\t\t\t\t43BB043819ED07DD000FBC0D /* DHJavaScript.m */,\n\t\t\t\t438B45B71A10BB6F0047A156 /* DHJavaScriptBridge.h */,\n\t\t\t\t438B45B81A10BB6F0047A156 /* DHJavaScriptBridge.m */,\n\t\t\t\t43EED91B1B607DB800F3DC35 /* on_page_load.js */,\n\t\t\t\t43328E3419EDA0D8000D44AE /* scroll_to_current_anchor.js */,\n\t\t\t\t43BD91ED1AB31A9E001058C4 /* hash_change_notifier.js */,\n\t\t\t\t43BB044019ED0C86000FBC0D /* cocoa.js */,\n\t\t\t\t438E86491D1D4A3C00FB6CD8 /* apple.js */,\n\t\t\t\t43BB044B19ED3E78000FBC0D /* ruby.js */,\n\t\t\t\t43B98F6219EE740F00C46BD9 /* msdn.js */,\n\t\t\t);\n\t\t\tname = JavaScript;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43BB044F19ED48B6000FBC0D /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t436FDF5719FE57C600553931 /* Fonts */,\n\t\t\t\t433BDDB11DC3C3AC00B0B145 /* Settings.bundle */,\n\t\t\t\t43BB045019ED48BD000FBC0D /* ClassRuby.png */,\n\t\t\t\t43BB045119ED48BD000FBC0D /* ClassRubyRetina.png */,\n\t\t\t\t26480C2A1E2E9ABB00E3145E /* docset_icon.png */,\n\t\t\t\t43BB045219ED48BD000FBC0D /* ModuleRuby.png */,\n\t\t\t\t43BB045319ED48BD000FBC0D /* ModuleRubyRetina.png */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43EDD19C19C51E9F00A0EBEC /* Latency Tester */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43EDD19619C51E9C00A0EBEC /* DHLatencyTester.h */,\n\t\t\t\t43EDD19719C51E9C00A0EBEC /* DHLatencyTester.m */,\n\t\t\t\t43EDD19819C51E9C00A0EBEC /* DHLatencyTestResult.h */,\n\t\t\t\t43EDD19919C51E9C00A0EBEC /* DHLatencyTestResult.m */,\n\t\t\t);\n\t\t\tname = \"Latency Tester\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2ED919BB8D87007E594D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2EEB19BB8D87007E594D /* Dash */,\n\t\t\t\t43FD2EE419BB8D87007E594D /* Frameworks */,\n\t\t\t\t43FD2EE319BB8D87007E594D /* Products */,\n\t\t\t\t578166A9FCC162CE3E4A4980 /* Pods */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2EE319BB8D87007E594D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2EE219BB8D87007E594D /* Dash.app */,\n\t\t\t\t43AB65B21ED19D2F00A6EC18 /* Dash.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2EE419BB8D87007E594D /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43A1C2632001700600512DB3 /* Apple_Docs_Framework.framework */,\n\t\t\t\t43BB043E19ED0B19000FBC0D /* JavaScriptCore.framework */,\n\t\t\t\t430C768C19E55E6E006F0DE0 /* MobileCoreServices.framework */,\n\t\t\t\t437FE06719E2B4010022ADF4 /* WebKit.framework */,\n\t\t\t\t43352F6419C7A69900D4B1D8 /* libz.dylib */,\n\t\t\t\t4303A3C319C658B000A7CD85 /* libsqlite3.dylib */,\n\t\t\t\t43FD2EE519BB8D87007E594D /* Foundation.framework */,\n\t\t\t\t43FD2EE719BB8D87007E594D /* CoreGraphics.framework */,\n\t\t\t\t43FD2EE919BB8D87007E594D /* UIKit.framework */,\n\t\t\t\t9A2364AD2032B0714BCD2265 /* libPods-Dash.a */,\n\t\t\t\t9FB91D369AD27465BED375AD /* libPods-Dash-Dash App Store.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2EEB19BB8D87007E594D /* Dash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43F70ABF19CBBD20000849C8 /* Defaults.plist */,\n\t\t\t\t43FD2EFA19BB8D87007E594D /* Main.storyboard */,\n\t\t\t\t438B06DE19FFA2DF009A539D /* Launch.xib */,\n\t\t\t\t43FD2EF419BB8D87007E594D /* DHAppDelegate.h */,\n\t\t\t\t43FD2EF519BB8D87007E594D /* DHAppDelegate.m */,\n\t\t\t\t4303A3AF19C657FE00A7CD85 /* Database */,\n\t\t\t\t438525E919C1509A002BAFD1 /* Searcher */,\n\t\t\t\t437AD41819E26F0A00BA0FE4 /* WebView */,\n\t\t\t\t4341A1F319BFE6D200AD164A /* Browser */,\n\t\t\t\t4341A1F219BFE6CA00AD164A /* Preferences */,\n\t\t\t\t4341A1F119BFE6B500AD164A /* Repos */,\n\t\t\t\t43573F751A997EB0000E6F2D /* Remote */,\n\t\t\t\t43B0956619BFD16C00F8611B /* Others */,\n\t\t\t\t438525E219C13E31002BAFD1 /* Utils */,\n\t\t\t\t43FD2F0319BB8D87007E594D /* Images.xcassets */,\n\t\t\t\t43BB044F19ED48B6000FBC0D /* Resources */,\n\t\t\t\t43FD2EEC19BB8D87007E594D /* Supporting Files */,\n\t\t\t\t43FD2EF319BB8D87007E594D /* Dash-Prefix.pch */,\n\t\t\t\t43FD2EED19BB8D87007E594D /* Dash-Info.plist */,\n\t\t\t);\n\t\t\tname = Dash;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2EEC19BB8D87007E594D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2EEE19BB8D87007E594D /* InfoPlist.strings */,\n\t\t\t\t43FD2EF119BB8D87007E594D /* main.m */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t578166A9FCC162CE3E4A4980 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBAE47FF5DEE33300EBFF9AEA /* Pods-Dash.debug.xcconfig */,\n\t\t\t\t7E45E2662CBB7671D0D844A3 /* Pods-Dash.release.xcconfig */,\n\t\t\t\t642921D57BB2F4B0450331EC /* Pods-Dash-Dash App Store.debug.xcconfig */,\n\t\t\t\t6BB3997912C96D08897BF444 /* Pods-Dash-Dash App Store.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t43AB65311ED19D2F00A6EC18 /* Dash App Store */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 43AB65AF1ED19D2F00A6EC18 /* Build configuration list for PBXNativeTarget \"Dash App Store\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t43AB65321ED19D2F00A6EC18 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t43A1C24E200161D100512DB3 /* Embed Frameworks */,\n\t\t\t\t43AB65331ED19D2F00A6EC18 /* Sources */,\n\t\t\t\t43AB65821ED19D2F00A6EC18 /* Frameworks */,\n\t\t\t\t43AB658D1ED19D2F00A6EC18 /* Resources */,\n\t\t\t\t43AB65AC1ED19D2F00A6EC18 /* Git Hashes */,\n\t\t\t\t43AB65AD1ED19D2F00A6EC18 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t43AB65AE1ED19D2F00A6EC18 /* [CP] Copy Pods Resources */,\n\t\t\t\t43A1C2652001708700512DB3 /* Strip 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 = \"Dash App Store\";\n\t\t\tproductName = Dash;\n\t\t\tproductReference = 43AB65B21ED19D2F00A6EC18 /* Dash.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t43FD2EE119BB8D87007E594D /* Dash */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 43FD2F1A19BB8D87007E594D /* Build configuration list for PBXNativeTarget \"Dash\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t74E707306BFB902C5388BE39 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t43A1C26F200175E500512DB3 /* Embed Frameworks */,\n\t\t\t\t43FD2EDE19BB8D87007E594D /* Sources */,\n\t\t\t\t43FD2EDF19BB8D87007E594D /* Frameworks */,\n\t\t\t\t43FD2EE019BB8D87007E594D /* Resources */,\n\t\t\t\t43F760BF19EA8C57002BD8A6 /* Git Hashes */,\n\t\t\t\tC71793A2EB8A6FB0EA63C3D3 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t988D171F13583CC36FBA7412 /* [CP] Copy Pods Resources */,\n\t\t\t\t43A1C270200175F700512DB3 /* Strip 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 = Dash;\n\t\t\tproductName = Dash;\n\t\t\tproductReference = 43FD2EE219BB8D87007E594D /* Dash.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t43FD2EDA19BB8D87007E594D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tCLASSPREFIX = DH;\n\t\t\t\tLastUpgradeCheck = 0930;\n\t\t\t\tORGANIZATIONNAME = Kapeli;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t43AB65311ED19D2F00A6EC18 = {\n\t\t\t\t\t\tDevelopmentTeam = JP58VMK957;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t43FD2EE119BB8D87007E594D = {\n\t\t\t\t\t\tDevelopmentTeam = JP58VMK957;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tSystemCapabilities = {\n\t\t\t\t\t\t\tcom.apple.BackgroundModes = {\n\t\t\t\t\t\t\t\tenabled = 1;\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 43FD2EDD19BB8D87007E594D /* Build configuration list for PBXProject \"Dash iOS\" */;\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\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 43FD2ED919BB8D87007E594D;\n\t\t\tproductRefGroup = 43FD2EE319BB8D87007E594D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t43FD2EE119BB8D87007E594D /* Dash */,\n\t\t\t\t43AB65311ED19D2F00A6EC18 /* Dash App Store */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t43AB658D1ED19D2F00A6EC18 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43AB658E1ED19D2F00A6EC18 /* SourceCodePro-ExtraLight.ttf in Resources */,\n\t\t\t\t43AB658F1ED19D2F00A6EC18 /* SourceCodePro-Regular.ttf in Resources */,\n\t\t\t\t43AB65901ED19D2F00A6EC18 /* on_page_load.js in Resources */,\n\t\t\t\t43AB65911ED19D2F00A6EC18 /* ClassRuby.png in Resources */,\n\t\t\t\t43AB65921ED19D2F00A6EC18 /* Main.storyboard in Resources */,\n\t\t\t\t43AB65931ED19D2F00A6EC18 /* Launch.xib in Resources */,\n\t\t\t\t43AB65941ED19D2F00A6EC18 /* cocoa.js in Resources */,\n\t\t\t\t43AB65951ED19D2F00A6EC18 /* Images.xcassets in Resources */,\n\t\t\t\t43AB65961ED19D2F00A6EC18 /* DHRepoCell.xib in Resources */,\n\t\t\t\t43AB65971ED19D2F00A6EC18 /* SourceCodePro-Black.ttf in Resources */,\n\t\t\t\t43AB65981ED19D2F00A6EC18 /* DHLoadingCell.xib in Resources */,\n\t\t\t\t43AB65991ED19D2F00A6EC18 /* Settings.bundle in Resources */,\n\t\t\t\t43AB659A1ED19D2F00A6EC18 /* SourceCodePro-Semibold.ttf in Resources */,\n\t\t\t\t43AB659B1ED19D2F00A6EC18 /* ruby.js in Resources */,\n\t\t\t\t43AB659C1ED19D2F00A6EC18 /* SourceCodePro-Bold.ttf in Resources */,\n\t\t\t\t43AB659D1ED19D2F00A6EC18 /* SourceCodePro-Light.ttf in Resources */,\n\t\t\t\t43AB659E1ED19D2F00A6EC18 /* Defaults.plist in Resources */,\n\t\t\t\t43AB659F1ED19D2F00A6EC18 /* ModuleRuby.png in Resources */,\n\t\t\t\t43AB65A01ED19D2F00A6EC18 /* home.html in Resources */,\n\t\t\t\t43AB65A11ED19D2F00A6EC18 /* style.css in Resources */,\n\t\t\t\t43AB65A21ED19D2F00A6EC18 /* DHBrowserCell.xib in Resources */,\n\t\t\t\t43AB65A31ED19D2F00A6EC18 /* hash_change_notifier.js in Resources */,\n\t\t\t\t43AB65A41ED19D2F00A6EC18 /* InfoPlist.strings in Resources */,\n\t\t\t\t43AB65A51ED19D2F00A6EC18 /* ModuleRubyRetina.png in Resources */,\n\t\t\t\t43AB65A61ED19D2F00A6EC18 /* docset_icon.png in Resources */,\n\t\t\t\t43AB65A71ED19D2F00A6EC18 /* ionicons.ttf in Resources */,\n\t\t\t\t43AB65A81ED19D2F00A6EC18 /* ClassRubyRetina.png in Resources */,\n\t\t\t\t43AB65A91ED19D2F00A6EC18 /* apple.js in Resources */,\n\t\t\t\t43AB65AA1ED19D2F00A6EC18 /* scroll_to_current_anchor.js in Resources */,\n\t\t\t\t43AB65AB1ED19D2F00A6EC18 /* msdn.js in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43FD2EE019BB8D87007E594D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t436FDF6019FE57CD00553931 /* SourceCodePro-ExtraLight.ttf in Resources */,\n\t\t\t\t436FDF6219FE57CD00553931 /* SourceCodePro-Regular.ttf in Resources */,\n\t\t\t\t43EED91C1B607DB800F3DC35 /* on_page_load.js in Resources */,\n\t\t\t\t43BB045419ED48BD000FBC0D /* ClassRuby.png in Resources */,\n\t\t\t\t43FD2EFC19BB8D87007E594D /* Main.storyboard in Resources */,\n\t\t\t\t438B06DF19FFA2DF009A539D /* Launch.xib in Resources */,\n\t\t\t\t43BB044219ED0C86000FBC0D /* cocoa.js in Resources */,\n\t\t\t\t43FD2F0419BB8D87007E594D /* Images.xcassets in Resources */,\n\t\t\t\t43F7527519CD31D100D76F58 /* DHRepoCell.xib in Resources */,\n\t\t\t\t436FDF5E19FE57CD00553931 /* SourceCodePro-Black.ttf in Resources */,\n\t\t\t\t438D58C219E575D600012881 /* DHLoadingCell.xib in Resources */,\n\t\t\t\t433BDDB21DC3C3AC00B0B145 /* Settings.bundle in Resources */,\n\t\t\t\t436FDF6319FE57CD00553931 /* SourceCodePro-Semibold.ttf in Resources */,\n\t\t\t\t43BB044D19ED3E78000FBC0D /* ruby.js in Resources */,\n\t\t\t\t436FDF5F19FE57CD00553931 /* SourceCodePro-Bold.ttf in Resources */,\n\t\t\t\t436FDF6119FE57CD00553931 /* SourceCodePro-Light.ttf in Resources */,\n\t\t\t\t43F70AC019CBBD20000849C8 /* Defaults.plist in Resources */,\n\t\t\t\t43BB045619ED48BD000FBC0D /* ModuleRuby.png in Resources */,\n\t\t\t\t43AC700119E4530400E0DB43 /* home.html in Resources */,\n\t\t\t\t437B6F8919EBCBCA003023E8 /* style.css in Resources */,\n\t\t\t\t437AD41719E26C9500BA0FE4 /* DHBrowserCell.xib in Resources */,\n\t\t\t\t43BD91EE1AB31A9E001058C4 /* hash_change_notifier.js in Resources */,\n\t\t\t\t43FD2EF019BB8D87007E594D /* InfoPlist.strings in Resources */,\n\t\t\t\t43BB045719ED48BD000FBC0D /* ModuleRubyRetina.png in Resources */,\n\t\t\t\t26480C2B1E2E9ABB00E3145E /* docset_icon.png in Resources */,\n\t\t\t\t433BDDAE1DC3BE7700B0B145 /* ionicons.ttf in Resources */,\n\t\t\t\t43BB045519ED48BD000FBC0D /* ClassRubyRetina.png in Resources */,\n\t\t\t\t438E864A1D1D4A3C00FB6CD8 /* apple.js in Resources */,\n\t\t\t\t43328E3619EDA0D8000D44AE /* scroll_to_current_anchor.js in Resources */,\n\t\t\t\t43B98F6419EE740F00C46BD9 /* msdn.js 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\t43A1C2652001708700512DB3 /* Strip Frameworks */ = {\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 = \"Strip Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"################################################################################\\n#\\n# Copyright 2015 Realm Inc.\\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################################################################################\\n\\n# This script strips all non-valid architectures from dynamic libraries in\\n# the application's `Frameworks` directory.\\n#\\n# The following environment variables are required:\\n#\\n# BUILT_PRODUCTS_DIR\\n# FRAMEWORKS_FOLDER_PATH\\n# VALID_ARCHS\\n# EXPANDED_CODE_SIGN_IDENTITY\\n\\n\\n# Signs a framework with the provided identity\\ncode_sign() {\\n    # Use the current code_sign_identitiy\\n    echo \\\"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\\\"\\n    echo \\\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1\\\"\\n    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \\\"$1\\\"\\n}\\n\\necho \\\"Stripping frameworks\\\"\\ncd \\\"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}\\\"\\n\\nfor file in $(find . -type f -perm +111); do\\n# Skip non-dynamic libraries\\nif ! [[ \\\"$(file \\\"$file\\\")\\\" == *\\\"dynamically linked shared library\\\"* ]]; then\\ncontinue\\nfi\\n# Get architectures for current file\\narchs=\\\"$(lipo -info \\\"${file}\\\" | rev | cut -d ':' -f1 | rev)\\\"\\nstripped=\\\"\\\"\\nfor arch in $archs; do\\nif ! [[ \\\"${VALID_ARCHS}\\\" == *\\\"$arch\\\"* ]]; then\\n# Strip non-valid architectures in-place\\nlipo -remove \\\"$arch\\\" -output \\\"$file\\\" \\\"$file\\\" || exit 1\\nstripped=\\\"$stripped $arch\\\"\\nfi\\ndone\\nif [[ \\\"$stripped\\\" != \\\"\\\" ]]; then\\necho \\\"Stripped $file of architectures:$stripped\\\"\\nif [ \\\"${CODE_SIGNING_REQUIRED}\\\" == \\\"YES\\\" ]; then\\ncode_sign \\\"${file}\\\"\\nfi\\nfi\\ndone\\n\";\n\t\t};\n\t\t43A1C270200175F700512DB3 /* Strip Frameworks */ = {\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 = \"Strip Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"################################################################################\\n#\\n# Copyright 2015 Realm Inc.\\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################################################################################\\n\\n# This script strips all non-valid architectures from dynamic libraries in\\n# the application's `Frameworks` directory.\\n#\\n# The following environment variables are required:\\n#\\n# BUILT_PRODUCTS_DIR\\n# FRAMEWORKS_FOLDER_PATH\\n# VALID_ARCHS\\n# EXPANDED_CODE_SIGN_IDENTITY\\n\\n\\n# Signs a framework with the provided identity\\ncode_sign() {\\n    # Use the current code_sign_identitiy\\n    echo \\\"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\\\"\\n    echo \\\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements $1\\\"\\n    /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \\\"$1\\\"\\n}\\n\\necho \\\"Stripping frameworks\\\"\\ncd \\\"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}\\\"\\n\\nfor file in $(find . -type f -perm +111); do\\n# Skip non-dynamic libraries\\nif ! [[ \\\"$(file \\\"$file\\\")\\\" == *\\\"dynamically linked shared library\\\"* ]]; then\\ncontinue\\nfi\\n# Get architectures for current file\\narchs=\\\"$(lipo -info \\\"${file}\\\" | rev | cut -d ':' -f1 | rev)\\\"\\nstripped=\\\"\\\"\\nfor arch in $archs; do\\nif ! [[ \\\"${VALID_ARCHS}\\\" == *\\\"$arch\\\"* ]]; then\\n# Strip non-valid architectures in-place\\nlipo -remove \\\"$arch\\\" -output \\\"$file\\\" \\\"$file\\\" || exit 1\\nstripped=\\\"$stripped $arch\\\"\\nfi\\ndone\\nif [[ \\\"$stripped\\\" != \\\"\\\" ]]; then\\necho \\\"Stripped $file of architectures:$stripped\\\"\\nif [ \\\"${CODE_SIGNING_REQUIRED}\\\" == \\\"YES\\\" ]; then\\ncode_sign \\\"${file}\\\"\\nfi\\nfi\\ndone\\n\";\n\t\t};\n\t\t43AB65321ED19D2F00A6EC18 /* [CP] 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\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Dash-Dash App Store-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t43AB65AC1ED19D2F00A6EC18 /* Git Hashes */ = {\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 = \"Git Hashes\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"[ -d /Users/bogdan/Projects/Dash ] || exit 0;\\n \\nPLISTBUDDY=\\\"/usr/libexec/PlistBuddy\\\"\\nINFOPLISTPATH=\\\"${TARGET_BUILD_DIR}/${EXECUTABLE_NAME}.app/Info.plist\\\"\\n\\ncd \\\"/Users/bogdan/Projects/Dash/Dash/\\\"\\n\\nDHDBSearcherCommit=$(git log -n 1 --pretty=format:%h -- DHDBSearcher.m)\\n$PLISTBUDDY -c \\\"Set :DHDBSearcherCommit $DHDBSearcherCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBResultCommit=$(git log -n 1 --pretty=format:%h -- DHDBResult.m)\\n$PLISTBUDDY -c \\\"Set :DHDBResultCommit $DHDBResultCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBUnifiedResultCommit=$(git log -n 1 --pretty=format:%h -- DHDBUnifiedResult.m)\\n$PLISTBUDDY -c \\\"Set :DHDBUnifiedResultCommit $DHDBUnifiedResultCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHQueuedDBCommit=$(git log -n 1 --pretty=format:%h -- DHQueuedDB.m)\\n$PLISTBUDDY -c \\\"Set :DHQueuedDBCommit $DHQueuedDBCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHUnifiedQueuedDBCommit=$(git log -n 1 --pretty=format:%h -- DHUnifiedQueuedDB.m)\\n$PLISTBUDDY -c \\\"Set :DHUnifiedQueuedDBCommit $DHUnifiedQueuedDBCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHTypesCommit=$(git log -n 1 --pretty=format:%h -- DHTypes.m)\\n$PLISTBUDDY -c \\\"Set :DHTypesCommit $DHTypesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBUnifiedOperationCommit=$(git log -n 1 --pretty=format:%h -- DHDBUnifiedOperation.m)\\n$PLISTBUDDY -c \\\"Set :DHDBUnifiedOperationCommit $DHDBUnifiedOperationCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHWebPreferencesCommit=$(git log -n 1 --pretty=format:%h -- DHWebPreferences.m)\\n$PLISTBUDDY -c \\\"Set :DHWebPreferencesCommit $DHWebPreferencesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHWebViewControllerCommit=$(git log -n 1 --pretty=format:%h -- DHWebViewController.m)\\n$PLISTBUDDY -c \\\"Set :DHWebViewControllerCommit $DHWebViewControllerCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDocsetDownloaderCommit=$(git log -n 1 --pretty=format:%h -- DHDocsetDownloader.m)\\n$PLISTBUDDY -c \\\"Set :DHDocsetDownloaderCommit $DHDocsetDownloaderCommit\\\" \\\"${INFOPLISTPATH}\\\"\\n\\ncd \\\"/Users/bogdan/Projects/Dash/Resources/\\\"\\n\\nPlatformIconsCommit=$(git log -n 1 --pretty=format:%h -- PlatformIcons)\\n$PLISTBUDDY -c \\\"Set :PlatformIconsCommit $PlatformIconsCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nTypesCommit=$(git log -n 1 --pretty=format:%h -- Types)\\n$PLISTBUDDY -c \\\"Set :TypesCommit $TypesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nCSSCommit=$(git log -n 1 --pretty=format:%h -- CSS)\\n$PLISTBUDDY -c \\\"Set :CSSCommit $CSSCommit\\\" \\\"${INFOPLISTPATH}\\\"\\n\";\n\t\t};\n\t\t43AB65AD1ED19D2F00A6EC18 /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t43AB65AE1ED19D2F00A6EC18 /* [CP] 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\t\"${SRCROOT}/../Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-resources.sh\",\n\t\t\t\t\"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\",\n\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/HockeySDK/HockeySDKResources.bundle\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SAMKeychain.bundle\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/HockeySDKResources.bundle\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/../Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t43F760BF19EA8C57002BD8A6 /* Git Hashes */ = {\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 = \"Git Hashes\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"[ -d /Users/bogdan/Projects/Dash ] || exit 0;\\n \\nPLISTBUDDY=\\\"/usr/libexec/PlistBuddy\\\"\\nINFOPLISTPATH=\\\"${TARGET_BUILD_DIR}/${EXECUTABLE_NAME}.app/Info.plist\\\"\\n\\ncd \\\"/Users/bogdan/Projects/Dash/Dash/\\\"\\n\\nDHDBSearcherCommit=$(git log -n 1 --pretty=format:%h -- DHDBSearcher.m)\\n$PLISTBUDDY -c \\\"Set :DHDBSearcherCommit $DHDBSearcherCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBResultCommit=$(git log -n 1 --pretty=format:%h -- DHDBResult.m)\\n$PLISTBUDDY -c \\\"Set :DHDBResultCommit $DHDBResultCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBUnifiedResultCommit=$(git log -n 1 --pretty=format:%h -- DHDBUnifiedResult.m)\\n$PLISTBUDDY -c \\\"Set :DHDBUnifiedResultCommit $DHDBUnifiedResultCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHQueuedDBCommit=$(git log -n 1 --pretty=format:%h -- DHQueuedDB.m)\\n$PLISTBUDDY -c \\\"Set :DHQueuedDBCommit $DHQueuedDBCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHUnifiedQueuedDBCommit=$(git log -n 1 --pretty=format:%h -- DHUnifiedQueuedDB.m)\\n$PLISTBUDDY -c \\\"Set :DHUnifiedQueuedDBCommit $DHUnifiedQueuedDBCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHTypesCommit=$(git log -n 1 --pretty=format:%h -- DHTypes.m)\\n$PLISTBUDDY -c \\\"Set :DHTypesCommit $DHTypesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDBUnifiedOperationCommit=$(git log -n 1 --pretty=format:%h -- DHDBUnifiedOperation.m)\\n$PLISTBUDDY -c \\\"Set :DHDBUnifiedOperationCommit $DHDBUnifiedOperationCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHWebPreferencesCommit=$(git log -n 1 --pretty=format:%h -- DHWebPreferences.m)\\n$PLISTBUDDY -c \\\"Set :DHWebPreferencesCommit $DHWebPreferencesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHWebViewControllerCommit=$(git log -n 1 --pretty=format:%h -- DHWebViewController.m)\\n$PLISTBUDDY -c \\\"Set :DHWebViewControllerCommit $DHWebViewControllerCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nDHDocsetDownloaderCommit=$(git log -n 1 --pretty=format:%h -- DHDocsetDownloader.m)\\n$PLISTBUDDY -c \\\"Set :DHDocsetDownloaderCommit $DHDocsetDownloaderCommit\\\" \\\"${INFOPLISTPATH}\\\"\\n\\ncd \\\"/Users/bogdan/Projects/Dash/Resources/\\\"\\n\\nPlatformIconsCommit=$(git log -n 1 --pretty=format:%h -- PlatformIcons)\\n$PLISTBUDDY -c \\\"Set :PlatformIconsCommit $PlatformIconsCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nTypesCommit=$(git log -n 1 --pretty=format:%h -- Types)\\n$PLISTBUDDY -c \\\"Set :TypesCommit $TypesCommit\\\" \\\"${INFOPLISTPATH}\\\"\\nCSSCommit=$(git log -n 1 --pretty=format:%h -- CSS)\\n$PLISTBUDDY -c \\\"Set :CSSCommit $CSSCommit\\\" \\\"${INFOPLISTPATH}\\\"\";\n\t\t};\n\t\t74E707306BFB902C5388BE39 /* [CP] 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\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-Dash-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t988D171F13583CC36FBA7412 /* [CP] 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\t\"${SRCROOT}/../Pods/Target Support Files/Pods-Dash/Pods-Dash-resources.sh\",\n\t\t\t\t\"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SAMKeychain.bundle\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/../Pods/Target Support Files/Pods-Dash/Pods-Dash-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tC71793A2EB8A6FB0EA63C3D3 /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-Dash/Pods-Dash-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t43AB65331ED19D2F00A6EC18 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43F31AAE200BB52F0082066C /* DHDocsetBrowserViewModel.m in Sources */,\n\t\t\t\t43AB65341ED19D2F00A6EC18 /* DHAppDelegate.m in Sources */,\n\t\t\t\t43AB65351ED19D2F00A6EC18 /* DHType.m in Sources */,\n\t\t\t\t43AB65361ED19D2F00A6EC18 /* UIViewController+DHUtils.m in Sources */,\n\t\t\t\t43AB65371ED19D2F00A6EC18 /* NSObject+DHUtils.m in Sources */,\n\t\t\t\t43AB65381ED19D2F00A6EC18 /* UIView+DHUtils.m in Sources */,\n\t\t\t\t43AB65391ED19D2F00A6EC18 /* NSString+DHUtils.m in Sources */,\n\t\t\t\t43AB653A1ED19D2F00A6EC18 /* FMDatabase.m in Sources */,\n\t\t\t\t43AB653B1ED19D2F00A6EC18 /* DHPreferences.m in Sources */,\n\t\t\t\t43AB653C1ED19D2F00A6EC18 /* DHTypeBrowser.m in Sources */,\n\t\t\t\t43AB653D1ED19D2F00A6EC18 /* DHCheatRepo.m in Sources */,\n\t\t\t\t43AB653E1ED19D2F00A6EC18 /* NSURL+DHUtils.m in Sources */,\n\t\t\t\t43AB653F1ED19D2F00A6EC18 /* DHFeedResult.m in Sources */,\n\t\t\t\t43AB65401ED19D2F00A6EC18 /* DHWebViewController.m in Sources */,\n\t\t\t\t43AB65411ED19D2F00A6EC18 /* NSData+DHUtils.m in Sources */,\n\t\t\t\t43AB65421ED19D2F00A6EC18 /* FMDatabaseAdditions.m in Sources */,\n\t\t\t\t43AB65431ED19D2F00A6EC18 /* DHRepoTableView.m in Sources */,\n\t\t\t\t43AB65441ED19D2F00A6EC18 /* DHBlockProtocol.m in Sources */,\n\t\t\t\t43AB65451ED19D2F00A6EC18 /* DHRepo.m in Sources */,\n\t\t\t\t43AB65461ED19D2F00A6EC18 /* DHWindow.m in Sources */,\n\t\t\t\t43AB65471ED19D2F00A6EC18 /* DHAppUpdateChecker.m in Sources */,\n\t\t\t\t43AB65481ED19D2F00A6EC18 /* NSString+GTM.m in Sources */,\n\t\t\t\t43AB65491ED19D2F00A6EC18 /* DHDBSearcher.m in Sources */,\n\t\t\t\t43AB654A1ED19D2F00A6EC18 /* DHRemoteImage.m in Sources */,\n\t\t\t\t43AB654B1ED19D2F00A6EC18 /* DHAppleActiveLanguage.m in Sources */,\n\t\t\t\t43AB654C1ED19D2F00A6EC18 /* DHBrowserTableView.m in Sources */,\n\t\t\t\t43AB654D1ED19D2F00A6EC18 /* DHRemote.m in Sources */,\n\t\t\t\t43AB654E1ED19D2F00A6EC18 /* DHWebProgressView.m in Sources */,\n\t\t\t\t43AB654F1ED19D2F00A6EC18 /* DHDocset.m in Sources */,\n\t\t\t\t43AB65501ED19D2F00A6EC18 /* UITableView+DHUtils.m in Sources */,\n\t\t\t\t43AB65511ED19D2F00A6EC18 /* NSArray+DHUtils.m in Sources */,\n\t\t\t\t43AB65521ED19D2F00A6EC18 /* DHDBNestedResultSorter.m in Sources */,\n\t\t\t\t43AB65531ED19D2F00A6EC18 /* DHCSS.m in Sources */,\n\t\t\t\t43AB65541ED19D2F00A6EC18 /* DHDBResultSorter.m in Sources */,\n\t\t\t\t43AB65551ED19D2F00A6EC18 /* DHRemoteBrowser.m in Sources */,\n\t\t\t\t43AB65561ED19D2F00A6EC18 /* FMDatabaseQueue.m in Sources */,\n\t\t\t\t43AB65571ED19D2F00A6EC18 /* main.m in Sources */,\n\t\t\t\t43AB65581ED19D2F00A6EC18 /* DHTocBrowser.m in Sources */,\n\t\t\t\t43AB65591ED19D2F00A6EC18 /* DHDocsetDownloader.m in Sources */,\n\t\t\t\t43AB655A1ED19D2F00A6EC18 /* UIButton+DHUtils.m in Sources */,\n\t\t\t\t43AB655B1ED19D2F00A6EC18 /* DHSplitViewController.m in Sources */,\n\t\t\t\t43AB655C1ED19D2F00A6EC18 /* DHWebView.m in Sources */,\n\t\t\t\t43AB655D1ED19D2F00A6EC18 /* DHBrowserTableViewCell.m in Sources */,\n\t\t\t\t43AB655E1ED19D2F00A6EC18 /* DHDocsetManager.m in Sources */,\n\t\t\t\t43AB655F1ED19D2F00A6EC18 /* DHTransferFeed.m in Sources */,\n\t\t\t\t43AB65601ED19D2F00A6EC18 /* NSFileManager+DHUtils.m in Sources */,\n\t\t\t\t43AB65611ED19D2F00A6EC18 /* whitespace_tokenizer.c in Sources */,\n\t\t\t\t43AB65621ED19D2F00A6EC18 /* DHJavaScriptBridge.m in Sources */,\n\t\t\t\t43AB65631ED19D2F00A6EC18 /* NSTimer+DHUtils.m in Sources */,\n\t\t\t\t43AB65641ED19D2F00A6EC18 /* DHTarixProtocol.m in Sources */,\n\t\t\t\t43AB65651ED19D2F00A6EC18 /* DHTypes.m in Sources */,\n\t\t\t\t43AB65661ED19D2F00A6EC18 /* FMDatabasePool.m in Sources */,\n\t\t\t\t43AB65671ED19D2F00A6EC18 /* DHDocsetTransferrer.m in Sources */,\n\t\t\t\t43AB65681ED19D2F00A6EC18 /* DHSearchDisplayController.m in Sources */,\n\t\t\t\t43AB65691ED19D2F00A6EC18 /* DHNavigationController.m in Sources */,\n\t\t\t\t43AB656A1ED19D2F00A6EC18 /* DHRepoTableViewCell.m in Sources */,\n\t\t\t\t43AB656B1ED19D2F00A6EC18 /* DHFeed.m in Sources */,\n\t\t\t\t43AB656C1ED19D2F00A6EC18 /* DHRemoteServer.m in Sources */,\n\t\t\t\t43AB656D1ED19D2F00A6EC18 /* DHLatencyTestResult.m in Sources */,\n\t\t\t\t43AB656E1ED19D2F00A6EC18 /* DHDBSearchController.m in Sources */,\n\t\t\t\t43AB656F1ED19D2F00A6EC18 /* DHCheatRepoList.m in Sources */,\n\t\t\t\t43AB65701ED19D2F00A6EC18 /* DHQueuedDB.m in Sources */,\n\t\t\t\t43AB65711ED19D2F00A6EC18 /* FMResultSet.m in Sources */,\n\t\t\t\t43AB65721ED19D2F00A6EC18 /* DHUserRepoList.m in Sources */,\n\t\t\t\t43AB65731ED19D2F00A6EC18 /* DHUserRepo.m in Sources */,\n\t\t\t\t43AB65741ED19D2F00A6EC18 /* DHNavigationAnimator.m in Sources */,\n\t\t\t\t43AB65751ED19D2F00A6EC18 /* DHEntryBrowser.m in Sources */,\n\t\t\t\t43AB65761ED19D2F00A6EC18 /* DHUnarchiver.m in Sources */,\n\t\t\t\t43AB65771ED19D2F00A6EC18 /* DHDocsetIndexer.m in Sources */,\n\t\t\t\t43A1C26A200175B900512DB3 /* DHAppleAPIProtocol.m in Sources */,\n\t\t\t\t43AB65781ED19D2F00A6EC18 /* DHRightDetailLabel.m in Sources */,\n\t\t\t\t43AB65791ED19D2F00A6EC18 /* DHTarixIndex.m in Sources */,\n\t\t\t\t43AB657A1ED19D2F00A6EC18 /* DHJavaScript.m in Sources */,\n\t\t\t\t43AB657B1ED19D2F00A6EC18 /* DHDBResult.m in Sources */,\n\t\t\t\t43AB657C1ED19D2F00A6EC18 /* DHNestedViewController.m in Sources */,\n\t\t\t\t43AB657D1ED19D2F00A6EC18 /* DHFileDownload.m in Sources */,\n\t\t\t\t43AB657E1ED19D2F00A6EC18 /* DHLatencyTester.m in Sources */,\n\t\t\t\t43AB657F1ED19D2F00A6EC18 /* DHImageCache.m in Sources */,\n\t\t\t\t43AB65801ED19D2F00A6EC18 /* DHDocsetBrowser.m in Sources */,\n\t\t\t\t43AB65811ED19D2F00A6EC18 /* DHRemoteProtocol.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t43FD2EDE19BB8D87007E594D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t43FD2EF619BB8D87007E594D /* DHAppDelegate.m in Sources */,\n\t\t\t\t4303A3D119C668BC00A7CD85 /* DHType.m in Sources */,\n\t\t\t\t43A356CB19FFCE4D0073D143 /* UIViewController+DHUtils.m in Sources */,\n\t\t\t\t43BB044619ED1BB8000FBC0D /* NSObject+DHUtils.m in Sources */,\n\t\t\t\t43915EE919C5D2FD002806FF /* UIView+DHUtils.m in Sources */,\n\t\t\t\t438525E819C13ECE002BAFD1 /* NSString+DHUtils.m in Sources */,\n\t\t\t\t4303A3BD19C6584F00A7CD85 /* FMDatabase.m in Sources */,\n\t\t\t\t4398D34619BF55B500457CAF /* DHPreferences.m in Sources */,\n\t\t\t\t437FE06619E2AC0D0022ADF4 /* DHTypeBrowser.m in Sources */,\n\t\t\t\t435145971DEB7035000874A8 /* DHCheatRepo.m in Sources */,\n\t\t\t\t43CF8AF119D5DA060010E698 /* NSURL+DHUtils.m in Sources */,\n\t\t\t\t43EDD19F19C52E3400A0EBEC /* DHFeedResult.m in Sources */,\n\t\t\t\t43FD2F0219BB8D87007E594D /* DHWebViewController.m in Sources */,\n\t\t\t\t43DCAEB81A9C3C8500A28A95 /* NSData+DHUtils.m in Sources */,\n\t\t\t\t4303A3BE19C6584F00A7CD85 /* FMDatabaseAdditions.m in Sources */,\n\t\t\t\t436DF78019FFA926008814F8 /* DHRepoTableView.m in Sources */,\n\t\t\t\t43F25F9C19EBDEF30025CDC4 /* DHBlockProtocol.m in Sources */,\n\t\t\t\t43B0956C19BFD57500F8611B /* DHRepo.m in Sources */,\n\t\t\t\t43D7E4F01BB4C62E00FC1DEF /* DHWindow.m in Sources */,\n\t\t\t\tF5C39C00200A836D00734571 /* DHDocsetBrowserViewModel.m in Sources */,\n\t\t\t\t43BD6BF41DCE379B0005A1E7 /* DHAppUpdateChecker.m in Sources */,\n\t\t\t\t439051FC19E68FE20083A55E /* NSString+GTM.m in Sources */,\n\t\t\t\t43D4F06719E7D68100C22AF5 /* DHDBSearcher.m in Sources */,\n\t\t\t\t43DFED831A9EE104008F7795 /* DHRemoteImage.m in Sources */,\n\t\t\t\t43AF0E151D1861CE00F0D8A0 /* DHAppleActiveLanguage.m in Sources */,\n\t\t\t\t43256F0719F7A6A8003919BA /* DHBrowserTableView.m in Sources */,\n\t\t\t\t43DFED801A9EBEA5008F7795 /* DHRemote.m in Sources */,\n\t\t\t\t4338AB601AAF70AF007B85DE /* DHWebProgressView.m in Sources */,\n\t\t\t\t4303A3C719C6590000A7CD85 /* DHDocset.m in Sources */,\n\t\t\t\t43256F0A19F7B4B9003919BA /* UITableView+DHUtils.m in Sources */,\n\t\t\t\t438525E519C13E42002BAFD1 /* NSArray+DHUtils.m in Sources */,\n\t\t\t\t43D4F06A19E7DF3900C22AF5 /* DHDBNestedResultSorter.m in Sources */,\n\t\t\t\t437B6F8719EBC98A003023E8 /* DHCSS.m in Sources */,\n\t\t\t\t4390520019E692D90083A55E /* DHDBResultSorter.m in Sources */,\n\t\t\t\t432321E21AA1BBF70045BA77 /* DHRemoteBrowser.m in Sources */,\n\t\t\t\t4303A3C119C6584F00A7CD85 /* FMDatabaseQueue.m in Sources */,\n\t\t\t\t43FD2EF219BB8D87007E594D /* main.m in Sources */,\n\t\t\t\t43D28EBB19F97D5500FDC5EE /* DHTocBrowser.m in Sources */,\n\t\t\t\t43B0956F19BFDBDC00F8611B /* DHDocsetDownloader.m in Sources */,\n\t\t\t\t43F7527319CD1C2000D76F58 /* UIButton+DHUtils.m in Sources */,\n\t\t\t\t434A77DC1BAE590C00CCF84B /* DHSplitViewController.m in Sources */,\n\t\t\t\t43418C281A0B63B00014EFB6 /* DHWebView.m in Sources */,\n\t\t\t\t439051F619E67D840083A55E /* DHBrowserTableViewCell.m in Sources */,\n\t\t\t\t43A6D9C919E0D69700780BC8 /* DHDocsetManager.m in Sources */,\n\t\t\t\t437699A719D8FD3D008B37F4 /* DHTransferFeed.m in Sources */,\n\t\t\t\t438F622419D5E81A00AF71BC /* NSFileManager+DHUtils.m in Sources */,\n\t\t\t\t4303A3BC19C6584F00A7CD85 /* whitespace_tokenizer.c in Sources */,\n\t\t\t\t438B45B91A10BB6F0047A156 /* DHJavaScriptBridge.m in Sources */,\n\t\t\t\t4361651D19CCF8500026F08E /* NSTimer+DHUtils.m in Sources */,\n\t\t\t\t430C768B19E52B7F006F0DE0 /* DHTarixProtocol.m in Sources */,\n\t\t\t\t4303A3D419C668C200A7CD85 /* DHTypes.m in Sources */,\n\t\t\t\t4303A3C019C6584F00A7CD85 /* FMDatabasePool.m in Sources */,\n\t\t\t\t4341A1F619BFE89A00AD164A /* DHDocsetTransferrer.m in Sources */,\n\t\t\t\t43F760B219EA61B5002BD8A6 /* DHSearchDisplayController.m in Sources */,\n\t\t\t\t43DF51941A07B4C0006AB295 /* DHNavigationController.m in Sources */,\n\t\t\t\t434AB15719C2738900791E07 /* DHRepoTableViewCell.m in Sources */,\n\t\t\t\t438525E119C129FC002BAFD1 /* DHFeed.m in Sources */,\n\t\t\t\t43573F781A997EC7000E6F2D /* DHRemoteServer.m in Sources */,\n\t\t\t\t43EDD19B19C51E9C00A0EBEC /* DHLatencyTestResult.m in Sources */,\n\t\t\t\t43D4F06D19E7E88400C22AF5 /* DHDBSearchController.m in Sources */,\n\t\t\t\t4351459A1DEB7099000874A8 /* DHCheatRepoList.m in Sources */,\n\t\t\t\t43D4F06419E7CEC500C22AF5 /* DHQueuedDB.m in Sources */,\n\t\t\t\t4303A3BF19C6584F00A7CD85 /* FMResultSet.m in Sources */,\n\t\t\t\t43FC34041DE784C40089F134 /* DHUserRepoList.m in Sources */,\n\t\t\t\t43280F541DDE4A7B001C2062 /* DHUserRepo.m in Sources */,\n\t\t\t\t43B0956919BFD19900F8611B /* DHNavigationAnimator.m in Sources */,\n\t\t\t\t439051F919E684160083A55E /* DHEntryBrowser.m in Sources */,\n\t\t\t\t431108D519C7AE6D0050174C /* DHUnarchiver.m in Sources */,\n\t\t\t\t4303A3CD19C65E6A00A7CD85 /* DHDocsetIndexer.m in Sources */,\n\t\t\t\t43A1C269200175B900512DB3 /* DHAppleAPIProtocol.m in Sources */,\n\t\t\t\t436F3E4319D4F617007BBC25 /* DHRightDetailLabel.m in Sources */,\n\t\t\t\t43F84A7619EEBD1A008FE85C /* DHTarixIndex.m in Sources */,\n\t\t\t\t43BB043919ED07DD000FBC0D /* DHJavaScript.m in Sources */,\n\t\t\t\t438525EC19C150AC002BAFD1 /* DHDBResult.m in Sources */,\n\t\t\t\t4342C8A519E93FF200BE66A2 /* DHNestedViewController.m in Sources */,\n\t\t\t\t43EDD1A219C5309300A0EBEC /* DHFileDownload.m in Sources */,\n\t\t\t\t43EDD19A19C51E9C00A0EBEC /* DHLatencyTester.m in Sources */,\n\t\t\t\t431173DC19DA3513007E238E /* DHImageCache.m in Sources */,\n\t\t\t\t43FD2EFF19BB8D87007E594D /* DHDocsetBrowser.m in Sources */,\n\t\t\t\t43AAB7821AAE776800DB76F3 /* DHRemoteProtocol.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\t43FD2EEE19BB8D87007E594D /* InfoPlist.strings */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2EEF19BB8D87007E594D /* en */,\n\t\t\t);\n\t\t\tname = InfoPlist.strings;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t43FD2EFA19BB8D87007E594D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t43FD2EFB19BB8D87007E594D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t43AB65B01ED19D2F00A6EC18 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 642921D57BB2F4B0450331EC /* Pods-Dash-Dash App Store.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;\n\t\t\t\tCLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Distribution: Bogdan Popescu (JP58VMK957)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../Frameworks\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Dash-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"COCOAPODS=1\",\n\t\t\t\t\t\"APP_STORE=1\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tIBC_NOTICES = NO;\n\t\t\t\tIBC_WARNINGS = NO;\n\t\t\t\tIBSC_NOTICES = NO;\n\t\t\t\tIBSC_WARNINGS = NO;\n\t\t\t\tINFOPLIST_FILE = \"Dash-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kapeli.dash.ios;\n\t\t\t\tPRODUCT_NAME = Dash;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_STYLE = debugging;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t43AB65B11ED19D2F00A6EC18 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 6BB3997912C96D08897BF444 /* Pods-Dash-Dash App Store.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO;\n\t\t\t\tCLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = NO;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework\\\"\",\n\t\t\t\t\t\"\\\"$(SRCROOT)/../Frameworks\\\"\",\n\t\t\t\t);\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Dash-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"COCOAPODS=1\",\n\t\t\t\t\tNDEBUG,\n\t\t\t\t\t\"APP_STORE=1\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tIBC_NOTICES = NO;\n\t\t\t\tIBC_WARNINGS = NO;\n\t\t\t\tIBSC_NOTICES = NO;\n\t\t\t\tIBSC_WARNINGS = NO;\n\t\t\t\tINFOPLIST_FILE = \"Dash-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kapeli.dash.ios;\n\t\t\t\tPRODUCT_NAME = Dash;\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_STYLE = debugging;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t43FD2F1819BB8D87007E594D /* 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_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_ERROR;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\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 = 9.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSYMROOT = ../build;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tWARNING_CFLAGS = \"-Wno-objc-designated-initializers\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t43FD2F1919BB8D87007E594D /* 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_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\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 = 9.0;\n\t\t\t\tOTHER_CFLAGS = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSYMROOT = ../build;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tWARNING_CFLAGS = \"-Wno-objc-designated-initializers\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t43FD2F1B19BB8D87007E594D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BAE47FF5DEE33300EBFF9AEA /* Pods-Dash.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = JP58VMK957;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/../Frameworks\\\"\";\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Dash-Prefix.pch\";\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tIBC_NOTICES = NO;\n\t\t\t\tIBC_WARNINGS = NO;\n\t\t\t\tIBSC_NOTICES = NO;\n\t\t\t\tIBSC_WARNINGS = NO;\n\t\t\t\tINFOPLIST_FILE = \"Dash-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kapeli.dash.ios;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_STYLE = debugging;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\n\t\t\t\tWRAPPER_EXTENSION = app;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t43FD2F1C19BB8D87007E594D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7E45E2662CBB7671D0D844A3 /* Pods-Dash.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer: Bogdan Popescu (JB3QRP5DC5)\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEVELOPMENT_TEAM = JP58VMK957;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\\\"$(SRCROOT)/../Frameworks\\\"\";\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Dash-Prefix.pch\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"COCOAPODS=1\",\n\t\t\t\t\tNDEBUG,\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;\n\t\t\t\tIBC_NOTICES = NO;\n\t\t\t\tIBC_WARNINGS = NO;\n\t\t\t\tIBSC_NOTICES = NO;\n\t\t\t\tIBSC_WARNINGS = NO;\n\t\t\t\tINFOPLIST_FILE = \"Dash-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.kapeli.dash.ios;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSTRIP_STYLE = debugging;\n\t\t\t\tSTRIP_SWIFT_SYMBOLS = NO;\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\t43AB65AF1ED19D2F00A6EC18 /* Build configuration list for PBXNativeTarget \"Dash App Store\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t43AB65B01ED19D2F00A6EC18 /* Debug */,\n\t\t\t\t43AB65B11ED19D2F00A6EC18 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t43FD2EDD19BB8D87007E594D /* Build configuration list for PBXProject \"Dash iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t43FD2F1819BB8D87007E594D /* Debug */,\n\t\t\t\t43FD2F1919BB8D87007E594D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t43FD2F1A19BB8D87007E594D /* Build configuration list for PBXNativeTarget \"Dash\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t43FD2F1B19BB8D87007E594D /* Debug */,\n\t\t\t\t43FD2F1C19BB8D87007E594D /* 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 = 43FD2EDA19BB8D87007E594D /* Project object */;\n}\n"
  },
  {
    "path": "Dash/Dash iOS.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Dash iOS.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Dash/Dash iOS.xcodeproj/project.xcworkspace/xcshareddata/Dash iOS.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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>C02C30F8-F308-43A9-A650-2CDC908CD42D</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>Dash iOS</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>395522B8-D3D5-4330-ADA3-6704BFDEC894</key>\n\t\t<string>file:///Users/bogdan/Dropbox/repos/Dash%20iOS.git/</string>\n\t\t<key>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</key>\n\t\t<string>/Users/bogdan/Dropbox/repos/Dash%20iOS.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>Dash iOS.xcodeproj</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>395522B8-D3D5-4330-ADA3-6704BFDEC894</key>\n\t\t<string>../../../Dash iOS</string>\n\t\t<key>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</key>\n\t\t<string>../..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>/Users/bogdan/Dropbox/repos/Dash%20iOS.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</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>395522B8-D3D5-4330-ADA3-6704BFDEC894</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Dash iOS</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>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Dash%20iOS</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash/Dash iOS.xcodeproj/project.xcworkspace/xcshareddata/Dash iOS.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"F5E17E5D12ABF060C985F6771FC999275B646DB4\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"395522B8-D3D5-4330-ADA3-6704BFDEC894\" : 0,\n    \"F5E17E5D12ABF060C985F6771FC999275B646DB4\" : 9223372036854775807\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"C02C30F8-F308-43A9-A650-2CDC908CD42D\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"395522B8-D3D5-4330-ADA3-6704BFDEC894\" : \"Dash iOS\",\n    \"F5E17E5D12ABF060C985F6771FC999275B646DB4\" : \"Dash%20iOS\\/\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"Dash iOS\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"Dash iOS.xcodeproj\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"file:\\/\\/\\/Users\\/bogdan\\/Dropbox\\/repos\\/Dash%20iOS.git\\/\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"395522B8-D3D5-4330-ADA3-6704BFDEC894\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"\\/Users\\/bogdan\\/Dropbox\\/repos\\/Dash%20iOS.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"F5E17E5D12ABF060C985F6771FC999275B646DB4\"\n    }\n  ]\n}"
  },
  {
    "path": "Dash/Dash-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>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleTypeIconFile</key>\n\t\t\t<string>docset_icon.png</string>\n\t\t\t<key>CFBundleTypeIconFiles</key>\n\t\t\t<array/>\n\t\t\t<key>CFBundleTypeName</key>\n\t\t\t<string>Docset File Type Handler</string>\n\t\t\t<key>CFBundleTypeRole</key>\n\t\t\t<string>Editor</string>\n\t\t\t<key>LSHandlerRank</key>\n\t\t\t<string>Owner</string>\n\t\t\t<key>LSItemContentTypes</key>\n\t\t\t<array>\n\t\t\t\t<string>com.kapeli.dash.ios.docset</string>\n\t\t\t\t<string>com.apple.xcode.docset</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>${EXECUTABLE_NAME}</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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.8.13</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleURLTypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>CFBundleURLName</key>\n\t\t\t<string>com.kapeli.dash</string>\n\t\t\t<key>CFBundleURLSchemes</key>\n\t\t\t<array>\n\t\t\t\t<string>dash-plugin</string>\n\t\t\t\t<string>dash</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>CFBundleVersion</key>\n\t<string>410</string>\n\t<key>CSSCommit</key>\n\t<string>not set</string>\n\t<key>DHDBResultCommit</key>\n\t<string>not set</string>\n\t<key>DHDBSearcherCommit</key>\n\t<string>not set</string>\n\t<key>DHDBUnifiedOperationCommit</key>\n\t<string>not set</string>\n\t<key>DHDBUnifiedResultCommit</key>\n\t<string>not set</string>\n\t<key>DHDocsetDownloaderCommit</key>\n\t<string>not set</string>\n\t<key>DHQueuedDBCommit</key>\n\t<string>not set</string>\n\t<key>DHTypesCommit</key>\n\t<string>not set</string>\n\t<key>DHUnifiedQueuedDBCommit</key>\n\t<string>not set</string>\n\t<key>DHWebPreferencesCommit</key>\n\t<string>not set</string>\n\t<key>DHWebViewControllerCommit</key>\n\t<string>not set</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>PlatformIconsCommit</key>\n\t<string>not set</string>\n\t<key>TypesCommit</key>\n\t<string>not set</string>\n\t<key>UIAppFonts</key>\n\t<array>\n\t\t<string>SourceCodePro-Regular.ttf</string>\n\t\t<string>SourceCodePro-Black.ttf</string>\n\t\t<string>SourceCodePro-Bold.ttf</string>\n\t\t<string>SourceCodePro-ExtraLight.ttf</string>\n\t\t<string>SourceCodePro-Semibold.ttf</string>\n\t\t<string>SourceCodePro-Light.ttf</string>\n\t\t<string>ionicons.ttf</string>\n\t</array>\n\t<key>UIBackgroundModes</key>\n\t<array>\n\t\t<string>fetch</string>\n\t</array>\n\t<key>UIFileSharingEnabled</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Launch</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIMainStoryboardFile~ipad</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIRequiresPersistentWiFi</key>\n\t<true/>\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\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UTExportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<array>\n\t\t\t\t<string>public.data</string>\n\t\t\t</array>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>Docset File Type Handler</string>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>com.kapeli.dash.ios.docset</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>docset</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n\t<key>UTImportedTypeDeclarations</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>UTTypeConformsTo</key>\n\t\t\t<array>\n\t\t\t\t<string>public.data</string>\n\t\t\t</array>\n\t\t\t<key>UTTypeDescription</key>\n\t\t\t<string>Docset File Type Handler</string>\n\t\t\t<key>UTTypeIdentifier</key>\n\t\t\t<string>com.kapeli.dash.ios.docset</string>\n\t\t\t<key>UTTypeTagSpecification</key>\n\t\t\t<dict>\n\t\t\t\t<key>public.filename-extension</key>\n\t\t\t\t<array>\n\t\t\t\t\t<string>docset</string>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash/Dash-Prefix.pch",
    "content": "//\n//  Prefix header\n//\n//  The contents of this file are implicitly included at the beginning of every source file.\n//\n\n#import <Availability.h>\n\n#ifndef __IPHONE_5_0\n#warning \"This project uses features only available in iOS SDK 5.0 and later.\"\n#endif\n\n#ifdef __OBJC__\n    #import <UIKit/UIKit.h>\n    #import <Foundation/Foundation.h>\n#define iPad ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)\n#define isRetina (UIScreen.mainScreen.scale > 1.0)\n#define isIOS11 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0)\n#define isRegularHorizontalClass ([DHAppDelegate sharedDelegate].window.rootViewController.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)\n#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)\n#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)\n#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)\n#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)\n#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)\n#define homePath NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0]\n#define transfersPath NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]\n#define TICK   NSDate *startTime = [NSDate date]\n#define TOCK   NSLog(@\"Time: %f\", -[startTime timeIntervalSinceNow])\n#define DHPrepareForURLSearch @\"DHPrepareForURLSearch\"\n#define DHSplitViewControllerDidSeparate @\"DHSplitViewControllerDidSeparate\"\n#define DHSplitViewControllerDidCollapse @\"DHSplitViewControllerDidCollapse\"\n#define DHPerformURLSearch @\"DHPerformURLSearch\"\n#define DHWindowChangedTraitCollection @\"DHWindowChangedTraitCollection\"\n\n#import \"NSString+DHUtils.h\"\n#import \"NSArray+DHUtils.h\"\n#import \"UIView+DHUtils.h\"\n#import \"DHDocset.h\"\n#import \"UIAlertView+Blocks.h\"\n#import \"UIActionSheet+Blocks.h\"\n#import \"NSTimer+DHUtils.h\"\n#import \"UIButton+DHUtils.h\"\n#import \"NSURL+DHUtils.h\"\n#import \"NSFileManager+DHUtils.h\"\n#import \"DHImageCache.h\"\n#import \"UIScrollView+EmptyDataSet.h\"\n#import \"NSString+GTM.h\"\n#import \"NSObject+DHUtils.h\"\n#import \"UIViewController+DHUtils.h\"\n#import \"DHDBResultSorter.h\"\n#import \"DHDBNestedResultSorter.h\"\n#import \"DHTarixIndex.h\"\n#import \"UITableView+DHUtils.h\"\n#import \"NSData+DHUtils.h\"\n#import \"DHRemoteServer.h\"\n#import \"DHRemote.h\"\n#import \"NSTimer+Blocks.h\"\n#import \"GZIP.h\"\n#import \"DHAppDelegate.h\"\n#import \"DHAppleActiveLanguage.h\"\n\n#endif\n"
  },
  {
    "path": "Dash/Defaults.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>AutomaticallyCheckForUpdates</key>\n\t<true/>\n\t<key>WebKitStoreWebDataForBackup</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash/FMDatabase.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n#import \"FMResultSet.h\"\n#import \"FMDatabasePool.h\"\n#import \"whitespace_tokenizer.h\"\n\n\n#if ! __has_feature(objc_arc)\n    #define FMDBAutorelease(__v) ([__v autorelease]);\n    #define FMDBReturnAutoreleased FMDBAutorelease\n\n    #define FMDBRetain(__v) ([__v retain]);\n    #define FMDBReturnRetained FMDBRetain\n\n    #define FMDBRelease(__v) ([__v release]);\n#else\n    // -fobjc-arc\n    #define FMDBAutorelease(__v)\n    #define FMDBReturnAutoreleased(__v) (__v)\n\n    #define FMDBRetain(__v)\n    #define FMDBReturnRetained(__v) (__v)\n\n    #define FMDBRelease(__v)\n#endif\n\n\n@interface FMDatabase : NSObject  {\n    \n    sqlite3*            _db;\n    NSString*           _databasePath;\n    BOOL                _logsErrors;\n    BOOL                _crashOnErrors;\n    BOOL                _traceExecution;\n    BOOL                _checkedOut;\n    BOOL                _shouldCacheStatements;\n    BOOL                _isExecutingStatement;\n    BOOL                _inTransaction;\n    int                 _busyRetryTimeout;\n    \n    NSMutableDictionary *_cachedStatements;\n    NSMutableSet        *_openResultSets;\n    NSMutableSet        *_openFunctions;\n\n}\n\n\n@property (assign) BOOL traceExecution;\n@property (assign) BOOL checkedOut;\n@property (assign) int busyRetryTimeout;\n@property (assign) BOOL crashOnErrors;\n@property (assign) BOOL logsErrors;\n@property (retain) NSMutableDictionary *cachedStatements;\n\n\n+ (id)databaseWithPath:(NSString*)inPath;\n- (id)initWithPath:(NSString*)inPath;\n\n- (void)registerFTSExtensions;\n- (BOOL)open;\n#if SQLITE_VERSION_NUMBER >= 3005000\n- (BOOL)openWithFlags:(int)flags;\n#endif\n- (BOOL)close;\n- (BOOL)goodConnection;\n- (void)clearCachedStatements;\n- (void)closeOpenResultSets;\n- (BOOL)hasOpenResultSets;\n\n// encryption methods.  You need to have purchased the sqlite encryption extensions for these to work.\n- (BOOL)setKey:(NSString*)key;\n- (BOOL)rekey:(NSString*)key;\n\n- (NSString *)databasePath;\n\n- (NSString*)lastErrorMessage;\n\n- (int)lastErrorCode;\n- (BOOL)hadError;\n- (NSError*)lastError;\n\n- (sqlite_int64)lastInsertRowId;\n\n- (sqlite3*)sqliteHandle;\n\n- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ...;\n- (BOOL)executeUpdate:(NSString*)sql, ...;\n- (BOOL)executeUpdateWithFormat:(NSString *)format, ...;\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments;\n- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments;\n\n- (FMResultSet *)executeQuery:(NSString*)sql, ...;\n- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...;\n- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments;\n- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments;\n\n- (BOOL)rollback;\n- (BOOL)commit;\n- (BOOL)beginTransaction;\n- (BOOL)beginDeferredTransaction;\n- (BOOL)inTransaction;\n- (BOOL)shouldCacheStatements;\n- (void)setShouldCacheStatements:(BOOL)value;\n\n#if SQLITE_VERSION_NUMBER >= 3007000\n- (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr;\n- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr;\n- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr;\n- (NSError*)inSavePoint:(void (^)(BOOL *rollback))block;\n#endif\n\n+ (BOOL)isSQLiteThreadSafe;\n+ (NSString*)sqliteLibVersion;\n\n- (int)changes;\n+ (void)executeBlockWithinDatabaseAtPath:(NSString *)path readOnly:(BOOL)readOnly block:(void (^)(FMDatabase *db))block;\n\n- (void)makeFunctionNamed:(NSString*)name maximumArguments:(int)count withBlock:(void (^)(sqlite3_context *context, int argc, sqlite3_value **argv))block;\n\n@end\n\n@interface FMStatement : NSObject {\n    sqlite3_stmt *_statement;\n    NSString *_query;\n    long _useCount;\n}\n\n@property (assign) long useCount;\n@property (retain) NSString *query;\n@property (assign) sqlite3_stmt *statement;\n\n- (void)close;\n- (void)reset;\n\n@end\n\n"
  },
  {
    "path": "Dash/FMDatabase.m",
    "content": "#import \"FMDatabase.h\"\n#import \"unistd.h\"\n#import <objc/runtime.h>\n\n\n#ifndef DOCSETGENERATOR\n#import \"DHPreferences.h\"\n#endif\n\n//static int registerTokenizer(sqlite3 *db, char *zName, const sqlite3_tokenizer_module *p) {\n//    int rc;\n//    sqlite3_stmt *pStmt;\n//    const char *zSql = \"SELECT fts3_tokenizer(?, ?)\";\n//    \n//    rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0);\n//    if( rc!=SQLITE_OK ){\n//        return rc;\n//    }\n//    \n//    sqlite3_bind_text(pStmt, 1, zName, -1, SQLITE_STATIC);\n//    sqlite3_bind_blob(pStmt, 2, &p, sizeof(p), SQLITE_STATIC);\n//    sqlite3_step(pStmt);\n//    \n//    return sqlite3_finalize(pStmt);\n//}\n//\nstatic void register_extensions(sqlite3 *db) {\n//    registerTokenizer(db, \"whitespace\", &whitespaceTokenizerModule);\n//    sqlite3_create_function(db, \"rank\", -1, SQLITE_ANY, NULL, &rankfunc, NULL, NULL);\n    sqlite3_create_function(db, \"dashCompress\", 1, SQLITE_ANY, NULL, &dashCompress, NULL, NULL);\n    sqlite3_create_function(db, \"dashUncompress\", 1, SQLITE_ANY, NULL, &dashUncompress, NULL, NULL);\n}\n\n@interface FMDatabase ()\n\n- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args;\n- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args;\n@end\n\n@implementation FMDatabase\n@synthesize cachedStatements=_cachedStatements;\n@synthesize logsErrors=_logsErrors;\n@synthesize crashOnErrors=_crashOnErrors;\n@synthesize busyRetryTimeout=_busyRetryTimeout;\n@synthesize checkedOut=_checkedOut;\n@synthesize traceExecution=_traceExecution;\n\n+ (id)databaseWithPath:(NSString*)aPath {\n    return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]);\n}\n\n+ (void)executeBlockWithinDatabaseAtPath:(NSString *)path readOnly:(BOOL)readOnly block:(void (^)(FMDatabase *db))block\n{\n    NSString *sqlPath = path;\n    FMDatabase *db = [FMDatabase databaseWithPath:sqlPath];\n    if((readOnly) ? [db openWithFlags:SQLITE_OPEN_READONLY] : [db open])\n    {\n        @try {\n            block(db);\n        }\n        @finally {\n            [db close];\n        }\n    }\n}\n\n+ (NSString*)sqliteLibVersion {\n    return [NSString stringWithFormat:@\"%s\", sqlite3_libversion()];\n}\n\n+ (BOOL)isSQLiteThreadSafe {\n    // make sure to read the sqlite headers on this guy!\n    return sqlite3_threadsafe();\n}\n\n- (id)initWithPath:(NSString*)aPath {\n    \n    //assert(sqlite3_threadsafe()); // whoa there big boy- gotta make sure sqlite it happy with what we're going to do.\n    \n    self = [super init];\n    \n    if (self) {\n        _databasePath       = [aPath copy];\n        _openResultSets     = [[NSMutableSet alloc] init];\n        _db                 = 0x00;\n        _logsErrors         = 0x00;\n#ifdef DEBUG\n        _logsErrors = YES;\n#endif\n        _crashOnErrors      = 0x00;\n        _busyRetryTimeout   = 120000;\n    }\n    \n    return self;\n}\n\n- (void)finalize {\n    [self close];\n    [super finalize];\n}\n\n- (void)dealloc {\n    [self close];\n    FMDBRelease(_openResultSets);\n    FMDBRelease(_cachedStatements);\n    FMDBRelease(_databasePath);\n    FMDBRelease(_openFunctions);\n    \n#if ! __has_feature(objc_arc)\n    [super dealloc];\n#endif\n}\n\n- (NSString *)databasePath {\n    return _databasePath;\n}\n\n- (sqlite3*)sqliteHandle {\n    return _db;\n}\n\n- (void)registerFTSExtensions\n{\n    register_extensions(_db);\n}\n\n- (BOOL)open {\n    if (_db) {\n        return YES;\n    }\n    \n    int err = sqlite3_open((_databasePath ? [_databasePath fileSystemRepresentation] : \":memory:\"), &_db );\n    if(err != SQLITE_OK) {\n        NSLog(@\"error opening!: %d %@\", err, _databasePath);\n        _db = nil;\n        return NO;\n    }\n    \n    return YES;\n}\n\n#if SQLITE_VERSION_NUMBER >= 3005000\n- (BOOL)openWithFlags:(int)flags {\n    if (_db) {\n        return YES;\n    }\n\n    int err = sqlite3_open_v2((_databasePath ? [_databasePath fileSystemRepresentation] : \":memory:\"), &_db, flags, NULL /* Name of VFS module to use */);\n    if(err != SQLITE_OK) {\n        _db = nil;\n        NSLog(@\"error opening!: %d %@\", err, _databasePath);\n        return NO;\n    }\n    return YES;\n}\n#endif\n\nstatic NSMutableDictionary *_busyAlerts = nil;\n\n- (NSString *)pointerString\n{\n    return [NSString stringWithFormat:@\"%p\", self];\n}\n\n- (BOOL)close {\n    \n    [self clearCachedStatements];\n    [self closeOpenResultSets];\n    \n    if (!_db) {\n        return YES;\n    }\n    \n    int  rc;\n    BOOL retry;\n    int numberOfRetries = 0;\n    BOOL triedFinalizingOpenStatements = NO;\n    \n    do {\n        retry   = NO;\n        rc      = sqlite3_close(_db);\n        \n        if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {\n            \n            retry = YES;\n            usleep(20);\n            \n            if (_busyRetryTimeout && (numberOfRetries++ > _busyRetryTimeout)) {\n                NSLog(@\"%s:%d\", __FUNCTION__, __LINE__);\n                NSLog(@\"Database busy, unable to close\");\n                return NO;\n            }\n            \n            if (!triedFinalizingOpenStatements) {\n                triedFinalizingOpenStatements = YES;\n                sqlite3_stmt *pStmt;\n                while ((pStmt = sqlite3_next_stmt(_db, 0x00)) !=0) {\n                    NSLog(@\"Closing leaked statement\");\n                    sqlite3_finalize(pStmt);\n                }\n            }\n        }\n        else if (SQLITE_OK != rc) {\n            NSLog(@\"error closing!: %d\", rc);\n        }\n    }\n    while (retry);\n    \n    _db = nil;\n    return YES;\n}\n\n- (void)clearCachedStatements {\n    \n    for (FMStatement *cachedStmt in [_cachedStatements objectEnumerator]) {\n        [cachedStmt close];\n    }\n    \n    [_cachedStatements removeAllObjects];\n}\n\n- (BOOL)hasOpenResultSets {\n    return [_openResultSets count] > 0;\n}\n\n- (void)closeOpenResultSets {\n    \n    //Copy the set so we don't get mutation errors\n    NSMutableSet *openSetCopy = FMDBReturnAutoreleased([_openResultSets copy]);\n    for (NSValue *rsInWrappedInATastyValueMeal in openSetCopy) {\n        FMResultSet *rs = (FMResultSet *)[rsInWrappedInATastyValueMeal pointerValue];\n        \n        [rs setParentDB:nil];\n        [rs close];\n        \n        [_openResultSets removeObject:rsInWrappedInATastyValueMeal];\n    }\n}\n\n- (void)resultSetDidClose:(FMResultSet *)resultSet {\n    NSValue *setValue = [NSValue valueWithNonretainedObject:resultSet];\n    \n    [_openResultSets removeObject:setValue];\n}\n\n- (FMStatement*)cachedStatementForQuery:(NSString*)query {\n    return _cachedStatements[query];\n}\n\n- (void)setCachedStatement:(FMStatement*)statement forQuery:(NSString*)query {\n    \n    query = [query copy]; // in case we got handed in a mutable string...\n    \n    [statement setQuery:query];\n    \n    if(query)\n    {\n        _cachedStatements[query] = statement;        \n    }\n    \n    FMDBRelease(query);\n}\n\n- (BOOL)rekey:(NSString*)key {\n#ifdef SQLITE_HAS_CODEC\n    if (!key) {\n        return NO;\n    }\n    \n    int rc = sqlite3_rekey(_db, [key UTF8String], (int)strlen([key UTF8String]));\n    \n    if (rc != SQLITE_OK) {\n        NSLog(@\"error on rekey: %d\", rc);\n        NSLog(@\"%@\", [self lastErrorMessage]);\n    }\n    \n    return (rc == SQLITE_OK);\n#else\n    return NO;\n#endif\n}\n\n- (BOOL)setKey:(NSString*)key {\n#ifdef SQLITE_HAS_CODEC\n    if (!key) {\n        return NO;\n    }\n    \n    int rc = sqlite3_key(_db, [key UTF8String], (int)strlen([key UTF8String]));\n    \n    return (rc == SQLITE_OK);\n#else\n    return NO;\n#endif\n}\n\n- (BOOL)goodConnection {\n    \n    if (!_db) {\n        return NO;\n    }\n    \n    FMResultSet *rs = [self executeQuery:@\"select name from sqlite_master where type='table'\"];\n    \n    if (rs) {\n        [rs close];\n        return YES;\n    }\n    \n    return NO;\n}\n\n- (void)warnInUse {\n    NSLog(@\"The FMDatabase %@ is currently in use.\", self);\n    \n#ifndef NS_BLOCK_ASSERTIONS\n    if (_crashOnErrors) {\n        abort();\n        NSAssert1(false, @\"The FMDatabase %@ is currently in use.\", self);\n    }\n#endif\n}\n\n- (BOOL)databaseExists {\n    \n    if (!_db) {\n        \n        NSLog(@\"The FMDatabase %@ is not open.\", self);\n        \n#ifndef NS_BLOCK_ASSERTIONS\n        if (_crashOnErrors) {\n            abort();\n            NSAssert1(false, @\"The FMDatabase %@ is not open.\", self);\n        }\n#endif\n        \n        return NO;\n    }\n    \n    return YES;\n}\n\n- (NSString*)lastErrorMessage {\n    return @(sqlite3_errmsg(_db));\n}\n\n- (BOOL)hadError {\n    int lastErrCode = [self lastErrorCode];\n    \n    return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW);\n}\n\n- (int)lastErrorCode {\n    return sqlite3_errcode(_db);\n}\n\n- (NSError*)lastError {\n    return [NSError errorWithDomain:@\"FMDatabase\" code:sqlite3_errcode(_db) userInfo:@{NSLocalizedDescriptionKey: [self lastErrorMessage]}];\n}\n\n- (sqlite_int64)lastInsertRowId {\n    \n    if (_isExecutingStatement) {\n        [self warnInUse];\n        return NO;\n    }\n    \n    _isExecutingStatement = YES;\n    \n    sqlite_int64 ret = sqlite3_last_insert_rowid(_db);\n    \n    _isExecutingStatement = NO;\n    \n    return ret;\n}\n\n- (int)changes {\n    if (_isExecutingStatement) {\n        [self warnInUse];\n        return 0;\n    }\n    \n    _isExecutingStatement = YES;\n    \n    int ret = sqlite3_changes(_db);\n    \n    _isExecutingStatement = NO;\n    \n    return ret;\n}\n\n- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt {\n    \n    if ((!obj) || ((NSNull *)obj == [NSNull null])) {\n        sqlite3_bind_null(pStmt, idx);\n    }\n    \n    // FIXME - someday check the return codes on these binds.\n    else if ([obj isKindOfClass:[NSData class]]) {\n        sqlite3_bind_blob(pStmt, idx, [obj bytes], (int)[obj length], SQLITE_STATIC);\n    }\n    else if ([obj isKindOfClass:[NSDate class]]) {\n        sqlite3_bind_double(pStmt, idx, [obj timeIntervalSince1970]);\n    }\n    else if ([obj isKindOfClass:[NSNumber class]]) {\n        \n        if (strcmp([obj objCType], @encode(BOOL)) == 0) {\n            sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0));\n        }\n        else if (strcmp([obj objCType], @encode(int)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longValue]);\n        }\n        else if (strcmp([obj objCType], @encode(long)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longValue]);\n        }\n        else if (strcmp([obj objCType], @encode(long long)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj longLongValue]);\n        }\n        else if (strcmp([obj objCType], @encode(unsigned long long)) == 0) {\n            sqlite3_bind_int64(pStmt, idx, [obj unsignedLongLongValue]);\n        }\n        else if (strcmp([obj objCType], @encode(float)) == 0) {\n            sqlite3_bind_double(pStmt, idx, [obj floatValue]);\n        }\n        else if (strcmp([obj objCType], @encode(double)) == 0) {\n            sqlite3_bind_double(pStmt, idx, [obj doubleValue]);\n        }\n        else {\n            sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC);\n        }\n    }\n    else {\n        sqlite3_bind_text(pStmt, idx, [[obj description] UTF8String], -1, SQLITE_STATIC);\n    }\n}\n\n- (void)extractSQL:(NSString *)sql argumentsList:(va_list)args intoString:(NSMutableString *)cleanedSQL arguments:(NSMutableArray *)arguments {\n    \n    NSUInteger length = [sql length];\n    unichar last = '\\0';\n    for (NSUInteger i = 0; i < length; ++i) {\n        id arg = nil;\n        unichar current = [sql characterAtIndex:i];\n        unichar add = current;\n        if (last == '%') {\n            switch (current) {\n                case '@':\n                    arg = va_arg(args, id); break;\n                case 'c':\n                    // warning: second argument to 'va_arg' is of promotable type 'char'; this va_arg has undefined behavior because arguments will be promoted to 'int'\n                    arg = [NSString stringWithFormat:@\"%c\", va_arg(args, int)]; break;\n                case 's':\n                    arg = @(va_arg(args, char*)); break;\n                case 'd':\n                case 'D':\n                case 'i':\n                    arg = @(va_arg(args, int)); break;\n                case 'u':\n                case 'U':\n                    arg = @(va_arg(args, unsigned int)); break;\n                case 'h':\n                    i++;\n                    if (i < length && [sql characterAtIndex:i] == 'i') {\n                        //  warning: second argument to 'va_arg' is of promotable type 'short'; this va_arg has undefined behavior because arguments will be promoted to 'int'\n                        arg = [NSNumber numberWithShort:va_arg(args, int)];\n                    }\n                    else if (i < length && [sql characterAtIndex:i] == 'u') {\n                        // warning: second argument to 'va_arg' is of promotable type 'unsigned short'; this va_arg has undefined behavior because arguments will be promoted to 'int'\n                        arg = [NSNumber numberWithUnsignedShort:va_arg(args, uint)];\n                    }\n                    else {\n                        i--;\n                    }\n                    break;\n                case 'q':\n                    i++;\n                    if (i < length && [sql characterAtIndex:i] == 'i') {\n                        arg = @(va_arg(args, long long));\n                    }\n                    else if (i < length && [sql characterAtIndex:i] == 'u') {\n                        arg = @(va_arg(args, unsigned long long));\n                    }\n                    else {\n                        i--;\n                    }\n                    break;\n                case 'f':\n                    arg = @(va_arg(args, double)); break;\n                case 'g':\n                    // warning: second argument to 'va_arg' is of promotable type 'float'; this va_arg has undefined behavior because arguments will be promoted to 'double'\n                    arg = [NSNumber numberWithFloat:va_arg(args, double)]; break;\n                case 'l':\n                    i++;\n                    if (i < length) {\n                        unichar next = [sql characterAtIndex:i];\n                        if (next == 'l') {\n                            i++;\n                            if (i < length && [sql characterAtIndex:i] == 'd') {\n                                //%lld\n                                arg = @(va_arg(args, long long));\n                            }\n                            else if (i < length && [sql characterAtIndex:i] == 'u') {\n                                //%llu\n                                arg = @(va_arg(args, unsigned long long));\n                            }\n                            else {\n                                i--;\n                            }\n                        }\n                        else if (next == 'd') {\n                            //%d\n                            arg = @(va_arg(args, long));\n                        }\n                        else if (next == 'u') {\n                            //%lu\n                            arg = @(va_arg(args, unsigned long));\n                        }\n                        else {\n                            i--;\n                        }\n                    }\n                    else {\n                        i--;\n                    }\n                    break;\n                default:\n                    // something else that we can't interpret. just pass it on through like normal\n                    break;\n            }\n        }\n        else if (current == '%') {\n            // percent sign; skip this character\n            add = '\\0';\n        }\n        \n        if (arg != nil) {\n            [cleanedSQL appendString:@\"?\"];\n            [arguments addObject:arg];\n        }\n        else if (add != '\\0') {\n            [cleanedSQL appendFormat:@\"%C\", add];\n        }\n        last = current;\n    }\n}\n\n- (FMResultSet *)executeQuery:(NSString *)sql withParameterDictionary:(NSDictionary *)arguments {\n    return [self executeQuery:sql withArgumentsInArray:nil orDictionary:arguments orVAList:nil];\n}\n\n- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args {\n    \n    if (![self databaseExists]) {\n        return 0x00;\n    }\n    \n    if (_isExecutingStatement) {\n        [self warnInUse];\n        return 0x00;\n    }\n    \n    _isExecutingStatement = YES;\n    \n    int rc                  = 0x00;\n    sqlite3_stmt *pStmt     = 0x00;\n    FMStatement *statement  = 0x00;\n    FMResultSet *rs         = 0x00;\n\n    if (_traceExecution && sql) {\n        NSLog(@\"%@ executeQuery: %@\", self, sql);\n    }\n    \n    if (_shouldCacheStatements) {\n        statement = [self cachedStatementForQuery:sql];\n        pStmt = statement ? [statement statement] : 0x00;\n    }\n\n    int numberOfRetries = 0;\n    BOOL retry          = NO;\n    \n    if (!pStmt) {\n        do {\n            retry   = NO;\n            rc      = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0);\n            \n            if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {\n                retry = YES;\n                usleep(20);\n                \n                if (_busyRetryTimeout && (numberOfRetries++ > _busyRetryTimeout)) {\n                        NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                        NSLog(@\"Database busy\");\n                        sqlite3_finalize(pStmt);\n                        _isExecutingStatement = NO;\n                        return nil;\n                }\n            }\n            else if (SQLITE_OK != rc) {\n                \n                if (_logsErrors) {\n                    NSLog(@\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    NSLog(@\"DB Query: %@\", sql);\n                    NSLog(@\"DB Path: %@\", _databasePath);\n#ifndef NS_BLOCK_ASSERTIONS\n                    if (_crashOnErrors) {\n                        abort();\n                        NSAssert2(false, @\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    }\n#endif\n                }\n                \n                sqlite3_finalize(pStmt);\n                _isExecutingStatement = NO;\n                return nil;\n            }\n        }\n        while (retry);\n    }\n    \n    id obj;\n    int idx = 0;\n    int queryCount = sqlite3_bind_parameter_count(pStmt); // pointed out by Dominic Yu (thanks!)\n    \n    // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support\n    if (dictionaryArgs) {\n        \n        for (NSString *dictionaryKey in [dictionaryArgs allKeys]) {\n            \n            // Prefix the key with a colon.\n            NSString *parameterName = [[NSString alloc] initWithFormat:@\":%@\", dictionaryKey];\n            \n            // Get the index for the parameter name.\n            int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]);\n            \n            FMDBRelease(parameterName);\n            \n            if (namedIdx > 0) {\n                // Standard binding from here.\n                [self bindObject:dictionaryArgs[dictionaryKey] toColumn:namedIdx inStatement:pStmt];\n            }\n            else {\n                NSLog(@\"Could not find index for %@\", dictionaryKey);\n            }\n        }\n        \n        // we need the count of params to avoid an error below.\n        idx = (int) [[dictionaryArgs allKeys] count];\n    }\n    else {\n        \n        while (idx < queryCount) {\n            \n            if (arrayArgs) {\n                obj = arrayArgs[idx];\n            }\n            else {\n                obj = va_arg(args, id);\n            }\n            \n            if (_traceExecution) {\n                NSLog(@\"obj: %@\", obj);\n            }\n            \n            idx++;\n            \n            [self bindObject:obj toColumn:idx inStatement:pStmt];\n        }\n    }\n    \n    if (idx != queryCount) {\n        NSLog(@\"Error: the bind count is not correct for the # of variables (executeQuery)\");\n        sqlite3_finalize(pStmt);\n        _isExecutingStatement = NO;\n        return nil;\n    }\n    \n    FMDBRetain(statement); // to balance the release below\n    \n    if (!statement) {\n        statement = [[FMStatement alloc] init];\n        [statement setStatement:pStmt];\n        \n        if (_shouldCacheStatements) {\n            [self setCachedStatement:statement forQuery:sql];\n        }\n    }\n    \n    // the statement gets closed in rs's dealloc or [rs close];\n    rs = [FMResultSet resultSetWithStatement:statement usingParentDatabase:self];\n    [rs setQuery:sql];\n    \n    NSValue *openResultSet = [NSValue valueWithNonretainedObject:rs];\n    [_openResultSets addObject:openResultSet];\n    \n    [statement setUseCount:[statement useCount] + 1];\n    \n    FMDBRelease(statement);\n    \n    _isExecutingStatement = NO;\n    \n    return rs;\n}\n\n- (FMResultSet *)executeQuery:(NSString*)sql, ... {\n    va_list args;\n    va_start(args, sql);\n    \n    id result = [self executeQuery:sql withArgumentsInArray:nil orDictionary:nil orVAList:args];\n    \n    va_end(args);\n    return result;\n}\n\n- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ... {\n    va_list args;\n    va_start(args, format);\n    \n    NSMutableString *sql = [NSMutableString stringWithCapacity:[format length]];\n    NSMutableArray *arguments = [NSMutableArray array];\n    [self extractSQL:format argumentsList:args intoString:sql arguments:arguments];\n    \n    va_end(args);\n    \n    return [self executeQuery:sql withArgumentsInArray:arguments];\n}\n\n- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments {\n    return [self executeQuery:sql withArgumentsInArray:arguments orDictionary:nil orVAList:nil];\n}\n\n- (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args {\n    \n    if (![self databaseExists]) {\n        return NO;\n    }\n    \n    if (_isExecutingStatement) {\n        [self warnInUse];\n        return NO;\n    }\n    \n    _isExecutingStatement = YES;\n    \n    int rc                   = 0x00;\n    sqlite3_stmt *pStmt      = 0x00;\n    FMStatement *cachedStmt  = 0x00;\n    \n    if (_traceExecution && sql) {\n        NSLog(@\"%@ executeUpdate: %@\", self, sql);\n    }\n    \n    if (_shouldCacheStatements) {\n        cachedStmt = [self cachedStatementForQuery:sql];\n        pStmt = cachedStmt ? [cachedStmt statement] : 0x00;\n    }\n    \n    int numberOfRetries = 0;\n    BOOL retry          = NO;\n    if (!pStmt) {\n        \n        do {\n            retry   = NO;\n            rc      = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0);\n            if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {\n                retry = YES;\n                usleep(20);\n                \n                if (_busyRetryTimeout && (numberOfRetries++ > _busyRetryTimeout)) {\n                        NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                        NSLog(@\"Database busy\");\n                        sqlite3_finalize(pStmt);\n                        _isExecutingStatement = NO;\n                        return NO;\n                }\n            }\n            else if (SQLITE_OK != rc) {\n                \n                if (_logsErrors) {\n                    NSLog(@\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    NSLog(@\"DB Query: %@\", sql);\n                    NSLog(@\"DB Path: %@\", _databasePath);\n#ifndef NS_BLOCK_ASSERTIONS\n                    if (_crashOnErrors) {\n                        abort();\n                        NSAssert2(false, @\"DB Error: %d \\\"%@\\\"\", [self lastErrorCode], [self lastErrorMessage]);\n                    }\n#endif\n                }\n                \n                sqlite3_finalize(pStmt);\n                \n                if (outErr) {\n                    *outErr = [NSError errorWithDomain:@(sqlite3_errmsg(_db)) code:rc userInfo:nil];\n                }\n                \n                _isExecutingStatement = NO;\n                return NO;\n            }\n        }\n        while (retry);\n    }\n    \n    id obj;\n    int idx = 0;\n    int queryCount = sqlite3_bind_parameter_count(pStmt);\n    \n    // If dictionaryArgs is passed in, that means we are using sqlite's named parameter support\n    if (dictionaryArgs) {\n        \n        for (NSString *dictionaryKey in [dictionaryArgs allKeys]) {\n            \n            // Prefix the key with a colon.\n            NSString *parameterName = [[NSString alloc] initWithFormat:@\":%@\", dictionaryKey];\n            \n            // Get the index for the parameter name.\n            int namedIdx = sqlite3_bind_parameter_index(pStmt, [parameterName UTF8String]);\n            \n            FMDBRelease(parameterName);\n            \n            if (namedIdx > 0) {\n                // Standard binding from here.\n                [self bindObject:dictionaryArgs[dictionaryKey] toColumn:namedIdx inStatement:pStmt];\n            }\n            else {\n                NSLog(@\"Could not find index for %@\", dictionaryKey);\n            }\n        }\n        \n        // we need the count of params to avoid an error below.\n        idx = (int) [[dictionaryArgs allKeys] count];\n    }\n    else {\n        \n        while (idx < queryCount) {\n            \n            if (arrayArgs) {\n                obj = arrayArgs[idx];\n            }\n            else {\n                obj = va_arg(args, id);\n            }\n            \n            if (_traceExecution) {\n                NSLog(@\"obj: %@\", obj);\n            }\n            \n            idx++;\n            \n            [self bindObject:obj toColumn:idx inStatement:pStmt];\n        }\n    }\n    \n    \n    if (idx != queryCount) {\n        NSLog(@\"Error: the bind count is not correct for the # of variables (%@) (executeUpdate)\", sql);\n        sqlite3_finalize(pStmt);\n        _isExecutingStatement = NO;\n        return NO;\n    }\n    \n    /* Call sqlite3_step() to run the virtual machine. Since the SQL being\n     ** executed is not a SELECT statement, we assume no data will be returned.\n     */\n    numberOfRetries = 0;\n    \n    do {\n        rc      = sqlite3_step(pStmt);\n        retry   = NO;\n        \n        if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {\n            // this will happen if the db is locked, like if we are doing an update or insert.\n            // in that case, retry the step... and maybe wait just 10 milliseconds.\n            retry = YES;\n            if (SQLITE_LOCKED == rc) {\n                rc = sqlite3_reset(pStmt);\n                if (rc != SQLITE_LOCKED) {\n                    NSLog(@\"Unexpected result from sqlite3_reset (%d) eu\", rc);\n                }\n            }\n            usleep(20);\n            \n            if (_busyRetryTimeout && (numberOfRetries++ > _busyRetryTimeout)) {\n                    numberOfRetries = 0;\n            }\n        }\n        else if (SQLITE_DONE == rc) {\n            // all is well, let's return.\n        }\n        else if (SQLITE_ERROR == rc) {\n            NSLog(@\"Error calling sqlite3_step (%d: %s) SQLITE_ERROR\", rc, sqlite3_errmsg(_db));\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        else if (SQLITE_MISUSE == rc) {\n            // uh oh.\n            NSLog(@\"Error calling sqlite3_step (%d: %s) SQLITE_MISUSE\", rc, sqlite3_errmsg(_db));\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        else if (SQLITE_CONSTRAINT != rc) {\n            // wtf?\n            NSLog(@\"Unknown error calling sqlite3_step (%d: %s) eu\", rc, sqlite3_errmsg(_db));\n            if(rc == SQLITE_CORRUPT)\n            {\n\n            }\n            NSLog(@\"DB Query: %@\", sql);\n        }\n        \n    } while (retry);\n    \n    if (rc == SQLITE_ROW) {\n        NSAssert1(NO, @\"A executeUpdate is being called with a query string '%@'\", sql);\n    }\n    \n    if (_shouldCacheStatements && !cachedStmt) {\n        cachedStmt = [[FMStatement alloc] init];\n        \n        [cachedStmt setStatement:pStmt];\n        \n        [self setCachedStatement:cachedStmt forQuery:sql];\n        \n        FMDBRelease(cachedStmt);\n    }\n    \n    int closeErrorCode;\n    \n    if (cachedStmt) {\n        [cachedStmt setUseCount:[cachedStmt useCount] + 1];\n        closeErrorCode = sqlite3_reset(pStmt);\n    }\n    else {\n        /* Finalize the virtual machine. This releases all memory and other\n         ** resources allocated by the sqlite3_prepare() call above.\n         */\n        closeErrorCode = sqlite3_finalize(pStmt);\n    }\n    \n    if (closeErrorCode != SQLITE_OK && closeErrorCode != SQLITE_CONSTRAINT) {\n        NSLog(@\"Unknown error finalizing or resetting statement (%d: %s)\", closeErrorCode, sqlite3_errmsg(_db));\n        NSLog(@\"DB Query: %@\", sql);\n    }\n    \n    _isExecutingStatement = NO;\n    return (rc == SQLITE_DONE || rc == SQLITE_OK);\n}\n\n- (BOOL)executeUpdate:(NSString*)sql, ... {\n    va_list args;\n    va_start(args, sql);\n    \n    BOOL result = [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:nil orVAList:args];\n    \n    va_end(args);\n    return result;\n}\n\n- (BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments {\n    return [self executeUpdate:sql error:nil withArgumentsInArray:arguments orDictionary:nil orVAList:nil];\n}\n\n- (BOOL)executeUpdate:(NSString*)sql withParameterDictionary:(NSDictionary *)arguments {\n    return [self executeUpdate:sql error:nil withArgumentsInArray:nil orDictionary:arguments orVAList:nil];\n}\n\n- (BOOL)executeUpdateWithFormat:(NSString*)format, ... {\n    va_list args;\n    va_start(args, format);\n    \n    NSMutableString *sql      = [NSMutableString stringWithCapacity:[format length]];\n    NSMutableArray *arguments = [NSMutableArray array];\n    \n    [self extractSQL:format argumentsList:args intoString:sql arguments:arguments];\n    \n    va_end(args);\n    \n    return [self executeUpdate:sql withArgumentsInArray:arguments];\n}\n\n- (BOOL)update:(NSString*)sql withErrorAndBindings:(NSError**)outErr, ... {\n    va_list args;\n    va_start(args, outErr);\n    \n    BOOL result = [self executeUpdate:sql error:outErr withArgumentsInArray:nil orDictionary:nil orVAList:args];\n    \n    va_end(args);\n    return result;\n}\n\n- (BOOL)rollback {\n    BOOL b = [self executeUpdate:@\"rollback transaction\"];\n    \n    if (b) {\n        _inTransaction = NO;\n    }\n    \n    return b;\n}\n\n- (BOOL)commit {\n    BOOL b =  [self executeUpdate:@\"commit transaction\"];\n    \n    if (b) {\n        _inTransaction = NO;\n    }\n    \n    return b;\n}\n\n- (BOOL)beginDeferredTransaction {\n    \n    BOOL b = [self executeUpdate:@\"begin deferred transaction\"];\n    if (b) {\n        _inTransaction = YES;\n    }\n    \n    return b;\n}\n\n- (BOOL)beginTransaction {\n    \n    BOOL b = [self executeUpdate:@\"begin exclusive transaction\"];\n    if (b) {\n        _inTransaction = YES;\n    }\n    \n    return b;\n}\n\n- (BOOL)inTransaction {\n    return _inTransaction;\n}\n\n#if SQLITE_VERSION_NUMBER >= 3007000\n\n- (BOOL)startSavePointWithName:(NSString*)name error:(NSError**)outErr {\n    \n    // FIXME: make sure the savepoint name doesn't have a ' in it.\n    \n    NSParameterAssert(name);\n    \n    if (![self executeUpdate:[NSString stringWithFormat:@\"savepoint '%@';\", name]]) {\n        \n        if (*outErr) {\n            *outErr = [self lastError];\n        }\n        \n        return NO;\n    }\n    \n    return YES;\n}\n\n- (BOOL)releaseSavePointWithName:(NSString*)name error:(NSError**)outErr {\n    \n    NSParameterAssert(name);\n    \n    BOOL worked = [self executeUpdate:[NSString stringWithFormat:@\"release savepoint '%@';\", name]];\n    \n    if (!worked && *outErr) {\n        *outErr = [self lastError];\n    }\n    \n    return worked;\n}\n\n- (BOOL)rollbackToSavePointWithName:(NSString*)name error:(NSError**)outErr {\n    \n    NSParameterAssert(name);\n    \n    BOOL worked = [self executeUpdate:[NSString stringWithFormat:@\"rollback transaction to savepoint '%@';\", name]];\n    \n    if (!worked && *outErr) {\n        *outErr = [self lastError];\n    }\n    \n    return worked;\n}\n\n- (NSError*)inSavePoint:(void (^)(BOOL *rollback))block {\n    static unsigned long savePointIdx = 0;\n    \n    NSString *name = [NSString stringWithFormat:@\"dbSavePoint%d\", (int)savePointIdx++];\n    \n    BOOL shouldRollback = NO;\n    \n    NSError *err = 0x00;\n    \n    if (![self startSavePointWithName:name error:&err]) {\n        return err;\n    }\n    \n    block(&shouldRollback);\n    \n    if (shouldRollback) {\n        [self rollbackToSavePointWithName:name error:&err];\n    }\n    else {\n        [self releaseSavePointWithName:name error:&err];\n    }\n    \n    return err;\n}\n\n#endif\n\n\n- (BOOL)shouldCacheStatements {\n    return _shouldCacheStatements;\n}\n\n- (void)setShouldCacheStatements:(BOOL)value {\n    \n    _shouldCacheStatements = value;\n    \n    if (_shouldCacheStatements && !_cachedStatements) {\n        [self setCachedStatements:[NSMutableDictionary dictionary]];\n    }\n    \n    if (!_shouldCacheStatements) {\n        [self setCachedStatements:nil];\n    }\n}\n\nvoid FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv);\nvoid FMDBBlockSQLiteCallBackFunction(sqlite3_context *context, int argc, sqlite3_value **argv) {\n#if ! __has_feature(objc_arc)\n    void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (id)sqlite3_user_data(context);\n#else\n    void (^block)(sqlite3_context *context, int argc, sqlite3_value **argv) = (__bridge id)sqlite3_user_data(context);\n#endif\n    block(context, argc, argv);\n}\n\n\n- (void)makeFunctionNamed:(NSString*)name maximumArguments:(int)count withBlock:(void (^)(sqlite3_context *context, int argc, sqlite3_value **argv))block {\n    \n    if (!_openFunctions) {\n        _openFunctions = [NSMutableSet new];\n    }\n    \n    id b = FMDBReturnAutoreleased([block copy]);\n    \n    [_openFunctions addObject:b];\n    \n    /* I tried adding custom functions to release the block when the connection is destroyed- but they seemed to never be called, so we use _openFunctions to store the values instead. */\n#if ! __has_feature(objc_arc)\n    sqlite3_create_function([self sqliteHandle], [name UTF8String], count, SQLITE_UTF8, (void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00);\n#else\n    sqlite3_create_function([self sqliteHandle], [name UTF8String], count, SQLITE_UTF8, (__bridge void*)b, &FMDBBlockSQLiteCallBackFunction, 0x00, 0x00);\n#endif\n}\n\n@end\n\n\n\n@implementation FMStatement\n@synthesize statement=_statement;\n@synthesize query=_query;\n@synthesize useCount=_useCount;\n\n- (void)finalize {\n    [self close];\n    [super finalize];\n}\n\n- (void)dealloc {\n    [self close];\n    FMDBRelease(_query);\n#if ! __has_feature(objc_arc)\n    [super dealloc];\n#endif\n}\n\n- (void)close {\n    if (_statement) {\n        sqlite3_finalize(_statement);\n        _statement = 0x00;\n    }\n}\n\n- (void)reset {\n    if (_statement) {\n        sqlite3_reset(_statement);\n    }\n}\n\n- (NSString*)description {\n    return [NSString stringWithFormat:@\"%@ %d hit(s) for query %@\", [super description], (int)_useCount, _query];\n}\n\n\n@end"
  },
  {
    "path": "Dash/FMDatabaseAdditions.h",
    "content": "//\n//  FMDatabaseAdditions.h\n//  fmkit\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface FMDatabase (FMDatabaseAdditions)\n\n\n- (int)intForQuery:(NSString*)objs, ...;\n- (long)longForQuery:(NSString*)objs, ...; \n- (BOOL)boolForQuery:(NSString*)objs, ...;\n- (double)doubleForQuery:(NSString*)objs, ...;\n- (NSString*)stringForQuery:(NSString*)objs, ...; \n- (NSData*)dataForQuery:(NSString*)objs, ...;\n- (NSDate*)dateForQuery:(NSString*)objs, ...;\n\n// Notice that there's no dataNoCopyForQuery:.\n// That would be a bad idea, because we close out the result set, and then what\n// happens to the data that we just didn't copy?  Who knows, not I.\n\n\n- (BOOL)tableExists:(NSString*)tableName;\n- (FMResultSet*)getSchema;\n- (FMResultSet*)getTableSchema:(NSString*)tableName;\n- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName;\n\n- (BOOL)validateSQL:(NSString*)sql error:(NSError**)error;\n\n@end\n"
  },
  {
    "path": "Dash/FMDatabaseAdditions.m",
    "content": "//\n//  FMDatabaseAdditions.m\n//  fmkit\n//\n//  Created by August Mueller on 10/30/05.\n//  Copyright 2005 Flying Meat Inc.. All rights reserved.\n//\n\n#import \"FMDatabase.h\"\n#import \"FMDatabaseAdditions.h\"\n\n@interface FMDatabase (PrivateStuff)\n- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args;\n@end\n\n@implementation FMDatabase (FMDatabaseAdditions)\n\n#define RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(type, sel)             \\\nva_list args;                                                        \\\nva_start(args, query);                                               \\\nFMResultSet *resultSet = [self executeQuery:query withArgumentsInArray:0x00 orDictionary:0x00 orVAList:args];   \\\nva_end(args);                                                        \\\nif (![resultSet next]) { return (type)0; }                           \\\ntype ret = [resultSet sel:0];                                        \\\n[resultSet close];                                                   \\\n[resultSet setParentDB:nil];                                         \\\nreturn ret;\n\n\n- (NSString*)stringForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSString *, stringForColumnIndex);\n}\n\n- (int)intForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(int, intForColumnIndex);\n}\n\n- (long)longForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(long, longForColumnIndex);\n}\n\n- (BOOL)boolForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(BOOL, boolForColumnIndex);\n}\n\n- (double)doubleForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(double, doubleForColumnIndex);\n}\n\n- (NSData*)dataForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSData *, dataForColumnIndex);\n}\n\n- (NSDate*)dateForQuery:(NSString*)query, ... {\n    RETURN_RESULT_FOR_QUERY_WITH_SELECTOR(NSDate *, dateForColumnIndex);\n}\n\n\n- (BOOL)tableExists:(NSString*)tableName {\n    \n    tableName = [tableName lowercaseString];\n    \n    FMResultSet *rs = [self executeQuery:@\"select [sql] from sqlite_master where [type] = 'table' and lower(name) = ?\", tableName];\n    \n    //if at least one next exists, table exists\n    BOOL returnBool = [rs next];\n    \n    //close and free object\n    [rs close];\n    \n    return returnBool;\n}\n\n/*\n get table with list of tables: result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]\n check if table exist in database  (patch from OZLB)\n*/\n- (FMResultSet*)getSchema {\n    \n    //result colums: type[STRING], name[STRING],tbl_name[STRING],rootpage[INTEGER],sql[STRING]\n    FMResultSet *rs = [self executeQuery:@\"SELECT type, name, tbl_name, rootpage, sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE type != 'meta' AND name NOT LIKE 'sqlite_%' ORDER BY tbl_name, type DESC, name\"];\n    \n    return rs;\n}\n\n/* \n get table schema: result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]\n*/\n- (FMResultSet*)getTableSchema:(NSString*)tableName {\n    \n    //result colums: cid[INTEGER], name,type [STRING], notnull[INTEGER], dflt_value[],pk[INTEGER]\n    FMResultSet *rs = [self executeQuery:[NSString stringWithFormat: @\"PRAGMA table_info('%@')\", tableName]];\n    \n    return rs;\n}\n\n\n- (BOOL)columnExists:(NSString*)columnName inTableWithName:(NSString*)tableName {\n    \n    BOOL returnBool = NO;\n    \n    tableName  = [tableName lowercaseString];\n    columnName = [columnName lowercaseString];\n    \n    FMResultSet *rs = [self getTableSchema:tableName];\n    \n    //check if column is present in table schema\n    while ([rs next]) {\n        if ([[[rs stringForColumn:@\"name\"] lowercaseString] isEqualToString:columnName]) {\n            returnBool = YES;\n            break;\n        }\n    }\n    \n    //If this is not done FMDatabase instance stays out of pool\n    [rs close];\n    \n    return returnBool;\n}\n\n- (BOOL)validateSQL:(NSString*)sql error:(NSError**)error {\n    sqlite3_stmt *pStmt = NULL;\n    BOOL validationSucceeded = YES;\n    BOOL keepTrying = YES;\n    int numberOfRetries = 0;\n    \n    while (keepTrying == YES) {\n        keepTrying = NO;\n        int rc = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &pStmt, 0);\n        if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED) {\n            keepTrying = YES;\n            usleep(20);\n            \n            if (_busyRetryTimeout && (numberOfRetries++ > _busyRetryTimeout)) {\n                NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [self databasePath]);\n                NSLog(@\"Database busy\");\n            }          \n        } \n        else if (rc != SQLITE_OK) {\n            validationSucceeded = NO;\n            if (error) {\n                *error = [NSError errorWithDomain:NSCocoaErrorDomain \n                                             code:[self lastErrorCode]\n                                         userInfo:@{NSLocalizedDescriptionKey: [self lastErrorMessage]}];\n            }\n        }\n    }\n    \n    sqlite3_finalize(pStmt);\n    \n    return validationSucceeded;\n}\n\n@end\n"
  },
  {
    "path": "Dash/FMDatabasePool.h",
    "content": "//\n//  FMDatabasePool.h\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n\n/*\n\n                         ***README OR SUFFER***\nBefore using FMDatabasePool, please consider using FMDatabaseQueue instead.\n\nIf you really really really know what you're doing and FMDatabasePool is what\nyou really really need (ie, you're using a read only database), OK you can use\nit.  But just be careful not to deadlock!\n\nFor an example on deadlocking, search for:\nONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD\nin the main.m file.\n\n*/\n\n\n\n@class FMDatabase;\n\n@interface FMDatabasePool : NSObject {\n    NSString            *_path;\n    \n    dispatch_queue_t    _lockQueue;\n    \n    NSMutableArray      *_databaseInPool;\n    NSMutableArray      *_databaseOutPool;\n    \n    __unsafe_unretained id _delegate;\n    \n    NSUInteger          _maximumNumberOfDatabasesToCreate;\n}\n\n@property (retain) NSString *path;\n@property (assign) id delegate;\n@property (assign) NSUInteger maximumNumberOfDatabasesToCreate;\n\n+ (id)databasePoolWithPath:(NSString*)aPath;\n- (id)initWithPath:(NSString*)aPath;\n\n- (NSUInteger)countOfCheckedInDatabases;\n- (NSUInteger)countOfCheckedOutDatabases;\n- (NSUInteger)countOfOpenDatabases;\n- (void)releaseAllDatabases;\n\n- (void)inDatabase:(void (^)(FMDatabase *db))block;\n\n- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block;\n- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block;\n\n#if SQLITE_VERSION_NUMBER >= 3007000\n// NOTE: you can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock.\n// If you need to nest, use FMDatabase's startSavePointWithName:error: instead.\n- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block;\n#endif\n\n@end\n\n\n@interface NSObject (FMDatabasePoolDelegate)\n\n- (BOOL)databasePool:(FMDatabasePool*)pool shouldAddDatabaseToPool:(FMDatabase*)database;\n\n@end\n\n"
  },
  {
    "path": "Dash/FMDatabasePool.m",
    "content": "//\n//  FMDatabasePool.m\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All rights reserved.\n//\n\n#import \"FMDatabasePool.h\"\n#import \"FMDatabase.h\"\n\n@interface FMDatabasePool()\n\n- (void)pushDatabaseBackInPool:(FMDatabase*)db;\n- (FMDatabase*)db;\n\n@end\n\n\n@implementation FMDatabasePool\n@synthesize path=_path;\n@synthesize delegate=_delegate;\n@synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate;\n\n\n+ (id)databasePoolWithPath:(NSString*)aPath {\n    return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]);\n}\n\n- (id)initWithPath:(NSString*)aPath {\n    \n    self = [super init];\n    \n    if (self != nil) {\n        _path               = [aPath copy];\n        _lockQueue          = dispatch_queue_create([[NSString stringWithFormat:@\"fmdb.%@\", self] UTF8String], NULL);\n        _databaseInPool     = FMDBReturnRetained([NSMutableArray array]);\n        _databaseOutPool    = FMDBReturnRetained([NSMutableArray array]);\n    }\n    \n    return self;\n}\n\n- (void)dealloc {\n    \n    _delegate = 0x00;\n    FMDBRelease(_path);\n    FMDBRelease(_databaseInPool);\n    FMDBRelease(_databaseOutPool);\n    \n    if (_lockQueue) {\n        _lockQueue = 0x00;\n    }\n#if ! __has_feature(objc_arc)\n    [super dealloc];\n#endif\n}\n\n\n- (void)executeLocked:(void (^)(void))aBlock {\n    dispatch_sync(_lockQueue, aBlock);\n}\n\n- (void)pushDatabaseBackInPool:(FMDatabase*)db {\n    \n    if (!db) { // db can be null if we set an upper bound on the # of databases to create.\n        return;\n    }\n    \n    [self executeLocked:^() {\n        \n        if ([_databaseInPool containsObject:db]) {\n            [[NSException exceptionWithName:@\"Database already in pool\" reason:@\"The FMDatabase being put back into the pool is already present in the pool\" userInfo:nil] raise];\n        }\n        \n        [_databaseInPool addObject:db];\n        [_databaseOutPool removeObject:db];\n        \n    }];\n}\n\n- (FMDatabase*)db {\n    \n    __block FMDatabase *db;\n    \n    [self executeLocked:^() {\n        db = [_databaseInPool lastObject];\n        \n        if (db) {\n            [_databaseOutPool addObject:db];\n            [_databaseInPool removeLastObject];\n        }\n        else {\n            \n            if (_maximumNumberOfDatabasesToCreate) {\n                NSUInteger currentCount = [_databaseOutPool count] + [_databaseInPool count];\n                \n                if (currentCount >= _maximumNumberOfDatabasesToCreate) {\n                    NSLog(@\"Maximum number of databases (%d) has already been reached!\", (int)currentCount);\n                    return;\n                }\n            }\n            \n            db = [FMDatabase databaseWithPath:_path];\n        }\n        \n        //This ensures that the db is opened before returning\n        if ([db open]) {\n            if ([_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![_delegate databasePool:self shouldAddDatabaseToPool:db]) {\n                [db close];\n                db = 0x00;\n            }\n            else {\n                //It should not get added in the pool twice if lastObject was found\n                if (![_databaseOutPool containsObject:db]) {\n                    [_databaseOutPool addObject:db];\n                }\n            }\n        }\n        else {\n            NSLog(@\"Could not open up the database at path %@\", _path);\n            db = 0x00;\n        }\n    }];\n    \n    return db;\n}\n\n- (NSUInteger)countOfCheckedInDatabases {\n    \n    __block NSInteger count;\n    \n    [self executeLocked:^() {\n        count = [_databaseInPool count];\n    }];\n    \n    return count;\n}\n\n- (NSUInteger)countOfCheckedOutDatabases {\n    \n    __block NSInteger count;\n    \n    [self executeLocked:^() {\n        count = [_databaseOutPool count];\n    }];\n    \n    return count;\n}\n\n- (NSUInteger)countOfOpenDatabases {\n    __block NSInteger count;\n    \n    [self executeLocked:^() {\n        count = [_databaseOutPool count] + [_databaseInPool count];\n    }];\n    \n    return count;\n}\n\n- (void)releaseAllDatabases {\n    [self executeLocked:^() {\n        [_databaseOutPool removeAllObjects];\n        [_databaseInPool removeAllObjects];\n    }];\n}\n\n- (void)inDatabase:(void (^)(FMDatabase *db))block {\n    \n    FMDatabase *db = [self db];\n    \n    block(db);\n    \n    [self pushDatabaseBackInPool:db];\n}\n\n- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    \n    BOOL shouldRollback = NO;\n    \n    FMDatabase *db = [self db];\n    \n    if (useDeferred) {\n        [db beginDeferredTransaction];\n    }\n    else {\n        [db beginTransaction];\n    }\n    \n    \n    block(db, &shouldRollback);\n    \n    if (shouldRollback) {\n        [db rollback];\n    }\n    else {\n        [db commit];\n    }\n    \n    [self pushDatabaseBackInPool:db];\n}\n\n- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    [self beginTransaction:YES withBlock:block];\n}\n\n- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    [self beginTransaction:NO withBlock:block];\n}\n#if SQLITE_VERSION_NUMBER >= 3007000\n- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    \n    static unsigned long savePointIdx = 0;\n    \n    NSString *name = [NSString stringWithFormat:@\"savePoint%d\", (int)savePointIdx++];\n    \n    BOOL shouldRollback = NO;\n    \n    FMDatabase *db = [self db];\n    \n    NSError *err = 0x00;\n    \n    if (![db startSavePointWithName:name error:&err]) {\n        [self pushDatabaseBackInPool:db];\n        return err;\n    }\n    \n    block(db, &shouldRollback);\n    \n    if (shouldRollback) {\n        [db rollbackToSavePointWithName:name error:&err];\n    }\n    else {\n        [db releaseSavePointWithName:name error:&err];\n    }\n    \n    [self pushDatabaseBackInPool:db];\n    \n    return err;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Dash/FMDatabaseQueue.h",
    "content": "//\n//  FMDatabasePool.h\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n\n@class FMDatabase;\n\n@interface FMDatabaseQueue : NSObject {\n    NSString            *_path;\n    dispatch_queue_t    _queue;\n    FMDatabase          *_db;\n}\n\n@property (retain) NSString *path;\n\n+ (id)databaseQueueWithPath:(NSString*)aPath;\n- (id)initWithPath:(NSString*)aPath;\n- (void)close;\n\n- (void)inDatabase:(void (^)(FMDatabase *db))block;\n\n- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block;\n- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block;\n\n#if SQLITE_VERSION_NUMBER >= 3007000\n// NOTE: you can not nest these, since calling it will pull another database out of the pool and you'll get a deadlock.\n// If you need to nest, use FMDatabase's startSavePointWithName:error: instead.\n- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block;\n#endif\n\n@end\n\n"
  },
  {
    "path": "Dash/FMDatabaseQueue.m",
    "content": "//\n//  FMDatabasePool.m\n//  fmdb\n//\n//  Created by August Mueller on 6/22/11.\n//  Copyright 2011 Flying Meat Inc. All rights reserved.\n//\n\n#import \"FMDatabaseQueue.h\"\n#import \"FMDatabase.h\"\n\n/*\n \n Note: we call [self retain]; before using dispatch_sync, just incase \n FMDatabaseQueue is released on another thread and we're in the middle of doing\n something in dispatch_sync\n \n */\n \n@implementation FMDatabaseQueue\n\n@synthesize path = _path;\n\n+ (id)databaseQueueWithPath:(NSString*)aPath {\n    \n    FMDatabaseQueue *q = [[self alloc] initWithPath:aPath];\n    \n    FMDBAutorelease(q);\n    \n    return q;\n}\n\n- (id)initWithPath:(NSString*)aPath {\n    \n    self = [super init];\n    \n    if (self != nil) {\n        \n        _db = [FMDatabase databaseWithPath:aPath];\n        FMDBRetain(_db);\n        \n        if (![_db open]) {\n            NSLog(@\"Could not create database queue for path %@\", aPath);\n            FMDBRelease(self);\n            return 0x00;\n        }\n        \n        _path = FMDBReturnRetained(aPath);\n        \n        _queue = dispatch_queue_create([[NSString stringWithFormat:@\"fmdb.%@\", self] UTF8String], NULL);\n    }\n    \n    return self;\n}\n\n- (void)dealloc {\n    \n    FMDBRelease(_db);\n    FMDBRelease(_path);\n    \n    if (_queue) {\n        _queue = 0x00;\n    }\n#if ! __has_feature(objc_arc)\n    [super dealloc];\n#endif\n}\n\n- (void)close {\n    FMDBRetain(self);\n    dispatch_sync(_queue, ^() { \n        [_db close];\n        FMDBRelease(_db);\n        _db = 0x00;\n    });\n    FMDBRelease(self);\n}\n\n- (FMDatabase*)database {\n    if (!_db) {\n        _db = FMDBReturnRetained([FMDatabase databaseWithPath:_path]);\n        \n        if (![_db open]) {\n            NSLog(@\"FMDatabaseQueue could not reopen database for path %@\", _path);\n            FMDBRelease(_db);\n            _db  = 0x00;\n            return 0x00;\n        }\n    }\n    \n    return _db;\n}\n\n- (void)inDatabase:(void (^)(FMDatabase *db))block {\n    FMDBRetain(self);\n    \n    dispatch_sync(_queue, ^() {\n        \n        FMDatabase *db = [self database];\n        block(db);\n        \n        if ([db hasOpenResultSets]) {\n            NSLog(@\"Warning: there is at least one open result set around after performing [FMDatabaseQueue inDatabase:]\");\n        }\n    });\n    \n    FMDBRelease(self);\n}\n\n\n- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    FMDBRetain(self);\n    dispatch_sync(_queue, ^() { \n        \n        BOOL shouldRollback = NO;\n        \n        if (useDeferred) {\n            [[self database] beginDeferredTransaction];\n        }\n        else {\n            [[self database] beginTransaction];\n        }\n        \n        block([self database], &shouldRollback);\n        \n        if (shouldRollback) {\n            [[self database] rollback];\n        }\n        else {\n            [[self database] commit];\n        }\n    });\n    \n    FMDBRelease(self);\n}\n\n- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    [self beginTransaction:YES withBlock:block];\n}\n\n- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    [self beginTransaction:NO withBlock:block];\n}\n\n#if SQLITE_VERSION_NUMBER >= 3007000\n- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block {\n    \n    static unsigned long savePointIdx = 0;\n    __block NSError *err = 0x00;\n    FMDBRetain(self);\n    dispatch_sync(_queue, ^() { \n        \n        NSString *name = [NSString stringWithFormat:@\"savePoint%d\", (int)savePointIdx++];\n        \n        BOOL shouldRollback = NO;\n        \n        if ([[self database] startSavePointWithName:name error:&err]) {\n            \n            block([self database], &shouldRollback);\n            \n            if (shouldRollback) {\n                [[self database] rollbackToSavePointWithName:name error:&err];\n            }\n            else {\n                [[self database] releaseSavePointWithName:name error:&err];\n            }\n            \n        }\n    });\n    FMDBRelease(self);\n    return err;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Dash/FMResultSet.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"sqlite3.h\"\n\n#ifndef __has_feature      // Optional.\n#define __has_feature(x) 0 // Compatibility with non-clang compilers.\n#endif\n\n#ifndef NS_RETURNS_NOT_RETAINED\n#if __has_feature(attribute_ns_returns_not_retained)\n#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))\n#else\n#define NS_RETURNS_NOT_RETAINED\n#endif\n#endif\n\n@class FMDatabase;\n@class FMStatement;\n\n@interface FMResultSet : NSObject {\n    FMDatabase          *_parentDB;\n    FMStatement         *_statement;\n    \n    NSString            *_query;\n    NSMutableDictionary *_columnNameToIndexMap;\n    BOOL                _columnNamesSetup;\n}\n\n@property (retain) NSString *query;\n@property (retain) NSMutableDictionary *columnNameToIndexMap;\n@property (retain) FMStatement *statement;\n\n+ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB;\n\n- (void)close;\n\n- (void)setParentDB:(FMDatabase *)newDb;\n\n- (BOOL)next;\n- (BOOL)hasAnotherRow;\n\n- (int)columnCount;\n\n- (int)columnIndexForName:(NSString*)columnName;\n- (NSString*)columnNameForIndex:(int)columnIdx;\n\n- (int)intForColumn:(NSString*)columnName;\n- (int)intForColumnIndex:(int)columnIdx;\n\n- (long)longForColumn:(NSString*)columnName;\n- (long)longForColumnIndex:(int)columnIdx;\n\n- (long long int)longLongIntForColumn:(NSString*)columnName;\n- (long long int)longLongIntForColumnIndex:(int)columnIdx;\n\n- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName;\n- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx;\n\n- (BOOL)boolForColumn:(NSString*)columnName;\n- (BOOL)boolForColumnIndex:(int)columnIdx;\n\n- (double)doubleForColumn:(NSString*)columnName;\n- (double)doubleForColumnIndex:(int)columnIdx;\n\n- (NSString*)stringForColumn:(NSString*)columnName;\n- (NSString*)stringForColumnIndex:(int)columnIdx;\n\n- (NSDate*)dateForColumn:(NSString*)columnName;\n- (NSDate*)dateForColumnIndex:(int)columnIdx;\n\n- (NSData*)dataForColumn:(NSString*)columnName;\n- (NSData*)dataForColumnIndex:(int)columnIdx;\n\n- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx;\n- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName;\n\n// returns one of NSNumber, NSString, NSData, or NSNull\n- (id)objectForColumnName:(NSString*)columnName;\n- (id)objectForColumnIndex:(int)columnIdx;\n\n/*\nIf you are going to use this data after you iterate over the next row, or after you close the\nresult set, make sure to make a copy of the data first (or just use dataForColumn:/dataForColumnIndex:)\nIf you don't, you're going to be in a world of hurt when you try and use the data.\n*/\n- (NSData*)dataNoCopyForColumn:(NSString*)columnName NS_RETURNS_NOT_RETAINED;\n- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx NS_RETURNS_NOT_RETAINED;\n\n- (BOOL)columnIndexIsNull:(int)columnIdx;\n- (BOOL)columnIsNull:(NSString*)columnName;\n\n\n/* Returns a dictionary of the row results mapped to case sensitive keys of the column names. */\n- (NSDictionary*)resultDictionary;\n \n/* Please use resultDictionary instead.  Also, beware that resultDictionary is case sensitive! */\n- (NSDictionary*)resultDict  __attribute__ ((deprecated));\n\n- (void)kvcMagic:(id)object;\n\n \n@end\n\n"
  },
  {
    "path": "Dash/FMResultSet.m",
    "content": "#import \"FMResultSet.h\"\n#import \"FMDatabase.h\"\n#import \"unistd.h\"\n\n@interface FMDatabase ()\n- (void)resultSetDidClose:(FMResultSet *)resultSet;\n@end\n\n\n@interface FMResultSet (Private)\n- (NSMutableDictionary *)columnNameToIndexMap;\n- (void)setColumnNameToIndexMap:(NSMutableDictionary *)value;\n@end\n\n@implementation FMResultSet\n@synthesize query=_query;\n@synthesize columnNameToIndexMap=_columnNameToIndexMap;\n@synthesize statement=_statement;\n\n+ (id)resultSetWithStatement:(FMStatement *)statement usingParentDatabase:(FMDatabase*)aDB {\n    \n    FMResultSet *rs = [[FMResultSet alloc] init];\n    \n    [rs setStatement:statement];\n    [rs setParentDB:aDB];\n    \n    return FMDBReturnAutoreleased(rs);\n}\n\n- (void)finalize {\n    [self close];\n    [super finalize];\n}\n\n- (void)dealloc {\n    [self close];\n    \n    FMDBRelease(_query);\n    _query = nil;\n    \n    FMDBRelease(_columnNameToIndexMap);\n    _columnNameToIndexMap = nil;\n    \n#if ! __has_feature(objc_arc)\n    [super dealloc];\n#endif\n}\n\n- (void)close {\n    [_statement reset];\n    FMDBRelease(_statement);\n    _statement = nil;\n    \n    // we don't need this anymore... (i think)\n    //[_parentDB setInUse:NO];\n    [_parentDB resultSetDidClose:self];\n    _parentDB = nil;\n}\n\n- (int)columnCount {\n    return sqlite3_column_count([_statement statement]);\n}\n\n- (void)setupColumnNames {\n    \n    if (!_columnNameToIndexMap) {\n        [self setColumnNameToIndexMap:[NSMutableDictionary dictionary]];\n    }    \n    \n    int columnCount = sqlite3_column_count([_statement statement]);\n    \n    int columnIdx = 0;\n    for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {\n        _columnNameToIndexMap[[@(sqlite3_column_name([_statement statement], columnIdx)) lowercaseString]] = @(columnIdx);\n    }\n    _columnNamesSetup = YES;\n}\n\n- (void)kvcMagic:(id)object {\n    \n    int columnCount = sqlite3_column_count([_statement statement]);\n    \n    int columnIdx = 0;\n    for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {\n        \n        const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx);\n        \n        // check for a null row\n        if (c) {\n            NSString *s = @(c);\n            \n            [object setValue:s forKey:@(sqlite3_column_name([_statement statement], columnIdx))];\n        }\n    }\n}\n\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-implementations\"\n\n- (NSDictionary*)resultDict {\n    \n    int num_cols = sqlite3_data_count([_statement statement]);\n    \n    if (num_cols > 0) {\n        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols];\n        \n        if (!_columnNamesSetup) {\n            [self setupColumnNames];\n        }\n        \n        NSEnumerator *columnNames = [_columnNameToIndexMap keyEnumerator];\n        NSString *columnName = nil;\n        while ((columnName = [columnNames nextObject])) {\n            id objectValue = [self objectForColumnName:columnName];\n            dict[columnName] = objectValue;\n        }\n        \n        return FMDBReturnAutoreleased([dict copy]);\n    }\n    else {\n        NSLog(@\"Warning: There seem to be no columns in this set.\");\n    }\n    \n    return nil;\n}\n\n#pragma clang diagnostic pop\n\n- (NSDictionary*)resultDictionary {\n    \n    int num_cols = sqlite3_data_count([_statement statement]);\n    \n    if (num_cols > 0) {\n        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:num_cols];\n        \n        int columnCount = sqlite3_column_count([_statement statement]);\n        \n        int columnIdx = 0;\n        for (columnIdx = 0; columnIdx < columnCount; columnIdx++) {\n            \n            NSString *columnName = @(sqlite3_column_name([_statement statement], columnIdx));\n            id objectValue = [self objectForColumnIndex:columnIdx];\n            dict[columnName] = objectValue;\n        }\n        \n        return dict;\n    }\n    else {\n        NSLog(@\"Warning: There seem to be no columns in this set.\");\n    }\n    \n    return nil;\n}\n\n\n\n\n\n- (BOOL)next {\n    \n    int rc;\n    BOOL retry;\n    int numberOfRetries = 0;\n    do {\n        retry = NO;\n        \n        rc = sqlite3_step([_statement statement]);\n        \n        if (SQLITE_BUSY == rc || SQLITE_LOCKED == rc) {\n            // this will happen if the db is locked, like if we are doing an update or insert.\n            // in that case, retry the step... and maybe wait just 10 milliseconds.\n            retry = YES;\n            if (SQLITE_LOCKED == rc) {\n                rc = sqlite3_reset([_statement statement]);\n                if (rc != SQLITE_LOCKED) {\n                    NSLog(@\"Unexpected result from sqlite3_reset (%d) rs\", rc);\n                }\n            }\n            usleep(20);\n            \n            if ([_parentDB busyRetryTimeout] && (numberOfRetries++ > [_parentDB busyRetryTimeout])) {\n                    NSLog(@\"%s:%d Database busy (%@)\", __FUNCTION__, __LINE__, [_parentDB databasePath]);\n                    NSLog(@\"Database busy\");\n                    break;\n            }\n        }\n        else if (SQLITE_DONE == rc || SQLITE_ROW == rc) {\n            // all is well, let's return.\n        }\n        else if (SQLITE_ERROR == rc) {\n            NSLog(@\"Error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([_parentDB sqliteHandle]));\n            break;\n        } \n        else if (SQLITE_MISUSE == rc) {\n            // uh oh.\n            NSLog(@\"Error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([_parentDB sqliteHandle]));\n            break;\n        }\n        else {\n            // wtf?\n            NSLog(@\"Unknown error calling sqlite3_step (%d: %s) rs\", rc, sqlite3_errmsg([_parentDB sqliteHandle]));\n            if(rc == SQLITE_CORRUPT)\n            {\n            }\n            break;\n        }\n        \n    } while (retry);\n    \n    \n    if (rc != SQLITE_ROW) {\n        [self close];\n    }\n    \n    return (rc == SQLITE_ROW);\n}\n\n- (BOOL)hasAnotherRow {\n    return sqlite3_errcode([_parentDB sqliteHandle]) == SQLITE_ROW;\n}\n\n- (int)columnIndexForName:(NSString*)columnName {\n    \n    if (!_columnNamesSetup) {\n        [self setupColumnNames];\n    }\n    \n    columnName = [columnName lowercaseString];\n    \n    NSNumber *n = _columnNameToIndexMap[columnName];\n    \n    if (n) {\n        return [n intValue];\n    }\n    \n    NSLog(@\"Warning: I could not find the column named '%@'.\", columnName);\n    \n    return -1;\n}\n\n\n\n- (int)intForColumn:(NSString*)columnName {\n    return [self intForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (int)intForColumnIndex:(int)columnIdx {\n    return sqlite3_column_int([_statement statement], columnIdx);\n}\n\n- (long)longForColumn:(NSString*)columnName {\n    return [self longForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (long)longForColumnIndex:(int)columnIdx {\n    return (long)sqlite3_column_int64([_statement statement], columnIdx);\n}\n\n- (long long int)longLongIntForColumn:(NSString*)columnName {\n    return [self longLongIntForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (long long int)longLongIntForColumnIndex:(int)columnIdx {\n    return sqlite3_column_int64([_statement statement], columnIdx);\n}\n\n- (unsigned long long int)unsignedLongLongIntForColumn:(NSString*)columnName {\n    return [self unsignedLongLongIntForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (unsigned long long int)unsignedLongLongIntForColumnIndex:(int)columnIdx {\n    return (unsigned long long int)[self longLongIntForColumnIndex:columnIdx];\n}\n\n- (BOOL)boolForColumn:(NSString*)columnName {\n    return [self boolForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (BOOL)boolForColumnIndex:(int)columnIdx {\n    return ([self intForColumnIndex:columnIdx] != 0);\n}\n\n- (double)doubleForColumn:(NSString*)columnName {\n    return [self doubleForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (double)doubleForColumnIndex:(int)columnIdx {\n    return sqlite3_column_double([_statement statement], columnIdx);\n}\n\n- (NSString*)stringForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    const char *c = (const char *)sqlite3_column_text([_statement statement], columnIdx);\n    \n    if (!c) {\n        // null row.\n        return nil;\n    }\n    \n    return @(c);\n}\n\n- (NSString*)stringForColumn:(NSString*)columnName {\n    return [self stringForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSDate*)dateForColumn:(NSString*)columnName {\n    return [self dateForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSDate*)dateForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    return [NSDate dateWithTimeIntervalSince1970:[self doubleForColumnIndex:columnIdx]];\n}\n\n\n- (NSData*)dataForColumn:(NSString*)columnName {\n    return [self dataForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSData*)dataForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    int dataSize = sqlite3_column_bytes([_statement statement], columnIdx);\n    \n    NSMutableData *data = [NSMutableData dataWithLength:dataSize];\n    \n    memcpy([data mutableBytes], sqlite3_column_blob([_statement statement], columnIdx), dataSize);\n    \n    return data;\n}\n\n\n- (NSData*)dataNoCopyForColumn:(NSString*)columnName {\n    return [self dataNoCopyForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (NSData*)dataNoCopyForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    int dataSize = sqlite3_column_bytes([_statement statement], columnIdx);\n    \n    NSData *data = [NSData dataWithBytesNoCopy:(void *)sqlite3_column_blob([_statement statement], columnIdx) length:dataSize freeWhenDone:NO];\n    \n    return data;\n}\n\n\n- (BOOL)columnIndexIsNull:(int)columnIdx {\n    return sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL;\n}\n\n- (BOOL)columnIsNull:(NSString*)columnName {\n    return [self columnIndexIsNull:[self columnIndexForName:columnName]];\n}\n\n- (const unsigned char *)UTF8StringForColumnIndex:(int)columnIdx {\n    \n    if (sqlite3_column_type([_statement statement], columnIdx) == SQLITE_NULL || (columnIdx < 0)) {\n        return nil;\n    }\n    \n    return sqlite3_column_text([_statement statement], columnIdx);\n}\n\n- (const unsigned char *)UTF8StringForColumnName:(NSString*)columnName {\n    return [self UTF8StringForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n- (id)objectForColumnIndex:(int)columnIdx {\n    int columnType = sqlite3_column_type([_statement statement], columnIdx);\n    \n    id returnValue = nil;\n    \n    if (columnType == SQLITE_INTEGER) {\n        returnValue = @([self longLongIntForColumnIndex:columnIdx]);\n    }\n    else if (columnType == SQLITE_FLOAT) {\n        returnValue = @([self doubleForColumnIndex:columnIdx]);\n    }\n    else if (columnType == SQLITE_BLOB) {\n        returnValue = [self dataForColumnIndex:columnIdx];\n    }\n    else {\n        //default to a string for everything else\n        returnValue = [self stringForColumnIndex:columnIdx];\n    }\n    \n    return returnValue;\n}\n\n- (id)objectForColumnName:(NSString*)columnName {\n    return [self objectForColumnIndex:[self columnIndexForName:columnName]];\n}\n\n// returns autoreleased NSString containing the name of the column in the result set\n- (NSString*)columnNameForIndex:(int)columnIdx {\n    return @(sqlite3_column_name([_statement statement], columnIdx));\n}\n\n- (void)setParentDB:(FMDatabase *)newDb {\n    _parentDB = newDb;\n}\n\n\n@end\n"
  },
  {
    "path": "Dash/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-Small-40@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"57x57\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"50x50\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-Small-50@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"72x72\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-72@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"size\" : \"76x76\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"83.5x83.5\",\n      \"idiom\" : \"ipad\",\n      \"filename\" : \"Icon-83.5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"iTunesArtwork@2x.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"properties\" : {\n    \"pre-rendered\" : true\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Empty Placeholders/placeholder_docsets.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"placeholder_docsets.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"placeholder_docsets@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"filename\" : \"placeholder_docsets@3x.png\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Empty Placeholders/placeholder_transfer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"placeholder_transfer.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"placeholder_transfer@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"filename\" : \"placeholder_transfer@3x.png\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Dash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Dash.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Dash@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Google.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Google.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Google@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Mac.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Mac.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Mac@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Other.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Other.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Other@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/SproutCore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"SproutCore.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"SproutCore@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/Stack Overflow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Stack Overflow.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Stack Overflow@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/actionscript.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"actionscript.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"actionscript@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/akka.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"akka.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"akka@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/android.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"android.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"android@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/angular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"angular.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"angular@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/angulardart.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"angulardart.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"angulardart@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/angularjs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"angularjs.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"angularjs@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/angularts.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"angularts.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"angularts@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ansible.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ansible.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ansible@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/apache.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"apache.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"apache@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/apple.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"apple.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"apple@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/applescript.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"applescript.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"applescript@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/arduino.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"arduino.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"arduino@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/awesome.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"awesome.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"awesome@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/awsjs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"awsjs.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"awsjs@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/backbone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"backbone.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"backbone@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/bash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"bash.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"bash@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/boost.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"boost.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"boost@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/bootstrap.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"bootstrap.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"bootstrap@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/bourbon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"bourbon.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"bourbon@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/c.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"c.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"c@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cakephp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cakephp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cakephp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cappuccino.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cappuccino.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cappuccino@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cf.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cf@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/chai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"chai.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"chai@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cheatsheet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cheatsheet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cheatsheet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/chef.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"chef.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"chef@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cljlib.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cljlib.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cljlib@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/clojure.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"clojure.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"clojure@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cmake.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cmake.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cmake@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cocoadocs_platform.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cocoadocs_platform.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cocoadocs_platform@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cocoapods.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cocoapods.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cocoapods@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cocos2d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cocos2d.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cocos2d@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cocos2dx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cocos2dx.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cocos2dx@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/codeigniter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"codeigniter.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"codeigniter@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/coffee.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"coffee.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"coffee@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/compass.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"compass.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"compass@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cordova.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cordova.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cordova@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/corona.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"corona.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"corona@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/couchdb.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"couchdb.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"couchdb@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cpp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cpp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cpp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/craft.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"craft.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"craft@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/css.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"css.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"css@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cvc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cvc.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cvc@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cvcpp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cvcpp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cvcpp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cvj.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cvj.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cvj@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/cvp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"cvp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"cvp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/d3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"d3.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"d3@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/dartdocs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dartdocs.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dartdocs@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/dartlang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"dartlang.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"dartlang@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/django.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"django.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"django@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/docker.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"docker.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"docker@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/doctrine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"doctrine.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"doctrine@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/dojo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"dojo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"dojo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/dom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"dom.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"dom@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/drupal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"drupal.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"drupal@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ee.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ee.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ee@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/elasticsearch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"elasticsearch.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"elasticsearch@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/elisp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"elisp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"elisp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/elixir.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"elixir.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"elixir@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ember.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ember.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ember@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/emmet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"emmet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"emmet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/erlang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"erlang.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"erlang@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/express.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"express.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"express@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/extjs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"extjs.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"extjs@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/flask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"flask.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"flask@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/foundation.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"foundation.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"foundation@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/git.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"git.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"git@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/github.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"github@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/gl2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"gl2.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"gl2@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/gl3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"gl3.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"gl3@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/gl4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"gl4.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"gl4@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/glib.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"glib.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"glib@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/go.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"go.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"go@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/godoc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"godoc.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"godoc@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/gradle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"gradle.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"gradle@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/grails.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"grails.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"grails@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/groovy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"groovy.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"groovy@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/grunt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"grunt.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"grunt@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/gulp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"gulp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"gulp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/hackage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hackage.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hackage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/haml.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"haml.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"haml@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/handlebars.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"handlebars.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"handlebars@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/haskell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"haskell.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"haskell@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/hex.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"hex.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"hex@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/html.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"html.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"html@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ionic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ionic.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ionic@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/iphone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"iphone.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"iphone@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jQuery.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jQuery.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jQuery@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jade.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jade.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jade@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jasmine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jasmine.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jasmine@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/java.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"java.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"java@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/javadoc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"javadoc.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"javadoc@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/javafx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"javafx.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"javafx@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/javascript.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"javascript.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"javascript@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jee6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jee6.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jee6@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jee7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jee7.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jee7@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jee8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jee8.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jee8@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jekyll.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jekyll.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jekyll@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jinja.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jinja.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jinja@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/joomla.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"joomla.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"joomla@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jquerym.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jquerym.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jquerym@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/jqueryui.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"jqueryui.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"jqueryui@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/julia.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"julia.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"julia@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/knockout.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"knockout.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"knockout@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/kobold2d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"kobold2d.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"kobold2d@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/laravel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"laravel.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"laravel@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/latex.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"latex.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"latex@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/less.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"less.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"less@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/linux.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"linux.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"linux@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/lisp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"lisp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"lisp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/lodash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"lodash.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"lodash@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/lua.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"lua.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"lua@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/manPages.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"manPages.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"manPages@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/marionette.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"marionette.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"marionette@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/markdown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"markdown.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"markdown@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/matlab.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"matlab.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"matlab@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/matplotlib.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"matplotlib.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"matplotlib@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/meteor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"meteor.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"meteor@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/mocha.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mocha.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mocha@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/moment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"moment.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"moment@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/mongodb.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"mongodb.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"mongodb@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/mongoose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"mongoose.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"mongoose@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/mono.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"mono.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"mono@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/moo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"moo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"moo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/mysql.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"mysql.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"mysql@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/neat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"neat.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"neat@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/net.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"net.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"net@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/nginx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"nginx.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"nginx@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/nodejs.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"nodejs.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"nodejs@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/numpy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"numpy.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"numpy@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ocaml.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ocaml.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ocaml@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/opencv.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"opencv.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"opencv@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/pandas.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pandas.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pandas@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/perl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"perl.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"perl@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/phalcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"phalcon.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"phalcon@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/phonegap.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"phonegap.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"phonegap@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/php.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"php.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"php@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/phpp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"phpp.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"phpp@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/phpunit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"phpunit.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"phpunit@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/playjava.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"playjava.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"playjava@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/playscala.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"playscala.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"playscala@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/polymerdart.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"polymerdart.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"polymerdart@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/processing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"processing.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"processing@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/prototype.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"prototype.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"prototype@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/psql.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"psql.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"psql@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/pug.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pug.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pug@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/puppet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"puppet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"puppet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/python.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"python.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"python@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/qt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"qt.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"qt@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/r.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"r.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"r@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/racket.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"racket.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"racket@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/rails.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"rails.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"rails@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/react.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"react.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"react@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/redis.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"redis.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"redis@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/require.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"require.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"require@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/ruby.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"ruby.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"ruby@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/rubyGems.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"rubyGems.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"rubyGems@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/rubymotion.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"rubymotion.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"rubymotion@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/rust.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"rust.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"rust@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sails.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sails.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sails@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/salt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"salt.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"salt@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sass.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sass.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sass@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/scala.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"scala.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"scala@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/scaladoc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"scaladoc.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"scaladoc@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/scipy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"scipy.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"scipy@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/semantic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"semantic.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"semantic@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sencha.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sencha.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sencha@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sinon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sinon.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sinon@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/smarty.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"smarty.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"smarty@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sooffline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sooffline.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sooffline@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/soonline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"soonline.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"soonline@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sparrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sparrow.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sparrow@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/spring.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"spring.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"spring@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sqlalchemy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sqlalchemy.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sqlalchemy@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/sqlite.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"sqlite.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"sqlite@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/statamic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"statamic.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"statamic@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/stylus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"stylus.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"stylus@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/susy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"susy.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"susy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/svg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"svg.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"svg@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/swift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"swift.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"swift@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/symfony.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"symfony.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"symfony@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/tcl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"tcl.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"tcl@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/titanium.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"titanium.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"titanium@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/tornado.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"tornado.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"tornado@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/tvos.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tvos.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tvos@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/twig.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"twig.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"twig@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/twisted.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"twisted.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"twisted@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/typescript.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"typescript.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"typescript@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/typo3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"typo3.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"typo3@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/underscore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"underscore.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"underscore@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/unity3d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"unity3d.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"unity3d@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/vagrant.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"vagrant.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"vagrant@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/vim.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"vim.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"vim@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/vsphere.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"vsphere.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"vsphere@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/vue.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vue.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vue@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/watchos.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"watchos.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"watchos@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/wordpress.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"wordpress.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"wordpress@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/xamarin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"xamarin.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"xamarin@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/xojo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"xojo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"xojo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/xslt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"xslt.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"xslt@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/xul.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"xul.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"xul@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/yii.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"yii.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"yii@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/yui.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"yui.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"yui@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/zend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"zend.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"zend@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Platforms/zepto.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"zepto.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"zepto@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Preferences/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Preferences/cheat_repo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cheat_repo.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cheat_repo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Preferences/main_repo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"main_repo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"main_repo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Preferences/transfer_repo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"transfer_repo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"transfer_repo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Preferences/user_repo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"user_repo.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"user_repo@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/checkmark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"checkmark.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"checkmark@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/download_button_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"download_button_arrow.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"download_button_arrow@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/download_button_background.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"download_button_background.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"download_button_background@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/error.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"error.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"error@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/transfer_button.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"transfer_button.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"transfer_button@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Repos/trash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"trash.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"trash@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Abbreviation.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Abbreviation.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Abbreviation@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Alias.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Alias.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Alias@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Annotation.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Annotation.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Annotation@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Attribute.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Attribute.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Attribute@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Axiom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Axiom.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Axiom@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Binding.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Binding.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Binding@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Block.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Block.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Block@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Bookmark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Bookmark.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Bookmark@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Builtin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Builtin.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Builtin@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Callback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Callback.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Callback@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Category.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Category.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Category@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Class.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Class.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Class@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Collection.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Collection.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Collection@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Column.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Column.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Column@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Command.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Command.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Command@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Component.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Component.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Component@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Constant.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Constant.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Constant@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Constructor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Constructor.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Constructor@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Control Structure.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Control Structure.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Control Structure@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Conversion.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Conversion.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Conversion@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Data Source.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Data Source.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Data Source@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Database.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Database.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Database@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Decorator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Decorator.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Decorator@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Define.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Define.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Define@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Delegate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Delegate.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Delegate@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/DeletedSnippet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"DeletedSnippet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"DeletedSnippet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Device.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Device.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Device@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Diagram.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Diagram.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Diagram@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Directive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Directive.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Directive@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Element.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Element.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Element@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Entry.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Entry.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Entry@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Enum.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Enum.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Enum@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Environment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Environment.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Environment@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Error.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Error.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Error@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Event.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Event.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Event@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Exception.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Exception.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Exception@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Expression.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Expression.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Expression@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Extension.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Extension.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Extension@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Field.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Field.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Field@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/File.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"File.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"File@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Filter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Filter.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Filter@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Flag.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Flag.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Flag@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Foreign Key.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Foreign Key.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Foreign Key@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Framework.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Framework.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Framework@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Function.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Function.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Function@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Global.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Global.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Global@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Glossary.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Glossary.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Glossary@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Guide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Guide.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Guide@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Handler.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Handler.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Handler@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Helper.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Helper.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Helper@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Hook.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Hook.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Hook@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Index.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Index.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Index@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Indirection.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Indirection.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Indirection@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Inductive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Inductive.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Inductive@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Instance.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Instance.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Instance@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Instruction.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Instruction.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Instruction@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Interface.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Interface.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Interface@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Iterator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Iterator.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Iterator@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Keyword.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Keyword.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Keyword@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Kind.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Kind.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Kind@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Lemma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Lemma.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Lemma@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Library.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Library.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Library@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Literal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Literal.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Literal@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Macro.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Macro.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Macro@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Member.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Member.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Member@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Message.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Message.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Message@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Method.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Method.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Method@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Mixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Mixin.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Mixin@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Modifier.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Modifier.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Modifier@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Module.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Module.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Module@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Namespace.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Namespace.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Namespace@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/NewSnippet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"NewSnippet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"NewSnippet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Node.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Node.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Node@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Notation.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Notation.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Notation@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Object.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Object.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Object@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Operator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Operator.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Operator@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Option.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Option.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Option@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Package.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Package.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Package@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Parameter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Parameter.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Parameter@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Pattern.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Pattern.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Pattern@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Pipe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Pipe.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Pipe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Plugin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Plugin.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Plugin@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Procedure.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Procedure.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Procedure@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Projection.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Projection.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Projection@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Property.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Property.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Property@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Protocol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Protocol.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Protocol@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Provider.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Provider.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Provider@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Provisioner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Provisioner.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Provisioner@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Query.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Query.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Query@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Record.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Record.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Record@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Reference.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Reference.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Reference@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Register.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Register.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Register@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Relationship.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Relationship.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Relationship@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Report.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Report.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Report@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Request.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Request.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Request@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Resource.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Resource.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Resource@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Role.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Role.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Role@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Sample.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Sample.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Sample@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Schema.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Schema.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Schema@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Script.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Script.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Script@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Section.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Section.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Section@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Sender.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Sender.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Sender@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Service.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Service.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Service@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Setting.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Setting@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Shortcut.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Shortcut.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Shortcut@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Signature.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Signature.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Signature@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Snippet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Snippet.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Snippet@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Special Form.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Special Form.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Special Form@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/State.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"State.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"State@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Statement.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Statement.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Statement@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Struct.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Struct.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Struct@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Style.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Style.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Style@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Subroutine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Subroutine.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Subroutine@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Syntax.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Syntax.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Syntax@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Table.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Table.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Table@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Tactic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Tactic.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Tactic@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Tag.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Tag.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Tag@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Template.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Template.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Template@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Test.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Test.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Test@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Trait.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Trait.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Trait@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Trigger.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Trigger.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Trigger@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Type.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Type.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Type@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Union.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Union.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Union@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Unknown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Unknown.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Unknown@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Value.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Value.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Value@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Variable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Variable.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Variable@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Variant.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Variant.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Variant@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/View.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"View.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"View@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Web.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Web.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Web@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/WebSearch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WebSearch.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"WebSearch@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Widget.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Widget.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Widget@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/Word.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"Word.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"Word@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/_DashAnnotations.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"_DashAnnotations.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"_DashAnnotations@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/Types/_Struct.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"_Struct.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"_Struct@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"back.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"back@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"filename\" : \"back@3x.png\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/collapse.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"collapse.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"collapse@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/expand.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"expand.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"expand@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/forward.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"forward.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"forward@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"filename\" : \"forward@3x.png\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/tocMenu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"tocMenu.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"tocMenu@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/zoomIn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"zoomIn.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"zoomIn@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Images.xcassets/WebView/zoomOut.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\",\n      \"filename\" : \"zoomOut.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"filename\" : \"zoomOut@2x.png\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Dash/Launch.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11201\" systemVersion=\"16A323\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11161\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <view contentMode=\"scaleToFill\" id=\"iN0-l3-epB\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"480\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <navigationBar contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cP6-ef-1yG\">\n                    <constraints>\n                        <constraint firstAttribute=\"height\" relation=\"greaterThanOrEqual\" constant=\"64\" id=\"3ot-sI-H1t\"/>\n                        <constraint firstAttribute=\"height\" constant=\"64\" id=\"zFT-2g-XD0\"/>\n                    </constraints>\n                </navigationBar>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"cP6-ef-1yG\" secondAttribute=\"trailing\" id=\"2La-fE-qhU\"/>\n                <constraint firstItem=\"cP6-ef-1yG\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"HeW-7l-MGI\"/>\n                <constraint firstItem=\"cP6-ef-1yG\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"VxP-rc-zEC\"/>\n            </constraints>\n            <nil key=\"simulatedStatusBarMetrics\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <point key=\"canvasLocation\" x=\"404\" y=\"445\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "Dash/NSArray+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSArray (DHUtils)\n\n- (NSArray *)characterIndexTitles;\n- (NSInteger)indexOfFirstObjectThatStartsWithCharacter:(NSString *)aCharacter;\n- (BOOL)objectsContainString:(NSString *)string;\n+ (NSArray *)currentIPAddresses;\n\n@end\n"
  },
  {
    "path": "Dash/NSArray+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSArray+DHUtils.h\"\n#include <ifaddrs.h>\n#include <arpa/inet.h>\n#include <net/if.h>\n\n@implementation NSArray (DHUtils)\n\n- (NSArray *)characterIndexTitles\n{\n    NSMutableOrderedSet *chars = [NSMutableOrderedSet orderedSet];\n    for(id obj in self)\n    {\n        NSString *character = [([obj isKindOfClass:[NSString class]]) ? [obj firstChar] : [[obj stringValue] firstChar] uppercaseString];\n        [chars addObject:character];\n    }\n    return [chars array];\n}\n\n- (NSInteger)indexOfFirstObjectThatStartsWithCharacter:(NSString *)aCharacter\n{\n    NSUInteger i = 0;\n    for(id obj in self)\n    {\n        NSString *character = [([obj isKindOfClass:[NSString class]]) ? [obj firstChar] : [[obj stringValue] firstChar] uppercaseString];\n        if([character isEqualToString:aCharacter])\n        {\n            return i;\n        }\n        ++i;\n    }\n    return NSNotFound;\n}\n\n- (BOOL)objectsContainString:(NSString *)string\n{\n    for(NSString *obj in self)\n    {\n        if([obj contains:string])\n        {\n            return YES;\n        }\n    }\n    return NO;\n}\n\n+ (NSMutableArray *)currentIPAddresses\n{\n#define IP_ADDR_IPv4    @\"ipv4\"\n#define IP_ADDR_IPv6    @\"ipv6\"\n\n    NSMutableArray *addresses = [NSMutableArray array];\n    \n    // retrieve the current interfaces - returns 0 on success\n    struct ifaddrs *interfaces;\n    if(!getifaddrs(&interfaces)) {\n        // Loop through linked list of interfaces\n        struct ifaddrs *interface;\n        for(interface=interfaces; interface; interface=interface->ifa_next) {\n            if(!(interface->ifa_flags & IFF_UP) /* || (interface->ifa_flags & IFF_LOOPBACK) */ ) {\n                continue; // deeply nested code harder to read\n            }\n            const struct sockaddr_in *addr = (const struct sockaddr_in*)interface->ifa_addr;\n            char addrBuf[ MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) ];\n            if(addr && (addr->sin_family==AF_INET || addr->sin_family==AF_INET6)) {\n                NSString *type;\n                if(addr->sin_family == AF_INET) {\n                    if(inet_ntop(AF_INET, &addr->sin_addr, addrBuf, INET_ADDRSTRLEN)) {\n                        type = IP_ADDR_IPv4;\n                    }\n                } else {\n                    const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6*)interface->ifa_addr;\n                    if(inet_ntop(AF_INET6, &addr6->sin6_addr, addrBuf, INET6_ADDRSTRLEN)) {\n                        type = IP_ADDR_IPv6;\n                    }\n                }\n                if(type) {\n                    [addresses addObject:@(addrBuf)];\n                }\n            }\n        }\n        // Free memory\n        freeifaddrs(interfaces);\n    }\n    return addresses;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSData+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSData (DHUtils)\n\n- (NSData *)AES256EncryptWithKey:(NSString *)key;\n- (NSData*)AES256DecryptWithKey:(NSString*)key;\n\n@end\n"
  },
  {
    "path": "Dash/NSData+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSData+DHUtils.h\"\n#import <CommonCrypto/CommonCryptor.h>\n\n@implementation NSData (DHUtils)\n\n#define DHCryptSalt @\"fe31hxd9l1doder429d03eo1\"\n\n- (NSData *)AES256EncryptWithKey:(NSString *)key\n{\n    if(key.length != 8)\n    {\n        return nil;\n    }\n    key = [key stringByAppendingString:DHCryptSalt];\n    char keyPtr[kCCKeySizeAES256 + 1];\n    bzero(keyPtr, sizeof(keyPtr)); \n    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];\n    NSUInteger dataLength = [self length];\n    size_t bufferSize = dataLength + kCCBlockSizeAES128;\n    void *buffer = malloc(bufferSize);\n    size_t numBytesEncrypted = 0;\n    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);\n    if(cryptStatus == kCCSuccess)\n    {\n        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];\n    }\n    free(buffer); \n    return nil;\n}\n\n- (NSData *)AES256DecryptWithKey:(NSString*)key \n{\n    if(key.length != 8)\n    {\n        return nil;\n    }\n    key = [key stringByAppendingString:DHCryptSalt];\n    char keyPtr[kCCKeySizeAES256 + 1]; \n    bzero(keyPtr, sizeof(keyPtr)); \n    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];\n    NSUInteger dataLength = [self length];\n    size_t bufferSize = dataLength + kCCBlockSizeAES128;\n    void *buffer = malloc(bufferSize);\n    size_t numBytesDecrypted = 0;\n    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, NULL, [self bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);\n    if(cryptStatus == kCCSuccess)\n    {\n        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];\n    }\n    free(buffer); \n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSFileManager+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSFileManager (DHUtils)\n\n- (NSString *)firstFileWithExtension:(NSString *)extension atPath:(NSString *)path ignoreHidden:(BOOL)ignoreHidden;\n- (BOOL)fileExistsAtPathOrInIndex:(NSString *)path;\n\n@end\n"
  },
  {
    "path": "Dash/NSFileManager+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSFileManager+DHUtils.h\"\n\n@implementation NSFileManager (DHUtils)\n\n- (NSString *)firstFileWithExtension:(NSString *)extension atPath:(NSString *)path ignoreHidden:(BOOL)ignoreHidden\n{\n    NSArray *files = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];\n    for(NSString *file in files)\n    {\n        if([[file pathExtension] isCaseInsensitiveEqual:extension] && (!ignoreHidden || (ignoreHidden && ![file hasPrefix:@\".\"])))\n        {\n            return file;\n        }\n    }\n    return nil;\n}\n\n- (BOOL)fileExistsAtPathOrInIndex:(NSString *)path\n{\n    if([self fileExistsAtPath:path] || [DHTarixIndex hashForFile:path])\n    {\n        return YES;\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSObject+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSObject (DHUtils)\n\n- (BOOL)callStackIsRestoring;\n\n@end\n"
  },
  {
    "path": "Dash/NSObject+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSObject+DHUtils.h\"\n#import \"DHJavaScriptBridge.h\"\n\n@implementation NSObject (DHUtils)\n\n- (BOOL)callStackIsRestoring\n{\n    return NO;\n    return [[NSArray arrayWithArray:[NSThread callStackSymbols]] objectsContainString:@\"restoreState\"];\n}\n\n- (void)webView:(id)unused didCreateJavaScriptContext:(JSContext*)ctx forFrame:(id)frame\n{\n    ctx[@\"window\"][@\"dash\"] = [DHJavaScriptBridge sharedBridge];\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSString+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n// Convenience NSString methods used throughout\n@interface NSString (DHUtils) {\n    \n}\n\n- (NSString *)stringByDeletingPathFragment;\n- (NSString *)pathFragment;\n- (NSString *)docsetPath;\n- (NSString *)docsetPlatform;\n- (NSString *)stringByDeletingPathToDocset;\n- (NSString *)firstComponentSeparatedByWhitespace;\n- (NSArray *)allOccurrencesOfSubstringsBetweenString:(NSString *)from andString:(NSString *)to;\n- (float)distanceFromString:(NSString *)stringB;\n- (float)distanceFromString:(NSString *)stringB withDummyLimit:(NSInteger)limit;\n- (int)smallestOf:(int)a andOf:(int)b andOf:(int)c;\n- (NSString *)tagFromTagQuery;\n- (NSString *)characterBeforeSuffix:(NSString *)suffix;\n- (BOOL)hasSameLastCharactersWithString:(NSString *)string charToCompare:(NSString *)character;\n- (NSUInteger)countNewLines;\n- (NSString *)FTSPrefix;\n- (NSString *)allFTSSuffixes;\n- (NSString *)stringByConvertingKapeliHttpURLToHttps;\n- (NSString *)substringFromLastOccurrenceOfStringReturningNil:(NSString *)string;\n- (NSString *)stringByConvertingKapeliHttpURLToHttpsReturningNil;\n- (NSString *)stringByRemovingWhitespaces;\n- (NSString *)stringByReplacingSpecialFTSCharacters;\n- (NSString *)stringByBackwardsLimitingLinesTo:(NSUInteger)limit;\n- (NSString *)stringByLimitingLinesTo:(NSUInteger)limit;\n- (NSString *)lastPackageComponent:(NSString *)delimiter;\n- (NSString *)lastTwoPackageComponents:(NSString *)delimiter;\n- (NSString *)packageComponentsDependingOnPackage:(NSString *)package;\n- (NSString *)stringByDeletingLastPackageComponent:(NSString *)delimiter;\n+ (NSString *)commonPackageInStringArray:(NSArray *)strings delimiter:(NSString *)delimiter;\n- (NSString *)shortenJavaMethod;\n- (BOOL)hasCaseInsensitivePrefix:(NSString *)prefix;\n- (BOOL)hasCaseInsensitiveSuffix:(NSString *)suffix;\n- (BOOL)isPackageType;\n- (BOOL)isClassType;\n- (NSString *)stringByAddingWildcardsEverywhere:(NSString *)escapeChar;\n- (NSString *)formatPlural:(NSInteger)count;\n- (NSUInteger)lineStartForRange:(NSRange)diveInRange;\n- (NSRange)rangeOfWhitespaceStringAtBeginningOfLineForRange:(NSRange)range substring:(NSString**)outString;\n- (unichar*)copyOfCharactersInRange:(NSRange)range;\n+ (void)dhEnumerateLinesOfCharacters:(const unichar*)characters ofLength:(NSUInteger)characterCount withBlock:(void(^)(NSRange lineRange))block;\n- (NSRange)rangeOfWhitespaceStringAtBeginningOfLineForRange:(NSRange)range;\n- (NSString *)substringFromDashIndex:(NSUInteger)from;\n- (NSString *)substringToDashIndex:(NSUInteger)to;\n- (NSString *)substringWithDashRange:(NSRange)range;\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end;\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end options:(NSStringCompareOptions)options;\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end startLocation:(NSInteger *)startLocation endLocation:(NSInteger *)endLocation options:(NSStringCompareOptions)options;\n- (NSString *)substringBeginningAtString:(NSString *)start stoppingAtTag:(NSString *)tag startLocation:(NSInteger *)startLocation endLocation:(NSInteger *)endLocation;\n+ (NSString *)stringWithContentsOfURLString:(NSString *)urlString;\n- (NSString *)stringByClearingCharactersFromSet:(NSCharacterSet *)charSet startingAtLocation:(NSInteger)location;\n- (NSString *)substringToStringReturningNil:(NSString *)string;\n- (BOOL)contains:(NSString *)otherString;\n- (NSString *)substringFromStringReturningNil:(NSString *)string;\n- (NSString *)substringToString:(NSString *)string;\n- (NSString *)substringToLastOccurrenceOfString:(NSString *)string;\n- (NSString *)substringFromString:(NSString *)string;\n- (NSString *)substringFromLastOccurrenceOfString:(NSString *)string;\n- (NSString *)httpDomain;\n- (NSString *)stringByRemovingSymbols;\n- (NSString *)stringByRemovingCharactersInSet:(NSCharacterSet *)aSet;\n- (NSArray *)rangesOfString:(NSString *)aString;\n- (void)enumerateLettersUsingBlock:(void (^)(NSString *letter))block;\n- (NSString *)stringByDeletingCharactersInSet:(NSCharacterSet *)aSet removedRanges:(NSMutableArray *)removedRanges;\n- (NSString *)stringByDeletingCharactersInSet:(NSCharacterSet *)aSet;\n- (NSString *)trimWhitespace;\n+ (NSString *)stringByFormattingDownloadProgress:(long long)downloadedBytes totalBytes:(long long)totalBytes;\n- (NSUInteger)countOccurrencesOfString:(NSString *)aString options:(NSStringCompareOptions)options;\n- (NSString *)URLEncodedString_ch;\n+ (NSString *)randomStringWithLength:(int)len;\n- (NSString *)capitalizeFirstWord;\n- (NSString *)removePrefixIfExists:(NSString *)aPrefix;\n- (NSString *)stringByDeletingSymbols;\n- (NSString *)stringByReplacingPercentEscapes;\n- (BOOL)firstCharIsUppercase;\n- (CGSize) attributedSizeWithFont:(UIFont*) font;\n- (BOOL)firstCharIsLowercase;\n- (NSString *)stringByFormingUnionWithString:(NSString *)otherString;\n- (NSString *)stringByIntersectingWithString:(NSString *)otherString;\n- (NSString *)firstChar;\n- (NSString *)stringByEscapingRegExSpecialCharacters;\n- (NSString *)stringByMakingFirstCharUppercase;\n- (NSString *)trimNewline;\n- (BOOL)isLowercase;\n- (BOOL)isUppercase;\n- (BOOL)isCaseInsensitiveEqual:(NSString *)object;\n- (BOOL)containsAny:(NSArray *)strings;\n+ (NSString *)mimeTypeForPathExtension:(NSString *)pathExtension;\n- (NSInteger)countOfCharactersInSet:(NSCharacterSet *)set;\n\n@end\n"
  },
  {
    "path": "Dash/NSString+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSString+DHUtils.h\"\n#import <MobileCoreServices/MobileCoreServices.h>\n\nNSString *const DHPBoardType = @\"DashPBoard\";\n\n@implementation NSString (DHUtils)\n\n- (NSString *)stringByDeletingPathFragment\n{\n    NSRange fragment = [self rangeOfString:@\"#\" options:NSBackwardsSearch];\n    if(fragment.location != NSNotFound) \n    {\n        NSString *newPath = [self substringToDashIndex:fragment.location];\n        return newPath;\n    } \n    else \n    {\n        return self;\n    }\n}\n\n- (NSString *)pathFragment\n{\n    NSRange fragment = [self rangeOfString:@\"#\" options:NSBackwardsSearch];\n    if(fragment.location != NSNotFound && fragment.location+1 < self.length)\n    {\n        NSString *pathFragment = [self substringFromDashIndex:fragment.location+fragment.length];\n        return pathFragment;\n    }\n    else\n    {\n        return nil;\n    }\n}\n\n- (NSString *)FTSPrefix\n{\n    if(self.length <= 1)\n    {\n        return @\"\";\n    }\n    return [[self substringToIndex:self.length-1] stringByReplacingSpecialFTSCharacters];\n}\n\n- (NSString *)allFTSSuffixes\n{\n    if(self.length <= 1)\n    {\n        return @\"\";\n    }\n    NSMutableString *string = [NSMutableString string];\n    BOOL firstLoop = YES;\n    for(NSUInteger i = 1; i < self.length; i++)\n    {\n        if(!firstLoop)\n        {\n            [string appendString:@\" \"];\n        }\n        firstLoop = NO;\n        [string appendString:[self substringWithRange:NSMakeRange(i, self.length-i)]];\n    }\n    return [string stringByReplacingSpecialFTSCharacters];\n}\n\n- (NSString *)stringByRemovingCharactersInSet:(NSCharacterSet *)aSet\n{\n    NSMutableString *string = [[NSMutableString alloc] initWithString:self];\n    NSRange range;\n    while((range = [string rangeOfCharacterFromSet:aSet]).location != NSNotFound)\n    {\n        [string replaceCharactersInRange:range withString:@\"\"];\n    }\n    return string;\n}\n\n- (NSString *)stringByRemovingWhitespaces\n{\n    return [self stringByReplacingOccurrencesOfString:@\" \" withString:@\"\"];\n}\n\n- (NSString *)stringByReplacingSpecialFTSCharacters\n{\n    NSString *string = [self lowercaseString];\n    NSUInteger length = [string length];\n    if(length == 0)\n    {\n        return string;\n    }\n    NSMutableString *finalString = [NSMutableString string];\n    NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length];\n    \n    const unichar *buffer = CFStringGetCharactersPtr((CFStringRef)string);\n    if(!buffer)\n    {\n        NSMutableData *data = [NSMutableData dataWithLength:length * sizeof(UniChar)];\n        if (!data)\n        {\n            return nil;\n        }\n        [string getCharacters:[data mutableBytes]];\n        buffer = [data bytes];\n    }\n    \n    if(!buffer || !data2)\n    {\n        return nil;\n    }\n    \n    unichar *buffer2 = (unichar *)[data2 mutableBytes];\n    \n    NSUInteger buffer2Length = 0;\n    \n    for (NSUInteger i = 0; i < length; ++i)\n    {\n        if(!(buffer[i]>='a' && buffer[i]<='z') && buffer[i] != ' ' && !(buffer[i]>='0' && buffer[i]<='9'))\n        {\n            if(buffer2Length)\n            {\n                CFStringAppendCharacters((CFMutableStringRef)finalString,\n                                         buffer2,\n                                         buffer2Length);\n                buffer2Length = 0;\n            }\n            if(buffer[i] == L'❤')\n            {\n                [finalString appendFormat:@\"`%d`\", ' '];\n            }\n            else\n            {\n                [finalString appendFormat:@\"`%d`\", buffer[i]];\n            }\n        }\n        else\n        {\n            buffer2[buffer2Length] = buffer[i];\n            buffer2Length += 1;\n        }\n    }\n    if(buffer2Length)\n    {\n        CFStringAppendCharacters((CFMutableStringRef)finalString,\n                                 buffer2,\n                                 buffer2Length);\n    }\n    return finalString;\n}\n\n- (NSString *)docsetPath\n{\n    NSRange docsetRange = [self rangeOfString:@\".docset/Contents/Resources/Documents/\"];\n    if(docsetRange.location != NSNotFound)\n    {\n        return [self substringToDashIndex:docsetRange.location+@\".docset\".length];\n    }\n    return nil;\n}\n\n- (NSString *)docsetPlatform\n{\n    NSDictionary *plist = [NSDictionary dictionaryWithContentsOfURL:[[NSURL URLWithString:self] URLByAppendingPathComponent:@\"Contents/Info.plist\"]];\n    NSString *platform = plist[@\"DocSetPlatformFamily\"];\n    if([platform isEqualToString:@\"iphoneos\"] || [platform isEqualToString:@\"ios\"])\n    {\n        return @\"iOS\";\n    }\n    else if([platform isEqualToString:@\"macosx\"] || [platform isEqualToString:@\"osx\"])\n    {\n        return @\"Mac\";\n    }\n    return @\"Unknown Platform\";\n}\n\n+ (NSString *)randomStringWithLength:(int)len\n{\n    NSString *letters = @\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n    int letterCount = (int)letters.length;\n    NSMutableString *randomString = [NSMutableString stringWithCapacity:len];\n    for (int i=0; i<len; i++)\n    {\n        [randomString appendFormat:@\"%C\", [letters characterAtIndex:arc4random_uniform(letterCount) % letterCount]];\n    }\n    \n    return randomString;\n}\n\n- (NSString *)stringByDeletingPathToDocset\n{\n    NSMutableArray *newComponents = [NSMutableArray array];\n    BOOL docsetFound = NO;\n    for(NSString *component in [self pathComponents])\n    {\n        if([component rangeOfString:@\".docset\"].location != NSNotFound)\n        {\n            docsetFound = YES;\n        }\n        if(docsetFound)\n        {\n            [newComponents addObject:component];\n        }\n    }\n    if(!docsetFound || [newComponents count] < 2)\n    {\n        return nil;\n    }\n    return [NSString pathWithComponents:newComponents];\n}\n\n- (NSString *)firstComponentSeparatedByWhitespace\n{\n    NSArray *components = [self componentsSeparatedByString:@\" \"];\n    if([components count])\n    {\n        return components[0];\n    }\n    return self;\n}\n\n- (float)distanceFromString:(NSString *)stringB\n{\n    // normalize strings\n    NSString * stringA = [NSString stringWithString: self];\n    [stringA stringByTrimmingCharactersInSet:\n     [NSCharacterSet whitespaceAndNewlineCharacterSet]];\n    [stringB stringByTrimmingCharactersInSet:\n     [NSCharacterSet whitespaceAndNewlineCharacterSet]];\n    stringA = [stringA lowercaseString];\n    stringB = [stringB lowercaseString];\n    \n    \n    // Step 1\n    int k, i, j, cost, * d, distance;\n    \n    NSUInteger n = [stringA length];\n    NSUInteger m = [stringB length];\t\n    \n    if( n++ != 0 && m++ != 0 ) {\n        \n        d = malloc( sizeof(int) * m * n );\n        \n        // Step 2\n        for( k = 0; k < n; k++)\n            d[k] = k;\n        \n        for( k = 0; k < m; k++)\n            d[ k * n ] = k;\n        \n        // Step 3 and 4\n        for( i = 1; i < n; i++ )\n            for( j = 1; j < m; j++ ) {\n                \n                // Step 5\n                if( [stringA characterAtIndex: i-1] == \n                   [stringB characterAtIndex: j-1] )\n                    cost = 0;\n                else\n                    cost = 1;\n                \n                // Step 6\n                d[ j * n + i ] = [self smallestOf: d [ (j - 1) * n + i ] + 1\n                                            andOf: d[ j * n + i - 1 ] +  1\n                                            andOf: d[ (j - 1) * n + i -1 ] + cost ];\n            }\n        \n        distance = d[ n * m - 1 ];\n        \n        free( d );\n        \n        return distance;\n    }\n    return 0.0;\n}\n\n- (float)distanceFromString:(NSString *)stringB withDummyLimit:(NSInteger)limit\n{\n    NSInteger delta = self.length-stringB.length;\n    if(delta >= limit || delta <= -limit)\n    {\n        return 99;\n    }\n    return [self distanceFromString:stringB];\n}\n\n\n// return the minimum of a, b and c\n- (int)smallestOf:(int)a andOf:(int)b andOf:(int)c\n{\n    int min = a;\n    if ( b < min )\n        min = b;\n    \n    if( c < min )\n        min = c;\n    \n    return min;\n}\n\n// Find the tag represented by the tag query string (i.e. in the case of \"t:thisIsATag\" return \"thisIsATag\")\n- (NSString *)tagFromTagQuery\n{\n    return [self substringFromDashIndex:2];\n}\n\n// Find the character before the given suffix\n- (NSString *)characterBeforeSuffix:(NSString *)suffix\n{\n    if([self length] < [suffix length])\n    {\n        return nil;\n    }\n    if([self hasSuffix:suffix])\n    {\n        if([self length] > [suffix length])\n        {\n            if(suffix.length > 1)\n            {\n                return [self substringWithDashRange:NSMakeRange(self.length-suffix.length-1, 2)];\n            }\n            return [self substringWithDashRange:NSMakeRange(self.length-suffix.length-1, 1)];\n        }\n        return @\"\";\n    }\n    return nil;\n}\n\n// Test if the strings share the same last characters\n- (BOOL)hasSameLastCharactersWithString:(NSString *)string charToCompare:(NSString *)character\n{\n    NSString *compareChar;\n    NSString *lastChar = [self substringFromDashIndex:self.length-1];\n    if([lastChar rangeOfString:character options:NSCaseInsensitiveSearch].location != 0)\n    {\n        return NO;\n    }\n    for(int i=1; i < self.length; i++)\n    {\n        if(i > string.length)\n        {\n            return YES;\n        }\n        lastChar = [self substringWithDashRange:NSMakeRange(self.length-i, 1)];\n        compareChar = [string substringWithDashRange:NSMakeRange(string.length-i, 1)];\n        if([lastChar rangeOfString:character options:NSCaseInsensitiveSearch].location == NSNotFound)\n        {\n            if([compareChar rangeOfString:character options:NSCaseInsensitiveSearch].location == 0)\n            {\n                return NO;\n            }\n            return YES;\n        }\n    }\n    return YES;\n}\n\n- (NSUInteger)countOccurrencesOfString:(NSString *)aString options:(NSStringCompareOptions)options\n{\n    NSRange range = NSMakeRange(0, 0);\n    NSUInteger count = 0;\n    do {\n        range = [self rangeOfString:aString options:options range:NSMakeRange(NSMaxRange(range), self.length-NSMaxRange(range))];\n        if(range.location != NSNotFound)\n        {\n            ++count;\n        }\n        else\n        {\n            break;\n        }\n    } while (1);\n    return count;\n}\n\n// Count the number of lines the string contains\n- (NSUInteger)countNewLines\n{\n    return [self componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]].count;\n}\n\n- (CGSize) attributedSizeWithFont:(UIFont*) font {\n    return [self attributedSizeWithFont:font maxWidth:CGFLOAT_MAX];\n}\n\n- (CGSize) attributedSizeWithFont:(UIFont*) font maxWidth:(CGFloat) width {\n    \n    NSMutableParagraphStyle* style = [[NSMutableParagraphStyle alloc] init];\n    style.lineBreakMode = NSLineBreakByWordWrapping;\n    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:self\n                                                                         attributes:@{ NSFontAttributeName:font,\n                                                                                       NSForegroundColorAttributeName:[UIColor blackColor],\n                                                                                       NSParagraphStyleAttributeName:style }];\n    \n    CGRect textRect = [attributedText boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)\n                                                   options:(NSStringDrawingUsesLineFragmentOrigin)\n                                                   context:nil];\n    CGSize size = textRect.size;\n    size.height = ceilf(size.height);\n    size.width  = ceilf(size.width);\n    \n    return size;\n}\n\n+ (NSString *)stringByFormattingDownloadProgress:(long long)downloadedBytes totalBytes:(long long)totalBytes\n{\n    double convertedTotal = totalBytes / 1024.0;\n    double convertedDownloaded = downloadedBytes / 1024.0;\n    int multiplyFactor = 0;\n    if(convertedTotal <= 0)\n    {\n        return @\"0/0 KB\";\n    }\n    \n    NSArray *tokens = @[@\"KB\",@\"MB\",@\"GB\",@\"TB\"];\n    \n    while(convertedTotal > 999.99 && multiplyFactor < tokens.count)\n    {\n        convertedTotal /= 1024;\n        multiplyFactor++;\n    }\n    \n    for(int i = 0; i < multiplyFactor; i++)\n    {\n        convertedDownloaded /= 1024;\n    }\n    return [NSString stringWithFormat:@\"%4.2f/%4.2f %@\", convertedDownloaded, convertedTotal, tokens[multiplyFactor]];\n}\n\n// Backwards Limit the number of lines that the string has\n- (NSString *)stringByBackwardsLimitingLinesTo:(NSUInteger)limit\n{\n    NSArray *lines = [self componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];\n    if([lines count] <= limit)\n    {\n        return self;\n    }\n    NSMutableArray *mLines = [NSMutableArray arrayWithArray:lines];\n    while([mLines count] > limit)\n    {\n        [mLines removeObjectAtIndex:0];\n    }\n    return [mLines componentsJoinedByString:@\"\\n\"];\n}\n\n// Limit the lines that the string has\n- (NSString *)stringByLimitingLinesTo:(NSUInteger)limit\n{\n    NSArray *lines = [self componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];\n    if([lines count] <= limit)\n    {\n        return self;\n    }\n    NSMutableArray *mLines = [NSMutableArray arrayWithArray:lines];\n    while([mLines count] > limit)\n    {\n        [mLines removeLastObject];\n    }\n    return [mLines componentsJoinedByString:@\"\\n\"];\n}\n\n- (NSString *) URLEncodedString_ch {\n    NSMutableString * output = [NSMutableString string];\n    const unsigned char * source = (const unsigned char *)[self UTF8String];\n    unsigned long sourceLen = strlen((const char *)source);\n    for (int i = 0; i < sourceLen; ++i) {\n        const unsigned char thisChar = source[i];\n        if (thisChar == ' '){\n            [output appendString:@\"+\"];\n        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||\n                   (thisChar >= 'a' && thisChar <= 'z') ||\n                   (thisChar >= 'A' && thisChar <= 'Z') ||\n                   (thisChar >= '0' && thisChar <= '9')) {\n            [output appendFormat:@\"%c\", thisChar];\n        } else {\n            [output appendFormat:@\"%%%02X\", thisChar];\n        }\n    }\n    return output;\n}\n\n- (BOOL)isPackageType\n{\n    return ([self isEqualToString:@\"Category\"] || [self isEqualToString:@\"Library\"] || [self isEqualToString:@\"Package\"] || [self isEqualToString:@\"Module\"] || [self isEqualToString:@\"File\"] || [self isEqualToString:@\"Namespace\"]);\n}\n\n- (BOOL)isClassType\n{\n    return [self isEqualToString:@\"Class\"] || [self isEqualToString:@\"Element\"] || [self isEqualToString:@\"Tag\"] || [self isEqualToString:@\"Trait\"] || [self isEqualToString:@\"Object\"];\n}\n\n- (NSString *)lastPackageComponent:(NSString *)delimiter\n{\n    NSRange argsStart = [self rangeOfString:@\"(\"];\n    if(argsStart.location != NSNotFound)\n    {\n        return [[[self substringToDashIndex:argsStart.location] lastPackageComponent:delimiter] stringByAppendingString:[self substringFromDashIndex:argsStart.location]];\n    }\n    NSArray *components = [self componentsSeparatedByString:delimiter];\n    for(NSInteger i=components.count-1; i >= 0; i--)\n    {\n        NSString *component = [components[i] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n        if(component.length)\n        {\n            if([delimiter isEqualToString:@\".\"])\n            {\n                NSInteger delta = components.count - i - 1;\n                for(NSInteger j = 0; j < delta; j++)\n                {\n                    component = [component stringByAppendingString:delimiter];\n                }\n            }\n            return component;\n        }\n    }\n    return self;\n}\n\n- (NSString *)stringByRemovingSymbols\n{\n    return [self stringByRemovingCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];\n}\n\n- (BOOL)containsAny:(NSArray *)strings\n{\n    for(NSString *string in strings)\n    {\n        if([self contains:string])\n        {\n            return YES;\n        }\n    }\n    return NO;\n}\n\n- (NSString *)lastTwoPackageComponents:(NSString *)delimiter\n{\n    NSRange argsStart = [self rangeOfString:@\"(\"];\n    if(argsStart.location != NSNotFound)\n    {\n        return [[[self substringToDashIndex:argsStart.location] lastTwoPackageComponents:delimiter] stringByAppendingString:[self substringFromDashIndex:argsStart.location]];\n    }\n    NSArray *components = [self componentsSeparatedByString:@\".\"];\n    if(components.count > 1)\n    {\n        return [NSString stringWithFormat:@\"%@%@%@\", components[components.count-2], delimiter, [components lastObject]];\n    }\n    return self;\n}\n\n- (NSString *)packageComponentsDependingOnPackage:(NSString *)package\n{\n    if(!package)\n    {\n        return self;\n    }\n    NSRange range = [self rangeOfString:package options:NSCaseInsensitiveSearch];\n    if(range.location != 0)\n    {\n        return self;\n    }\n    if(range.length+1 >= self.length)\n    {\n        return self;\n    }\n    return [self substringFromDashIndex:range.length+1];\n}\n\n- (NSString *)stringByDeletingLastPackageComponent:(NSString *)delimiter\n{\n    NSMutableArray *components = [NSMutableArray arrayWithArray:[self componentsSeparatedByString:delimiter]];\n    if(components.count <= 1)\n    {\n        return nil;\n    }\n    [components removeLastObject];\n    return [components componentsJoinedByString:delimiter];\n}\n\n+ (NSString *)commonPackageInStringArray:(NSArray *)strings delimiter:(NSString *)delimiter\n{\n    if(!strings.count)\n    {\n        return nil;\n    }\n    else\n    {\n        NSString *package = [strings lastObject];\n        if(strings.count == 1)\n        {\n            return [package stringByDeletingLastPackageComponent:delimiter];\n        }\n        for(NSString *string in strings)\n        {\n            while(package)\n            {\n                NSRange range = [string rangeOfString:package options:NSCaseInsensitiveSearch];\n                if(range.location != 0 || range.length >= string.length || ![[string substringWithDashRange:NSMakeRange(range.length, 1)] isEqualToString:delimiter])\n                {\n                    package = [package stringByDeletingLastPackageComponent:delimiter];\n                }\n                else\n                {\n                    break;\n                }\n            }\n            if(!package)\n            {\n                return nil;\n            }\n        }\n        NSString *first = strings[0];\n        NSString *last = [strings lastObject];\n        if([package rangeOfString:delimiter].location != NSNotFound && ([first rangeOfString:package options:NSCaseInsensitiveSearch].length == [first length] || [[first packageComponentsDependingOnPackage:package] rangeOfString:delimiter].location != NSNotFound) && [[last packageComponentsDependingOnPackage:package] rangeOfString:delimiter].location == NSNotFound)\n        {\n            package = [package stringByDeletingLastPackageComponent:delimiter];\n        }\n        return package;\n    }\n}\n\n- (NSString *)shortenJavaMethod\n{\n    NSRange argsStart = [self rangeOfString:@\"(\"];\n    if(argsStart.location == NSNotFound)\n    {\n        return self;\n    }\n    NSString *method = [self substringToDashIndex:argsStart.location];\n    NSString *args = [self substringFromDashIndex:argsStart.location];\n    if(args.length <= 2)\n    {\n        return self;\n    }\n    args = [args substringWithDashRange:NSMakeRange(1, args.length-2)];\n    NSInteger length = 0;\n    while(args.length != length)\n    {\n        length = args.length;\n        \n        NSRange listStart = [args rangeOfString:@\"<\"];\n        if(listStart.location == NSNotFound)\n        {\n            break;\n        }\n        NSRange listEnd = [args rangeOfString:@\">\"];\n        if(listEnd.location == NSNotFound)\n        {\n            args = [args substringToDashIndex:listStart.location];\n        }\n        else\n        {\n            if(listStart.location > listEnd.location)\n            {\n                args = [args stringByReplacingCharactersInRange:listEnd withString:@\"\"];\n            }\n            else if(args.length > listEnd.location+1)\n            {\n                args = [[args substringToDashIndex:listStart.location] stringByAppendingString:[args substringFromDashIndex:listEnd.location+1]];\n            }\n            else\n            {\n                args = [args substringToDashIndex:listStart.location];\n            }\n        }\n    }\n    args = [args stringByReplacingOccurrencesOfString:@\">\" withString:@\"\"];\n    NSString *trimmedArgs = @\"(\";\n    for(NSString *arg in [args componentsSeparatedByString:@\",\"])\n    {\n        NSString *trimmed = [arg stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n        trimmed = [trimmed lastPackageComponent:@\".\"];\n        if(trimmed.length)\n        {\n            trimmedArgs = [trimmedArgs stringByAppendingFormat:@\"%@, \", trimmed];\n        }\n    }\n    if(trimmedArgs.length >= 3)\n    {\n        trimmedArgs = [trimmedArgs substringToDashIndex:trimmedArgs.length-2];\n    }\n    return [NSString stringWithFormat:@\"%@%@)\", method, trimmedArgs];\n}\n\n- (BOOL)hasCaseInsensitivePrefix:(NSString *)prefix\n{\n    if(!prefix.length)\n    {\n        return NO;\n    }\n    return ([self rangeOfString:prefix options:NSAnchoredSearch | NSCaseInsensitiveSearch].location != NSNotFound);\n}\n\n- (BOOL)hasCaseInsensitiveSuffix:(NSString *)suffix\n{\n    if(!suffix.length)\n    {\n        return NO;\n    }\n    return ([self rangeOfString:suffix options:NSAnchoredSearch | NSCaseInsensitiveSearch | NSBackwardsSearch].location != NSNotFound);\n}\n\n- (NSString *)stringByAddingWildcardsEverywhere:(NSString *)escapeChar\n{\n    NSMutableString *mutable = [NSMutableString string];\n    [mutable appendString:@\"%\"];\n    for(NSInteger i = 0; i < self.length; i++)\n    {\n        NSString *currentChar = [self substringWithDashRange:NSMakeRange(i, 1)];\n        if([currentChar isEqualToString:escapeChar] && i+1 < self.length)\n        {\n            [mutable appendString:currentChar];\n            [mutable appendString:[self substringWithDashRange:NSMakeRange(i+1, 1)]];\n            [mutable appendString:@\"%\"];\n            ++i;\n        }\n        else\n        {\n            [mutable appendString:currentChar];\n            [mutable appendString:@\"%\"];\n        }\n    }\n    return mutable;\n}\n\n- (NSString *)formatPlural:(NSInteger)count\n{\n    if(count == 1)\n    {\n        return self;\n    }\n    return [self stringByAppendingString:@\"s\"];\n}\n\n\n- (NSUInteger)lineStartForRange:(NSRange)diveInRange \n{\n    NSUInteger lineStartIndex = 0;\n    [self getLineStart:&lineStartIndex\n                   end:NULL\n           contentsEnd:NULL\n              forRange:diveInRange];\n    return lineStartIndex;\n}\n\n- (NSRange)rangeOfWhitespaceStringAtBeginningOfLineForRange:(NSRange)range {\n    return [self rangeOfWhitespaceStringAtBeginningOfLineForRange:range\n                                                        substring:nil];\n}\n\n- (NSRange)rangeOfWhitespaceStringAtBeginningOfLineForRange:(NSRange)range substring:(NSString**)outString \n{\n    NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];\n    NSUInteger lineStart = [self lineStartForRange:range];\n    if (lineStart != NSNotFound && lineStart < self.length) {\n        unichar firstCharOfLine = [self characterAtIndex:lineStart];\n        if ([whitespace characterIsMember:firstCharOfLine]) {\n            // first char is whitespace, so let's find the full range\n            return [self rangeOfCharactersFromSet:whitespace\n                                    afterLocation:lineStart\n                                        substring:outString];\n        }\n    }\n    return NSMakeRange(NSNotFound, 0);\n}\n\n- (NSRange)rangeOfCharactersFromSet:(NSCharacterSet*)characterSet afterLocation:(NSUInteger)startLocation substring:(NSString**)outString \n{\n    NSRange searchRange = NSMakeRange(startLocation, self.length - startLocation);\n    NSRange range = [self rangeOfCharactersFromSet:characterSet\n                                           options:NSLiteralSearch\n                                             range:searchRange];\n    if (outString && range.location != NSNotFound)\n        *outString = [self substringWithDashRange:range];\n    return range;\n}\n\n-(NSRange)rangeOfCharactersFromSet:(NSCharacterSet*)aSet\n                           options:(NSStringCompareOptions)mask\n                             range:(NSRange)range {\n    NSInteger start, curr, end, step=1;\n    if (mask & NSBackwardsSearch) {\n        step = -1;\n        start = range.location + range.length - 1;\n        end = range.location-1;\n    } else {\n        start = range.location;\n        end = start + range.length;\n    }\n    if (!(mask & NSAnchoredSearch)) {\n        // find first character in set\n        for (;start != end; start += step) {\n            if ([aSet characterIsMember:[self characterAtIndex:start]]) {\n                goto found;\n            }\n        }\n        return (NSRange){NSNotFound, 0u};\n    }\n    if (![aSet characterIsMember:[self characterAtIndex:start]]) {\n        // no characters found within given range\n        return (NSRange){NSNotFound, 0u};\n    }\n    \nfound:\n    for (curr = start; curr != end; curr += step) {\n        if (![aSet characterIsMember:[self characterAtIndex:curr]]) {\n            break;\n        }\n    }\n    if (curr < start) {\n        // search was backwards\n        range.location = curr+1;\n        range.length = start - curr;\n    } else {\n        range.location = start;\n        range.length = curr - start;\n    }\n    return range;\n}\n\n- (unichar*)copyOfCharactersInRange:(NSRange)range {\n    unichar *buf = (unichar*)malloc(range.length * sizeof(unichar));\n    [self getCharacters:buf range:range];\n    return buf;\n}\n\n+ (void)dhEnumerateLinesOfCharacters:(const unichar*)characters\n                             ofLength:(NSUInteger)characterCount\n                            withBlock:(void(^)(NSRange lineRange))block {\n    NSUInteger i = 0;\n    NSRange lineRange = {0, 0};\n    while (i < characterCount) {\n        unichar ch = characters[i++];\n        //DLOG(\"characters[%lu] '%C' (%d)\", i, ch, (int)ch);\n        if (ch == '\\r') {\n            // CR\n            if (i < characterCount-1 && characters[i+1] == '\\n') {\n                // advance past LF in a CR LF sequence\n                ++i;\n            }\n        } else if (ch != '\\n' && ch != '\\x0b' && ch != '\\x0c' &&\n                   i < characterCount) {\n            // NEITHER: line feed OR vertical tab OR form feed OR not end\n            continue;\n        }\n        // if we got here, a new line just begun\n        lineRange.length = i - lineRange.location;\n        \n        // invoke block\n        block(lineRange);\n        \n        // begin new line\n        lineRange.location = i;\n    }\n}\n\n- (NSString *)substringFromDashIndex:(NSUInteger)from\n{\n    if(from >= self.length)\n    {\n        return @\"\";\n    }\n    if(from <= 0)\n    {\n        return self;\n    }\n    return [self substringFromIndex:from];\n}\n\n- (NSString *)substringToDashIndex:(NSUInteger)to\n{\n    if(to <= 0)\n    {\n        return @\"\";\n    }\n    if(to >= self.length)\n    {\n        return self;\n    }\n    return [self substringToIndex:to];\n}\n\n- (NSString *)substringWithDashRange:(NSRange)range\n{\n    if(!self.length)\n    {\n        return @\"\";\n    }\n    NSRange myRange = NSMakeRange(0, self.length);\n    NSRange intersect = NSIntersectionRange(myRange, range);\n    if(!NSEqualRanges(range, intersect))\n    {\n        NSLog(@\"substringWithRange exception:%@ - %@ for %@\", NSStringFromRange(range), NSStringFromRange(intersect), self);\n    }\n    if(intersect.length)\n    {\n        return [self substringWithRange:intersect];\n    }\n    return @\"\";\n}\n\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end\n{\n    return [self substringBetweenString:start andString:end options:NSCaseInsensitiveSearch];\n}\n\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end options:(NSStringCompareOptions)options\n{\n    NSInteger startLocation = 0;\n    NSInteger endLocation = 0;\n    return [self substringBetweenString:start andString:end startLocation:&startLocation endLocation:&endLocation options:options];\n}\n\n- (NSString *)stringByConvertingKapeliHttpURLToHttps\n{\n    NSString *newString = [self stringByConvertingKapeliHttpURLToHttpsReturningNil];\n    return (newString) ? newString : self;\n}\n\n- (NSString *)stringByConvertingKapeliHttpURLToHttpsReturningNil\n{\n    if([self contains:@\"http://kapeli.com/\"] || ([self contains:@\".kapeli.com/\"] && [self contains:@\"http://\"]))\n    {\n        NSString *https = [self stringByReplacingOccurrencesOfString:@\"http://\" withString:@\"https://\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, self.length)];\n        if([NSURL URLWithString:https])\n        {\n            return https;\n        }\n        return nil;\n    }\n    return nil;\n}\n\n- (NSString *)substringBetweenString:(NSString *)start andString:(NSString *)end startLocation:(NSInteger *)startLocation endLocation:(NSInteger *)endLocation options:(NSStringCompareOptions)options\n{\n    NSRange startRange = [self rangeOfString:start options:options|NSCaseInsensitiveSearch];\n    if(startRange.location != NSNotFound)\n    {\n        *startLocation = startRange.location;\n        if(end == nil)\n        {\n            return [self substringFromDashIndex:startRange.location+startRange.length];\n        }\n        NSRange endRange = [self rangeOfString:end options:NSCaseInsensitiveSearch range:NSMakeRange(startRange.location+startRange.length, self.length-startRange.location-startRange.length)];\n        if(endRange.location != NSNotFound)\n        {\n            *endLocation = endRange.location+endRange.length;\n            return [self substringWithDashRange:NSMakeRange(startRange.location+startRange.length, endRange.location-startRange.location-startRange.length)];\n        }\n    }\n    return nil;\n}\n\n- (NSString *)substringBeginningAtString:(NSString *)start stoppingAtTag:(NSString *)tag startLocation:(NSInteger *)startLocation endLocation:(NSInteger *)endLocation\n{\n    NSRange startRange = [self rangeOfString:start options:NSCaseInsensitiveSearch];\n    if(startRange.location != NSNotFound)\n    {\n        *startLocation = startRange.location;\n        NSString *startTag = [@\"<\" stringByAppendingString:tag];\n        NSString *endTag = [@\"</\" stringByAppendingString:tag];\n        NSRange endTagRange;\n        NSRange endTagScanRange = NSMakeRange(startRange.location+startRange.length, self.length-startRange.location-startRange.length);\n        NSInteger endTags = 0;\n        while((endTagRange = [self rangeOfString:endTag options:NSCaseInsensitiveSearch range:endTagScanRange]).location != NSNotFound)\n        {\n            endTagScanRange = NSMakeRange(endTagRange.location+endTagRange.length, self.length-endTagRange.location-endTagRange.length);\n            NSRange startTagRange;\n            NSRange startTagScanRange = NSMakeRange(startRange.location+startRange.length, endTagRange.location-startRange.location-startRange.length);\n            NSInteger startTags = 0;\n            while((startTagRange = [self rangeOfString:startTag options:NSCaseInsensitiveSearch range:startTagScanRange]).location != NSNotFound)\n            {\n                ++startTags;\n                startTagScanRange = NSMakeRange(startTagRange.location+startTagRange.length, endTagRange.location-startTagRange.location-startTagRange.length);\n                if(startTags > 10)\n                {\n                    return nil;\n                }\n            }\n            if(startTags == endTags)\n            {\n                *endLocation = endTagRange.location;\n                return [self substringWithDashRange:NSMakeRange(startRange.location+startRange.length, endTagRange.location-startRange.location-startRange.length)];\n            }\n            if(endTags > 10)\n            {\n                return nil;\n            }\n            ++endTags;\n        }\n    }\n    return nil;\n}\n\n- (NSString *)stringByClearingCharactersFromSet:(NSCharacterSet *)charSet startingAtLocation:(NSInteger)location\n{\n    NSString *string = self;\n    while(location < string.length)\n    {\n        if([[string substringWithRange:NSMakeRange(location, 1)] rangeOfCharacterFromSet:charSet].location == 0)\n        {\n            string = [string stringByReplacingCharactersInRange:NSMakeRange(location, 1) withString:@\"\"];\n        }\n        else\n        {\n            return string;\n        }\n    }\n    return string;\n}\n\n- (NSString *)substringToStringReturningNil:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string];\n    if(range.location != NSNotFound)\n    {\n        return [self substringToDashIndex:range.location];\n    }\n    return nil;\n}\n\n- (NSString *)substringFromStringReturningNil:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string];\n    if(range.location != NSNotFound)\n    {\n        return [self substringFromDashIndex:range.location+range.length];\n    }\n    return nil;\n}\n\n- (BOOL)contains:(NSString *)otherString\n{\n    return [self rangeOfString:otherString options:NSCaseInsensitiveSearch].location != NSNotFound;\n}\n\n- (NSArray *)allOccurrencesOfSubstringsBetweenString:(NSString *)from andString:(NSString *)to\n{\n    NSMutableArray *matches = [NSMutableArray array];\n    NSString *string = self;\n    while(1)\n    {\n        NSString *match = [string substringBetweenString:from andString:to options:NSLiteralSearch];\n        if(match)\n        {\n            [matches addObject:match];\n        }\n        else\n        {\n            break;\n        }\n        string = [string substringFromStringReturningNil:[NSString stringWithFormat:@\"%@%@%@\", from, match, to]];\n    }\n    return matches;\n}\n\n- (NSString *)substringToString:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string];\n    if(range.location != NSNotFound)\n    {\n        return [self substringToDashIndex:range.location];\n    }\n    return self;\n}\n\n- (NSString *)stringByIntersectingWithString:(NSString *)otherString\n{\n    for(NSInteger i = otherString.length; i > 0; i--)\n    {\n        NSString *prefix = [otherString substringWithDashRange:NSMakeRange(0, i)];\n        if([self hasSuffix:prefix])\n        {\n            return prefix;\n        }\n    }\n    return @\"\";\n}\n\n- (NSString *)stringByFormingUnionWithString:(NSString *)otherString\n{\n    NSString *intersect = [self stringByIntersectingWithString:otherString];\n    if(intersect.length)\n    {\n        return [[self substringToLastOccurrenceOfString:intersect] stringByAppendingString:otherString];\n    }\n    return [self stringByAppendingString:otherString];\n}\n\n+ (NSString *)stringWithContentsOfURLString:(NSString *)urlString\n{\n    NSURL *url = [NSURL URLWithString:urlString];\n    if(url)\n    {\n        NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:90.0f];\n        NSURLResponse *response = nil;\n        NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];\n        if(data)\n        {\n            NSString *string = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];\n            return string;\n        }\n    }\n    return nil;\n}\n\n- (NSString *)substringToLastOccurrenceOfString:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string options:NSBackwardsSearch];\n    if(range.location != NSNotFound)\n    {\n        return [self substringToDashIndex:range.location];\n    }\n    return self;\n}\n\n- (NSString *)capitalizeFirstWord\n{\n    NSString *firstWord = [self substringToString:@\" \"];\n    NSString *rest = [self substringFromStringReturningNil:@\" \"];\n    return [[[firstWord capitalizedString] stringByAppendingString:(rest) ? @\" \" : @\"\"] stringByAppendingString:(rest) ? rest : @\"\"];\n}\n\n- (NSString *)substringFromLastOccurrenceOfString:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string options:NSBackwardsSearch];\n    if(range.location != NSNotFound)\n    {\n        return [self substringFromDashIndex:range.location+range.length];\n    }\n    return self;\n}\n\n- (NSString *)substringFromLastOccurrenceOfStringReturningNil:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string options:NSBackwardsSearch];\n    if(range.location != NSNotFound)\n    {\n        return [self substringFromDashIndex:range.location+range.length];\n    }\n    return nil;\n}\n\n- (NSString *)substringFromString:(NSString *)string\n{\n    NSRange range = [self rangeOfString:string];\n    if(range.location != NSNotFound)\n    {\n        return [self substringFromDashIndex:range.location+range.length];\n    }\n    return self;\n}\n\n- (NSString *)httpDomain\n{\n    NSString *domain = [[self substringFromStringReturningNil:@\"://\"] substringToString:@\"/\"];\n    return (domain) ? domain : self;\n}\n\n- (NSArray *)rangesOfString:(NSString *)aString\n{\n    NSMutableArray *ranges = [NSMutableArray array];\n    NSRange range = [self rangeOfString:aString options:NSCaseInsensitiveSearch];\n    while(range.location != NSNotFound)\n    {\n        [ranges addObject:[NSValue valueWithRange:range]];\n        range = [self rangeOfString:aString options:NSCaseInsensitiveSearch range:NSMakeRange(range.location+range.length, self.length-range.location-range.length)];\n    }\n    return ranges;\n}\n\n- (NSString *)stringByDeletingCharactersInSet:(NSCharacterSet *)aSet removedRanges:(NSMutableArray *)removedRanges\n{\n    NSRange charRange = NSMakeRange(self.length, 0);\n    NSMutableString *mutableString = [NSMutableString stringWithString:self];\n    while((charRange = [self rangeOfCharacterFromSet:aSet options:NSBackwardsSearch range:NSMakeRange(0, charRange.location)]).location != NSNotFound)\n    {\n        if(removedRanges)\n        {\n            [removedRanges addObject:[NSValue valueWithRange:charRange]];            \n        }\n        [mutableString replaceCharactersInRange:charRange withString:@\"\"];\n    }\n    if(removedRanges && removedRanges.count > 0)\n    {\n        NSUInteger i = 0;\n        NSUInteger j = [removedRanges count] - 1;\n        while (i < j)\n        {\n            [removedRanges exchangeObjectAtIndex:i withObjectAtIndex:j];\n            i++;\n            j--;\n        }\n    }\n    return mutableString;\n}\n\n- (NSString *)stringByDeletingCharactersInSet:(NSCharacterSet *)aSet\n{\n    return [self stringByDeletingCharactersInSet:aSet removedRanges:nil];\n}\n\n- (NSString *)stringByDeletingSymbols\n{\n    return [self stringByDeletingCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];\n}\n\n- (void)enumerateLettersUsingBlock:(void (^)(NSString *letter))block\n{\n    for(NSUInteger i = 0; i < self.length; i++)\n    {\n        NSString *letter = [self substringWithRange:NSMakeRange(i, 1)];\n        block(letter);\n    }\n}\n\n- (void)reverseEnumerateLettersUsingBlock:(void (^)(NSString *letter))block\n{\n    for(NSInteger i = self.length-1; i >= 0; i--)\n    {\n        NSString *letter = [self substringWithRange:NSMakeRange(i, 1)];\n        block(letter);\n    }\n}\n\n- (NSString *)firstChar\n{\n    return [self substringToDashIndex:1];\n}\n\n- (BOOL)isLowercase\n{\n    return [[self lowercaseString] isEqualToString:self];\n}\n\n- (BOOL)isUppercase\n{\n    return [[self uppercaseString] isEqualToString:self];\n}\n\n- (BOOL)firstCharIsUppercase\n{\n    NSString *firstChar = [self firstChar];\n    return [[firstChar uppercaseString] isEqualToString:firstChar];\n}\n\n- (BOOL)firstCharIsLowercase\n{\n    NSString *firstChar = [self firstChar];\n    return [[firstChar lowercaseString] isEqualToString:firstChar];\n}\n\n- (BOOL)isCaseInsensitiveEqual:(NSString *)object\n{\n    if(!object)\n    {\n        return NO;\n    }\n    return [self caseInsensitiveCompare:object] == NSOrderedSame;\n}\n\n- (NSString *)stringByMakingFirstCharUppercase\n{\n    if(!self.length)\n    {\n        return self;\n    }\n    return [self stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:[[self substringToDashIndex:1] uppercaseString]];\n}\n\n- (NSString *)trimWhitespace\n{\n    return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];\n}\n\n- (NSString *)trimNewline\n{\n    return [self stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];\n}\n\n- (NSString *)removePrefixIfExists:(NSString *)aPrefix\n{\n    if([self hasPrefix:aPrefix])\n    {\n        return [self substringFromDashIndex:aPrefix.length];\n    }\n    return self;\n}\n\n- (NSString *)stringByReplacingPercentEscapes\n{\n    NSString *string = [self stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];\n    if(!string)\n    {\n        string = self;\n        NSDictionary *percents = @{@\"%21\": @\"!\", @\"%2A\": @\"*\", @\"%27\": @\"'\", @\"%28\": @\"(\", @\"%29\": @\")\", @\"%3B\": @\";\", @\"%3A\": @\":\", @\"%40\": @\"@\", @\"%26\": @\"&\", @\"%3D\": @\"=\", @\"%2B\": @\"+\", @\"%24\": @\"$\", @\"%2C\": @\",\", @\"%2F\": @\"/\", @\"%3F\": @\"?\", @\"%23\": @\"#\", @\"%5B\": @\"[\", @\"%5D\": @\"]\", @\"%20\": @\" \", @\"%25\": @\"%\", @\"2D\": @\"-\", @\"%22\": @\"\\\"\", @\"%5C\": @\"\\\\\"};\n        for(NSString *key in [percents allKeys])\n        {\n            string = [string stringByReplacingOccurrencesOfString:key withString:percents[key]];\n        }\n    }\n    return (string) ? string : self;\n}\n\n- (NSString *)stringByEscapingRegExSpecialCharacters\n{\n//    {}[]()^$.|*+?\n    NSString *string = [self stringByReplacingOccurrencesOfString:@\"\\\\\" withString:@\"\\\\\\\\\"];\n    for(NSString *character in @[@\"{\", @\"}\", @\"[\", @\"]\", @\"(\", @\")\", @\"^\", @\"$\", @\".\", @\"|\", @\"*\", @\"+\", @\"?\"])\n    {\n        string = [string stringByReplacingOccurrencesOfString:character withString:[@\"\\\\\" stringByAppendingString:character]];\n    }\n    return string;\n}\n\n- (NSInteger)countOfCharactersInSet:(NSCharacterSet *)set\n{\n    NSInteger count = 0;\n    NSInteger location = 0;\n    NSRange range;\n    while((range = [self rangeOfCharacterFromSet:set options:NSLiteralSearch range:NSMakeRange(location, self.length-location)]).location != NSNotFound)\n    {\n        location = range.location+1;\n        ++count;\n    }\n    return count;\n}\n\n+ (NSString *)mimeTypeForPathExtension:(NSString *)pathExtension\n{\n    if(!pathExtension || !pathExtension.length)\n    {\n        return @\"application/octet-stream\";\n    }\n    CFStringRef UTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)pathExtension, NULL);\n    CFStringRef mimeType = UTTypeCopyPreferredTagWithClass (UTI, kUTTagClassMIMEType);\n    CFRelease(UTI);\n    if (!mimeType) {\n        return @\"application/octet-stream\";\n    }\n    return (__bridge_transfer NSString *)mimeType;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSString+GTM.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface NSString (GTM)\n\n- (NSString *)stringByUnescapingFromHTML;\n+ (NSString *)unescapeString:(NSString *)string;\n- (NSString *)stringByEscapingForAsciiHTML;\n- (NSString *)gtm_stringByEscapingHTMLUsingTable:(void*)table ofSize:(NSUInteger)size escapingUnicode:(BOOL)escapeUnicode;\n- (NSString *)stringByEscapingForHTML;\n\n@end"
  },
  {
    "path": "Dash/NSString+GTM.m",
    "content": "#import \"NSString+GTM.h\"\n\ntypedef struct {\n    NSString *escapeSequence;\n    unichar uchar;\n} HTMLEscapeMap;\n\nstatic HTMLEscapeMap gAsciiHTMLEscapeMap[] = {\n\t// A.2.2. Special characters\n\t{ @\"&quot;\", 34 },\n\t{ @\"&amp;\", 38 },\n\t{ @\"&apos;\", 39 },\n\t{ @\"&lt;\", 60 },\n\t{ @\"&gt;\", 62 },\n    \n    // A.2.1. Latin-1 characters\n\t{ @\"&nbsp;\", 160 },\n\t{ @\"&iexcl;\", 161 },\n\t{ @\"&cent;\", 162 },\n\t{ @\"&pound;\", 163 },\n\t{ @\"&curren;\", 164 },\n\t{ @\"&yen;\", 165 },\n\t{ @\"&brvbar;\", 166 },\n\t{ @\"&sect;\", 167 },\n\t{ @\"&uml;\", 168 },\n\t{ @\"&copy;\", 169 },\n\t{ @\"&ordf;\", 170 },\n\t{ @\"&laquo;\", 171 },\n\t{ @\"&not;\", 172 },\n\t{ @\"&shy;\", 173 },\n\t{ @\"&reg;\", 174 },\n\t{ @\"&macr;\", 175 },\n\t{ @\"&deg;\", 176 },\n\t{ @\"&plusmn;\", 177 },\n\t{ @\"&sup2;\", 178 },\n\t{ @\"&sup3;\", 179 },\n\t{ @\"&acute;\", 180 },\n\t{ @\"&micro;\", 181 },\n\t{ @\"&para;\", 182 },\n\t{ @\"&middot;\", 183 },\n\t{ @\"&cedil;\", 184 },\n\t{ @\"&sup1;\", 185 },\n\t{ @\"&ordm;\", 186 },\n\t{ @\"&raquo;\", 187 },\n\t{ @\"&frac14;\", 188 },\n\t{ @\"&frac12;\", 189 },\n\t{ @\"&frac34;\", 190 },\n\t{ @\"&iquest;\", 191 },\n\t{ @\"&Agrave;\", 192 },\n\t{ @\"&Aacute;\", 193 },\n\t{ @\"&Acirc;\", 194 },\n\t{ @\"&Atilde;\", 195 },\n\t{ @\"&Auml;\", 196 },\n\t{ @\"&Aring;\", 197 },\n\t{ @\"&AElig;\", 198 },\n\t{ @\"&Ccedil;\", 199 },\n\t{ @\"&Egrave;\", 200 },\n\t{ @\"&Eacute;\", 201 },\n\t{ @\"&Ecirc;\", 202 },\n\t{ @\"&Euml;\", 203 },\n\t{ @\"&Igrave;\", 204 },\n\t{ @\"&Iacute;\", 205 },\n\t{ @\"&Icirc;\", 206 },\n\t{ @\"&Iuml;\", 207 },\n\t{ @\"&ETH;\", 208 },\n\t{ @\"&Ntilde;\", 209 },\n\t{ @\"&Ograve;\", 210 },\n\t{ @\"&Oacute;\", 211 },\n\t{ @\"&Ocirc;\", 212 },\n\t{ @\"&Otilde;\", 213 },\n\t{ @\"&Ouml;\", 214 },\n\t{ @\"&times;\", 215 },\n\t{ @\"&Oslash;\", 216 },\n\t{ @\"&Ugrave;\", 217 },\n\t{ @\"&Uacute;\", 218 },\n\t{ @\"&Ucirc;\", 219 },\n\t{ @\"&Uuml;\", 220 },\n\t{ @\"&Yacute;\", 221 },\n\t{ @\"&THORN;\", 222 },\n\t{ @\"&szlig;\", 223 },\n\t{ @\"&agrave;\", 224 },\n\t{ @\"&aacute;\", 225 },\n\t{ @\"&acirc;\", 226 },\n\t{ @\"&atilde;\", 227 },\n\t{ @\"&auml;\", 228 },\n\t{ @\"&aring;\", 229 },\n\t{ @\"&aelig;\", 230 },\n\t{ @\"&ccedil;\", 231 },\n\t{ @\"&egrave;\", 232 },\n\t{ @\"&eacute;\", 233 },\n\t{ @\"&ecirc;\", 234 },\n\t{ @\"&euml;\", 235 },\n\t{ @\"&igrave;\", 236 },\n\t{ @\"&iacute;\", 237 },\n\t{ @\"&icirc;\", 238 },\n\t{ @\"&iuml;\", 239 },\n\t{ @\"&eth;\", 240 },\n\t{ @\"&ntilde;\", 241 },\n\t{ @\"&ograve;\", 242 },\n\t{ @\"&oacute;\", 243 },\n\t{ @\"&ocirc;\", 244 },\n\t{ @\"&otilde;\", 245 },\n\t{ @\"&ouml;\", 246 },\n\t{ @\"&divide;\", 247 },\n\t{ @\"&oslash;\", 248 },\n\t{ @\"&ugrave;\", 249 },\n\t{ @\"&uacute;\", 250 },\n\t{ @\"&ucirc;\", 251 },\n\t{ @\"&uuml;\", 252 },\n\t{ @\"&yacute;\", 253 },\n\t{ @\"&thorn;\", 254 },\n\t{ @\"&yuml;\", 255 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&OElig;\", 338 },\n\t{ @\"&oelig;\", 339 },\n\t{ @\"&Scaron;\", 352 },\n\t{ @\"&scaron;\", 353 },\n\t{ @\"&Yuml;\", 376 },\n    \n\t// A.2.3. Symbols\n\t{ @\"&fnof;\", 402 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&circ;\", 710 },\n\t{ @\"&tilde;\", 732 },\n    \n\t// A.2.3. Symbols cont'd\n\t{ @\"&Alpha;\", 913 },\n\t{ @\"&Beta;\", 914 },\n\t{ @\"&Gamma;\", 915 },\n\t{ @\"&Delta;\", 916 },\n\t{ @\"&Epsilon;\", 917 },\n\t{ @\"&Zeta;\", 918 },\n\t{ @\"&Eta;\", 919 },\n\t{ @\"&Theta;\", 920 },\n\t{ @\"&Iota;\", 921 },\n\t{ @\"&Kappa;\", 922 },\n\t{ @\"&Lambda;\", 923 },\n\t{ @\"&Mu;\", 924 },\n\t{ @\"&Nu;\", 925 },\n\t{ @\"&Xi;\", 926 },\n\t{ @\"&Omicron;\", 927 },\n\t{ @\"&Pi;\", 928 },\n\t{ @\"&Rho;\", 929 },\n\t{ @\"&Sigma;\", 931 },\n\t{ @\"&Tau;\", 932 },\n\t{ @\"&Upsilon;\", 933 },\n\t{ @\"&Phi;\", 934 },\n\t{ @\"&Chi;\", 935 },\n\t{ @\"&Psi;\", 936 },\n\t{ @\"&Omega;\", 937 },\n\t{ @\"&alpha;\", 945 },\n\t{ @\"&beta;\", 946 },\n\t{ @\"&gamma;\", 947 },\n\t{ @\"&delta;\", 948 },\n\t{ @\"&epsilon;\", 949 },\n\t{ @\"&zeta;\", 950 },\n\t{ @\"&eta;\", 951 },\n\t{ @\"&theta;\", 952 },\n\t{ @\"&iota;\", 953 },\n\t{ @\"&kappa;\", 954 },\n\t{ @\"&lambda;\", 955 },\n\t{ @\"&mu;\", 956 },\n\t{ @\"&nu;\", 957 },\n\t{ @\"&xi;\", 958 },\n\t{ @\"&omicron;\", 959 },\n\t{ @\"&pi;\", 960 },\n\t{ @\"&rho;\", 961 },\n\t{ @\"&sigmaf;\", 962 },\n\t{ @\"&sigma;\", 963 },\n\t{ @\"&tau;\", 964 },\n\t{ @\"&upsilon;\", 965 },\n\t{ @\"&phi;\", 966 },\n\t{ @\"&chi;\", 967 },\n\t{ @\"&psi;\", 968 },\n\t{ @\"&omega;\", 969 },\n\t{ @\"&thetasym;\", 977 },\n\t{ @\"&upsih;\", 978 },\n\t{ @\"&piv;\", 982 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&ensp;\", 8194 },\n\t{ @\"&emsp;\", 8195 },\n\t{ @\"&thinsp;\", 8201 },\n\t{ @\"&zwnj;\", 8204 },\n\t{ @\"&zwj;\", 8205 },\n\t{ @\"&lrm;\", 8206 },\n\t{ @\"&rlm;\", 8207 },\n\t{ @\"&ndash;\", 8211 },\n\t{ @\"&mdash;\", 8212 },\n\t{ @\"&lsquo;\", 8216 },\n\t{ @\"&rsquo;\", 8217 },\n\t{ @\"&sbquo;\", 8218 },\n\t{ @\"&ldquo;\", 8220 },\n\t{ @\"&rdquo;\", 8221 },\n\t{ @\"&bdquo;\", 8222 },\n\t{ @\"&dagger;\", 8224 },\n\t{ @\"&Dagger;\", 8225 },\n    // A.2.3. Symbols cont'd\n\t{ @\"&bull;\", 8226 },\n\t{ @\"&hellip;\", 8230 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&permil;\", 8240 },\n    \n\t// A.2.3. Symbols cont'd\n\t{ @\"&prime;\", 8242 },\n\t{ @\"&Prime;\", 8243 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&lsaquo;\", 8249 },\n\t{ @\"&rsaquo;\", 8250 },\n    \n\t// A.2.3. Symbols cont'd\n\t{ @\"&oline;\", 8254 },\n\t{ @\"&frasl;\", 8260 },\n    \n\t// A.2.2. Special characters cont'd\n\t{ @\"&euro;\", 8364 },\n    \n\t// A.2.3. Symbols cont'd\n\t{ @\"&image;\", 8465 },\n\t{ @\"&weierp;\", 8472 },\n\t{ @\"&real;\", 8476 },\n\t{ @\"&trade;\", 8482 },\n\t{ @\"&alefsym;\", 8501 },\n\t{ @\"&larr;\", 8592 },\n\t{ @\"&uarr;\", 8593 },\n\t{ @\"&rarr;\", 8594 },\n\t{ @\"&darr;\", 8595 },\n\t{ @\"&harr;\", 8596 },\n\t{ @\"&crarr;\", 8629 },\n\t{ @\"&lArr;\", 8656 },\n\t{ @\"&uArr;\", 8657 },\n\t{ @\"&rArr;\", 8658 },\n\t{ @\"&dArr;\", 8659 },\n\t{ @\"&hArr;\", 8660 },\n\t{ @\"&forall;\", 8704 },\n\t{ @\"&part;\", 8706 },\n\t{ @\"&exist;\", 8707 },\n\t{ @\"&empty;\", 8709 },\n\t{ @\"&nabla;\", 8711 },\n\t{ @\"&isin;\", 8712 },\n\t{ @\"&notin;\", 8713 },\n\t{ @\"&ni;\", 8715 },\n\t{ @\"&prod;\", 8719 },\n\t{ @\"&sum;\", 8721 },\n\t{ @\"&minus;\", 8722 },\n\t{ @\"&lowast;\", 8727 },\n\t{ @\"&radic;\", 8730 },\n\t{ @\"&prop;\", 8733 },\n\t{ @\"&infin;\", 8734 },\n\t{ @\"&ang;\", 8736 },\n\t{ @\"&and;\", 8743 },\n\t{ @\"&or;\", 8744 },\n\t{ @\"&cap;\", 8745 },\n\t{ @\"&cup;\", 8746 },\n\t{ @\"&int;\", 8747 },\n\t{ @\"&there4;\", 8756 },\n\t{ @\"&sim;\", 8764 },\n\t{ @\"&cong;\", 8773 },\n\t{ @\"&asymp;\", 8776 },\n\t{ @\"&ne;\", 8800 },\n\t{ @\"&equiv;\", 8801 },\n\t{ @\"&le;\", 8804 },\n\t{ @\"&ge;\", 8805 },\n\t{ @\"&sub;\", 8834 },\n\t{ @\"&sup;\", 8835 },\n\t{ @\"&nsub;\", 8836 },\n\t{ @\"&sube;\", 8838 },\n\t{ @\"&supe;\", 8839 },\n\t{ @\"&oplus;\", 8853 },\n\t{ @\"&otimes;\", 8855 },\n\t{ @\"&perp;\", 8869 },\n\t{ @\"&sdot;\", 8901 },\n\t{ @\"&lceil;\", 8968 },\n\t{ @\"&rceil;\", 8969 },\n\t{ @\"&lfloor;\", 8970 },\n\t{ @\"&rfloor;\", 8971 },\n\t{ @\"&lang;\", 9001 },\n\t{ @\"&rang;\", 9002 },\n\t{ @\"&loz;\", 9674 },\n\t{ @\"&spades;\", 9824 },\n\t{ @\"&clubs;\", 9827 },\n\t{ @\"&hearts;\", 9829 },\n\t{ @\"&diams;\", 9830 }\n};\n\n// Taken from http://www.w3.org/TR/xhtml1/dtds.html#a_dtd_Special_characters\n// This is table A.2.2 Special Characters\nstatic HTMLEscapeMap gUnicodeHTMLEscapeMap[] = {\n\t// C0 Controls and Basic Latin\n\t{ @\"&quot;\", 34 },\n\t{ @\"&amp;\", 38 },\n\t{ @\"&apos;\", 39 },\n\t{ @\"&lt;\", 60 },\n\t{ @\"&gt;\", 62 },\n    \n\t// Latin Extended-A\n\t{ @\"&OElig;\", 338 },\n\t{ @\"&oelig;\", 339 },\n\t{ @\"&Scaron;\", 352 },\n\t{ @\"&scaron;\", 353 },\n\t{ @\"&Yuml;\", 376 },\n    \n\t// Spacing Modifier Letters\n\t{ @\"&circ;\", 710 },\n\t{ @\"&tilde;\", 732 },\n    \n\t// General Punctuation\n\t{ @\"&ensp;\", 8194 },\n\t{ @\"&emsp;\", 8195 },\n\t{ @\"&thinsp;\", 8201 },\n\t{ @\"&zwnj;\", 8204 },\n\t{ @\"&zwj;\", 8205 },\n\t{ @\"&lrm;\", 8206 },\n\t{ @\"&rlm;\", 8207 },\n\t{ @\"&ndash;\", 8211 },\n\t{ @\"&mdash;\", 8212 },\n\t{ @\"&lsquo;\", 8216 },\n\t{ @\"&rsquo;\", 8217 },\n\t{ @\"&sbquo;\", 8218 },\n\t{ @\"&ldquo;\", 8220 },\n\t{ @\"&rdquo;\", 8221 },\n\t{ @\"&bdquo;\", 8222 },\n\t{ @\"&dagger;\", 8224 },\n\t{ @\"&Dagger;\", 8225 },\n\t{ @\"&permil;\", 8240 },\n\t{ @\"&lsaquo;\", 8249 },\n\t{ @\"&rsaquo;\", 8250 },\n\t{ @\"&euro;\", 8364 },\n};\n\n// Utility function for Bsearching table above\nstatic int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) {\n    const unichar *uchar = (const unichar*)ucharVoid;\n    const HTMLEscapeMap *map = (const HTMLEscapeMap*)mapVoid;\n    int val;\n    if (*uchar > map->uchar) {\n        val = 1;\n    } else if (*uchar < map->uchar) {\n        val = -1;\n    } else {\n        val = 0;\n    }\n    return val;\n}\n\n@implementation NSString (GTM)\n\n- (NSString *)gtm_stringByEscapingHTMLUsingTable:(void*)table\n                                          ofSize:(NSUInteger)size \n                                 escapingUnicode:(BOOL)escapeUnicode {  \n    NSUInteger length = [self length];\n    if (!length) {\n        return self;\n    }\n    \n    NSMutableString *finalString = [NSMutableString string];\n    NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length];\n    \n    // this block is common between GTMNSString+HTML and GTMNSString+XML but\n    // it's so short that it isn't really worth trying to share.\n    const unichar *buffer = CFStringGetCharactersPtr((CFStringRef)self);\n    if (!buffer) {\n        // We want this buffer to be autoreleased.\n        NSMutableData *data = [NSMutableData dataWithLength:length * sizeof(UniChar)];\n        if (!data) {\n            // COV_NF_START  - Memory fail case\n            return nil;\n            // COV_NF_END\n        }\n        [self getCharacters:[data mutableBytes]];\n        buffer = [data bytes];\n    }\n    \n    if (!buffer || !data2) {\n        // COV_NF_START\n        return nil;\n        // COV_NF_END\n    }\n    \n    unichar *buffer2 = (unichar *)[data2 mutableBytes];\n    \n    NSUInteger buffer2Length = 0;\n    \n    for (NSUInteger i = 0; i < length; ++i) {\n        HTMLEscapeMap *val = bsearch(&buffer[i], table, \n                                     size / sizeof(HTMLEscapeMap), \n                                     sizeof(HTMLEscapeMap), EscapeMapCompare);\n        if (val || (escapeUnicode && buffer[i] > 127)) {\n            if (buffer2Length) {\n                CFStringAppendCharacters((CFMutableStringRef)finalString, \n                                         buffer2, \n                                         buffer2Length);\n                buffer2Length = 0;\n            }\n            if (val) {\n                [finalString appendString:val->escapeSequence];\n            }\n            else {\n                [finalString appendFormat:@\"&#%d;\", buffer[i]];\n            }\n        } else {\n            buffer2[buffer2Length] = buffer[i];\n            buffer2Length += 1;\n        }\n    }\n    if (buffer2Length) {\n        CFStringAppendCharacters((CFMutableStringRef)finalString, \n                                 buffer2, \n                                 buffer2Length);\n    }\n    return finalString;\n}\n\n- (NSString *)stringByEscapingForHTML {\n    return [self gtm_stringByEscapingHTMLUsingTable:gUnicodeHTMLEscapeMap \n                                             ofSize:sizeof(gUnicodeHTMLEscapeMap) \n                                    escapingUnicode:NO];\n} // gtm_stringByEscapingHTML\n\n- (NSString *)stringByEscapingForAsciiHTML {\n    return [self gtm_stringByEscapingHTMLUsingTable:gAsciiHTMLEscapeMap \n                                             ofSize:sizeof(gAsciiHTMLEscapeMap) \n                                    escapingUnicode:YES];\n} // gtm_stringByEscapingAsciiHTML\n\n// Taken from http://google-toolbox-for-mac.googlecode.com/svn/trunk/Foundation/GTMNSString+HTML.m\n// Escape the HTML from the string\n- (NSString *)stringByUnescapingFromHTML\n{\n    return [NSString unescapeString:self];\n}\n\n+ (NSString *)unescapeString:(NSString *)string\n{\n\tNSRange range = NSMakeRange(0, [string length]);\n\tNSRange subrange = [string rangeOfString:@\"&\" options:NSBackwardsSearch range:range];\n    \n\t// if no ampersands, we've got a quick way out\n\tif (subrange.length == 0) return string;\n\tNSMutableString *finalString = [NSMutableString stringWithString:string];\n\tdo {\n\t\tNSRange semiColonRange = NSMakeRange(subrange.location, NSMaxRange(range) - subrange.location);\n\t\tsemiColonRange = [string rangeOfString:@\";\" options:0 range:semiColonRange];\n\t\trange = NSMakeRange(0, subrange.location);\n\t\t// if we don't find a semicolon in the range, we don't have a sequence\n\t\tif (semiColonRange.location == NSNotFound) {\n\t\t\tcontinue;\n\t\t}\n\t\tNSRange escapeRange = NSMakeRange(subrange.location, semiColonRange.location - subrange.location + 1);\n\t\tNSString *escapeString = [string substringWithDashRange:escapeRange];\n\t\tNSUInteger length = [escapeString length];\n\t\t// a squence must be longer than 3 (&lt;) and less than 11 (&thetasym;)\n\t\tif (length > 3 && length < 11) {\n\t\t\tif ([escapeString characterAtIndex:1] == '#') {\n\t\t\t\tunichar char2 = [escapeString characterAtIndex:2];\n\t\t\t\tif (char2 == 'x' || char2 == 'X') {\n\t\t\t\t\t// Hex escape squences &#xa3;\n\t\t\t\t\tNSString *hexSequence = [escapeString substringWithDashRange:NSMakeRange(3, length - 4)];\n\t\t\t\t\tNSScanner *scanner = [NSScanner scannerWithString:hexSequence];\n\t\t\t\t\tunsigned value;\n\t\t\t\t\tif ([scanner scanHexInt:&value] && \n\t\t\t\t\t\tvalue < USHRT_MAX &&\n\t\t\t\t\t\tvalue > 0 \n\t\t\t\t\t\t&& [scanner scanLocation] == length - 4) {\n\t\t\t\t\t\tunichar uchar = value;\n\t\t\t\t\t\tNSString *charString = [NSString stringWithCharacters:&uchar length:1];\n\t\t\t\t\t\t[finalString replaceCharactersInRange:escapeRange withString:charString];\n\t\t\t\t\t}\n                    \n\t\t\t\t} else {\n\t\t\t\t\t// Decimal Sequences &#123;\n\t\t\t\t\tNSString *numberSequence = [escapeString substringWithDashRange:NSMakeRange(2, length - 3)];\n\t\t\t\t\tNSScanner *scanner = [NSScanner scannerWithString:numberSequence];\n\t\t\t\t\tint value;\n\t\t\t\t\tif ([scanner scanInt:&value] && \n\t\t\t\t\t\tvalue < USHRT_MAX &&\n\t\t\t\t\t\tvalue > 0 \n\t\t\t\t\t\t&& [scanner scanLocation] == length - 3) {\n\t\t\t\t\t\tunichar uchar = value;\n\t\t\t\t\t\tNSString *charString = [NSString stringWithCharacters:&uchar length:1];\n\t\t\t\t\t\t[finalString replaceCharactersInRange:escapeRange withString:charString];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// \"standard\" sequences\n\t\t\t\tfor (unsigned i = 0; i < sizeof(gAsciiHTMLEscapeMap) / sizeof(HTMLEscapeMap); ++i) {\n\t\t\t\t\tif ([escapeString isEqualToString:gAsciiHTMLEscapeMap[i].escapeSequence]) {\n\t\t\t\t\t\t[finalString replaceCharactersInRange:escapeRange withString:[NSString stringWithCharacters:&gAsciiHTMLEscapeMap[i].uchar length:1]];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} while ((subrange = [string rangeOfString:@\"&\" options:NSBackwardsSearch range:range]).length != 0);\n\treturn finalString;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSTimer+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSTimer (DHUtils)\n\n- (id)invalidateTimer;\n\n@end\n"
  },
  {
    "path": "Dash/NSTimer+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSTimer+DHUtils.h\"\n\n@implementation NSTimer (DHUtils)\n\n- (id)invalidateTimer\n{\n    if([self isValid])\n    {\n        [self invalidate];\n    }\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Dash/NSURL+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSURL (DHUtils)\n\n+ (BOOL)URLIsFound:(NSString *)urlString timeoutInterval:(NSTimeInterval)timeout checkForRedirect:(BOOL)checkForRedirect;\n\n@end\n"
  },
  {
    "path": "Dash/NSURL+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"NSURL+DHUtils.h\"\n\n@implementation NSURL (DHUtils)\n\n+ (BOOL)URLIsFound:(NSString *)urlString timeoutInterval:(NSTimeInterval)timeout checkForRedirect:(BOOL)checkForRedirect\n{\n    NSURL *url = [NSURL URLWithString:urlString];\n    if(url)\n    {\n        NSMutableURLRequest *httpRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:timeout];\n        [httpRequest setHTTPMethod:@\"HEAD\"];\n        NSHTTPURLResponse *response = nil;\n        [NSURLConnection sendSynchronousRequest:httpRequest returningResponse:&response error:nil];\n        if(!response || ![response isKindOfClass:[NSHTTPURLResponse class]])\n        {\n            return NO;\n        }\n        if([response statusCode] != 200)\n        {\n            return NO;\n        }\n        if(checkForRedirect && ![[response URL] isEqual:url])\n        {\n            return NO;\n        }\n    }\n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "Dash/Settings.bundle/Cocoa_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>AutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>AutoCoding</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>Copyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DTBonjour</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>The MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DZNEmptyDataSet</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>GZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>GZIP</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>Copyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>KissXML</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>The MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT License</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>MRProgress</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>README\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>Copyright (C) 2011 by Random Ideas, LLC</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>NSTimer-Blocks</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>Copyright (c) 2011, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Reachability</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>Copyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SAMKeychain</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIActionSheet+Blocks</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIAlertView+Blocks</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 - https://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": "Dash/Settings.bundle/License.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>Copyright (C) 2016  Kapeli\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>License</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>License</string>\n\t<key>Title</key>\n\t<string>License</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash/Settings.bundle/Other_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>Copyright (c) 2003-2009 &lt;author(s)&gt;\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer\n   in this position and unchanged.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS&apos;&apos; AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>libarchive</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>Copyright (c) 2008-2014 Flying Meat Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the &quot;Software&quot;), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>FMDB</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>Copyright 2006-2008 Google Inc.\n\nLicensed under the Apache License, Version 2.0 (the &quot;License&quot;); you may not\nuse this file except in compliance with the License.  You may obtain a copy\nof the License at\n\nhttp://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 &quot;AS IS&quot; BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the\nLicense for the specific language governing permissions and limitations under\nthe License.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>GTMNSString-HTML</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>The MIT License (MIT)\n\nCopyright (c) 2016 Drifty (http://drifty.com/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the &quot;Software&quot;), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Ionicons</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": "Dash/Settings.bundle/Root.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>StringsTable</key>\n\t<string>Root</string>\n\t<key>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSChildPaneSpecifier</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>License</string>\n\t\t\t<key>File</key>\n\t\t\t<string>License</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSChildPaneSpecifier</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Cocoa Pods Acknowledgements</string>\n\t\t\t<key>File</key>\n\t\t\t<string>Cocoa_Pods_Acknowledgements</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSChildPaneSpecifier</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Other Acknowledgements</string>\n\t\t\t<key>File</key>\n\t\t\t<string>Other_Acknowledgements</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash/UIButton+DHUtils.h",
    "content": "#import <UIKit/UIKit.h>\n\n@interface UIButton (DHUtils)\n\n@property(nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;\n\n@end\n"
  },
  {
    "path": "Dash/UIButton+DHUtils.m",
    "content": "// from http://stackoverflow.com/a/13067285/1270034\n\n#import \"UIButton+DHUtils.h\"\n\n#import <objc/runtime.h>\n\n@implementation UIButton (DHUtils)\n\n@dynamic hitTestEdgeInsets;\n\nstatic const NSString *KEY_HIT_TEST_EDGE_INSETS = @\"HitTestEdgeInsets\";\n\n-(void)setHitTestEdgeInsets:(UIEdgeInsets)hitTestEdgeInsets {\n    NSValue *value = [NSValue value:&hitTestEdgeInsets withObjCType:@encode(UIEdgeInsets)];\n    objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n-(UIEdgeInsets)hitTestEdgeInsets {\n    NSValue *value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS);\n    if(value) {\n        UIEdgeInsets edgeInsets; [value getValue:&edgeInsets]; return edgeInsets;\n    }else {\n        return UIEdgeInsetsZero;\n    }\n}\n\n- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {\n    if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || !self.enabled || self.hidden) {\n        return [super pointInside:point withEvent:event];\n    }\n    \n    CGRect relativeFrame = self.bounds;\n    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);\n    \n    return CGRectContainsPoint(hitFrame, point);\n}\n\n@end\n"
  },
  {
    "path": "Dash/UITableView+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UITableView (DHUtils)\n\n- (void)selectRowsInIndexSet:(NSIndexSet *)indexSet inSection:(NSInteger)section animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;\n- (void)deselectAll:(BOOL)animated;\n\n@end\n"
  },
  {
    "path": "Dash/UITableView+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"UITableView+DHUtils.h\"\n\n@implementation UITableView (DHUtils)\n\n- (void)selectRowsInIndexSet:(NSIndexSet *)indexSet inSection:(NSInteger)section animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition\n{\n    [indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {\n        [self selectRowAtIndexPath:[NSIndexPath indexPathForRow:idx inSection:section] animated:animated scrollPosition:scrollPosition];\n    }];\n}\n\n- (void)deselectAll:(BOOL)animated\n{\n    for(NSIndexPath *indexPath in [self indexPathsForSelectedRows])\n    {\n        [self deselectRowAtIndexPath:indexPath animated:animated];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Dash/UIView+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UIView (DHUtils)\n\n- (void)increaseFrameByX:(CGFloat)x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height;\n\n@end\n\nCGRect CGIncreaseRect(CGRect rect, CGFloat x, CGFloat y, CGFloat width, CGFloat height);\nCGPoint CGIncreasePoint(CGPoint point, CGFloat x, CGFloat y);\nCGSize CGIncreaseSize(CGSize size, CGFloat width, CGFloat height);\n"
  },
  {
    "path": "Dash/UIView+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"UIView+DHUtils.h\"\n\n@implementation UIView (DHUtils)\n\n- (void)increaseFrameByX:(CGFloat)x y:(CGFloat)y width:(CGFloat)width height:(CGFloat)height\n{\n    CGRect currentRect = self.frame;\n    [self setFrame:CGIncreaseRect(currentRect, x, y, width, height)];\n}\n\n@end\n\nCGRect CGIncreaseRect(CGRect rect, CGFloat x, CGFloat y, CGFloat width, CGFloat height) {\n    return CGRectMake(rect.origin.x+x, rect.origin.y+y, rect.size.width+width, rect.size.height+height);\n}\n\nCGPoint CGIncreasePoint(CGPoint point, CGFloat x, CGFloat y) {\n    return CGPointMake(point.x+x, point.y+y);\n}\n\nCGSize CGIncreaseSize(CGSize size, CGFloat width, CGFloat height) {\n    return CGSizeMake(size.width+width, size.height+height);\n}"
  },
  {
    "path": "Dash/UIViewController+DHUtils.h",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UIViewController (DHUtils)\n\n- (BOOL)isActive;\n\n@end\n"
  },
  {
    "path": "Dash/UIViewController+DHUtils.m",
    "content": "//\n//  Copyright (C) 2016  Kapeli\n//\n//  This program is free software: you can redistribute it and/or modify\n//  it under the terms of the GNU General Public License as published by\n//  the Free Software Foundation, either version 3 of the License, or\n//  (at your option) any later version.\n//\n//  This program is distributed in the hope that it will be useful,\n//  but WITHOUT ANY WARRANTY; without even the implied warranty of\n//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n//  GNU General Public License for more details.\n//\n//  You should have received a copy of the GNU General Public License\n//  along with this program.  If not, see <http://www.gnu.org/licenses/>.\n//\n\n#import \"UIViewController+DHUtils.h\"\n\n@implementation UIViewController (DHUtils)\n\n- (BOOL)isActive\n{\n    return self.navigationController.visibleViewController == self;\n}\n\n@end\n"
  },
  {
    "path": "Dash/apple.js",
    "content": "var languages = document.getElementsByClassName(\"languages-list-item\");\nfor(var i = 0; i < languages.length; i++)\n{\n    var language = languages[i];\n    var links = language.getElementsByTagName(\"a\");\n    if(links.length && language.className.indexOf(\"current-language\") == -1)\n    {\n        var link = links[0];\n        link.onclick = function() { window.dash.newSwitchAppleLanguage(link.innerText); };\n    }\n}\n"
  },
  {
    "path": "Dash/archive.h",
    "content": "/*-\n * Copyright (c) 2003-2007 Tim Kientzle\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * $FreeBSD: src/lib/libarchive/archive.h.in,v 1.50 2008/05/26 17:00:22 kientzle Exp $\n */\n\n#ifndef tk_archive_H_INCLUDED\n#define\ttk_archive_H_INCLUDED\n\n/*\n * Note: archive.h is for use outside of libarchive; the configuration\n * headers (config.h, tk_archive_platform.h, etc.) are purely internal.\n * Do NOT use HAVE_XXX configuration macros to control the behavior of\n * this header!  If you must conditionalize, use predefined compiler and/or\n * platform macros.\n */\n#if defined(__BORLANDC__) && __BORLANDC__ >= 0x560\n# define __LA_STDINT_H <stdint.h>\n#elif !defined(__WATCOMC__) && !defined(_MSC_VER) && !defined(__INTERIX) && !defined(__BORLANDC__)\n# define __LA_STDINT_H <inttypes.h>\n#endif\n\n#include <sys/stat.h>\n#include <sys/types.h>  /* Linux requires this for off_t */\n#ifdef __LA_STDINT_H\n# include __LA_STDINT_H /* int64_t, etc. */\n#endif\n#include <stdio.h> /* For FILE * */\n\n/* Get appropriate definitions of standard POSIX-style types. */\n/* These should match the types used in 'struct stat' */\n#if defined(_WIN32) && !defined(__CYGWIN__)\n#define\t__LA_INT64_T\t__int64\n# if defined(_SSIZE_T_DEFINED)\n#  define\t__LA_SSIZE_T\tssize_t\n# elif defined(_WIN64)\n#  define\t__LA_SSIZE_T\t__int64\n# else\n#  define\t__LA_SSIZE_T\tlong\n# endif\n# if defined(__BORLANDC__)\n#  define\t__LA_UID_T\tuid_t\n#  define\t__LA_GID_T\tgid_t\n# else\n#  define\t__LA_UID_T\tshort\n#  define\t__LA_GID_T\tshort\n# endif\n#else\n#include <unistd.h>  /* ssize_t, uid_t, and gid_t */\n#define\t__LA_INT64_T\tint64_t\n#define\t__LA_SSIZE_T\tssize_t\n#define\t__LA_UID_T\tuid_t\n#define\t__LA_GID_T\tgid_t\n#endif\n\n/*\n * On Windows, define LIBtk_archive_STATIC if you're building or using a\n * .lib.  The default here assumes you're building a DLL.  Only\n * libarchive source should ever define __LIBtk_archive_BUILD.\n */\n#if ((defined __WIN32__) || (defined _WIN32) || defined(__CYGWIN__)) && (!defined LIBtk_archive_STATIC)\n# ifdef __LIBtk_archive_BUILD\n#  ifdef __GNUC__\n#   define __LA_DECL\t__attribute__((dllexport)) extern\n#  else\n#   define __LA_DECL\t__declspec(dllexport)\n#  endif\n# else\n#  ifdef __GNUC__\n#   define __LA_DECL\t__attribute__((dllimport)) extern\n#  else\n#   define __LA_DECL\t__declspec(dllimport)\n#  endif\n# endif\n#else\n/* Static libraries or non-Windows needs no special declaration. */\n# define __LA_DECL\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * The version number is provided as both a macro and a function.\n * The macro identifies the installed header; the function identifies\n * the library version (which may not be the same if you're using a\n * dynamically-linked version of the library).  Of course, if the\n * header and library are very different, you should expect some\n * strangeness.  Don't do that.\n */\n\n/*\n * The version number is expressed as a single integer that makes it\n * easy to compare versions at build time: for version a.b.c, the\n * version number is printf(\"%d%03d%03d\",a,b,c).  For example, if you\n * know your application requires version 2.12.108 or later, you can\n * assert that tk_archive_VERSION >= 2012108.\n *\n * This single-number format was introduced with libarchive 1.9.0 in\n * the libarchive 1.x family and libarchive 2.2.4 in the libarchive\n * 2.x family.  The following may be useful if you really want to do\n * feature detection for earlier libarchive versions (which defined\n * tk_archive_API_VERSION and tk_archive_API_FEATURE instead):\n *\n * #ifndef tk_archive_VERSION_NUMBER\n * #define tk_archive_VERSION_NUMBER\t\\\n *             (tk_archive_API_VERSION * 1000000 + tk_archive_API_FEATURE * 1000)\n * #endif\n */\n#define\ttk_archive_VERSION_NUMBER 2008004\n__LA_DECL int\t\ttk_archive_version_number(void);\n\n/*\n * Textual name/version of the library, useful for version displays.\n */\n#define\ttk_archive_VERSION_STRING \"libarchive 2.8.4\"\n__LA_DECL const char *\ttk_archive_version_string(void);\n\n#if tk_archive_VERSION_NUMBER < 3000000\n/*\n * Deprecated; these are older names that will be removed in favor of\n * the simpler definitions above.\n */\n#define\ttk_archive_VERSION_STAMP\ttk_archive_VERSION_NUMBER\n__LA_DECL int\t\ttk_archive_version_stamp(void);\n#define\ttk_archive_LIBRARY_VERSION\ttk_archive_VERSION_STRING\n__LA_DECL const char *\ttk_archive_version(void);\n#define\ttk_archive_API_VERSION\t(tk_archive_VERSION_NUMBER / 1000000)\n__LA_DECL int\t\ttk_archive_api_version(void);\n#define\ttk_archive_API_FEATURE\t((tk_archive_VERSION_NUMBER / 1000) % 1000)\n__LA_DECL int\t\ttk_archive_api_feature(void);\n#endif\n\n#if tk_archive_VERSION_NUMBER < 3000000\n/* This should never have been here in the first place. */\n/* Legacy of old tar assumptions, will be removed in libarchive 3.0. */\n#define\ttk_archive_BYTES_PER_RECORD\t  512\n#define\ttk_archive_DEFAULT_BYTES_PER_BLOCK\t10240\n#endif\n\n/* Declare our basic types. */\nstruct archive;\nstruct tk_archive_entry;\n\n/*\n * Error codes: Use tk_archive_errno() and tk_archive_error_string()\n * to retrieve details.  Unless specified otherwise, all functions\n * that return 'int' use these codes.\n */\n#define\ttk_archive_EOF\t  1\t/* Found end of archive. */\n#define\ttk_archive_OK\t  0\t/* Operation was successful. */\n#define\ttk_archive_RETRY\t(-10)\t/* Retry might succeed. */\n#define\ttk_archive_WARN\t(-20)\t/* Partial success. */\n/* For example, if write_header \"fails\", then you can't push data. */\n#define\ttk_archive_FAILED\t(-25)\t/* Current operation cannot complete. */\n/* But if write_header is \"fatal,\" then this archive is dead and useless. */\n#define\ttk_archive_FATAL\t(-30)\t/* No more operations are possible. */\n\n/*\n * As far as possible, tk_archive_errno returns standard platform errno codes.\n * Of course, the details vary by platform, so the actual definitions\n * here are stored in \"tk_archive_platform.h\".  The symbols are listed here\n * for reference; as a rule, clients should not need to know the exact\n * platform-dependent error code.\n */\n/* Unrecognized or invalid file format. */\n/* #define\ttk_archive_ERRNO_FILE_FORMAT */\n/* Illegal usage of the library. */\n/* #define\ttk_archive_ERRNO_PROGRAMMER_ERROR */\n/* Unknown or unclassified error. */\n/* #define\ttk_archive_ERRNO_MISC */\n\n/*\n * Callbacks are invoked to automatically read/skip/write/open/close the\n * archive. You can provide your own for complex tasks (like breaking\n * archives across multiple tapes) or use standard ones built into the\n * library.\n */\n\n/* Returns pointer and size of next block of data from archive. */\ntypedef __LA_SSIZE_T\ttk_archive_read_callback(struct archive *,\n\t\t\t    void *_client_data, const void **_buffer);\n\n/* Skips at most request bytes from archive and returns the skipped amount */\n#if tk_archive_VERSION_NUMBER < 2000000\n/* Libarchive 1.0 used ssize_t for the return, which is only 32 bits\n * on most 32-bit platforms; not large enough. */\ntypedef __LA_SSIZE_T\ttk_archive_skip_callback(struct archive *,\n\t\t\t    void *_client_data, size_t request);\n#elif tk_archive_VERSION_NUMBER < 3000000\n/* Libarchive 2.0 used off_t here, but that is a bad idea on Linux and a\n * few other platforms where off_t varies with build settings. */\ntypedef off_t\t\ttk_archive_skip_callback(struct archive *,\n\t\t\t    void *_client_data, off_t request);\n#else\n/* Libarchive 3.0 uses int64_t here, which is actually guaranteed to be\n * 64 bits on every platform. */\ntypedef __LA_INT64_T\ttk_archive_skip_callback(struct archive *,\n\t\t\t    void *_client_data, __LA_INT64_T request);\n#endif\n\n/* Returns size actually written, zero on EOF, -1 on error. */\ntypedef __LA_SSIZE_T\ttk_archive_write_callback(struct archive *,\n\t\t\t    void *_client_data,\n\t\t\t    const void *_buffer, size_t _length);\n\n#if tk_archive_VERSION_NUMBER < 3000000\n/* Open callback is actually never needed; remove it in libarchive 3.0. */\ntypedef int\ttk_archive_open_callback(struct archive *, void *_client_data);\n#endif\n\ntypedef int\ttk_archive_close_callback(struct archive *, void *_client_data);\n\n/*\n * Codes for tk_archive_compression.\n */\n#define\ttk_archive_COMPRESSION_NONE\t0\n#define\ttk_archive_COMPRESSION_GZIP\t1\n#define\ttk_archive_COMPRESSION_BZIP2\t2\n#define\ttk_archive_COMPRESSION_COMPRESS\t3\n#define\ttk_archive_COMPRESSION_PROGRAM\t4\n#define\ttk_archive_COMPRESSION_LZMA\t5\n#define\ttk_archive_COMPRESSION_XZ\t\t6\n#define\ttk_archive_COMPRESSION_UU\t\t7\n#define\ttk_archive_COMPRESSION_RPM\t\t8\n\n/*\n * Codes returned by tk_archive_format.\n *\n * Top 16 bits identifies the format family (e.g., \"tar\"); lower\n * 16 bits indicate the variant.  This is updated by read_next_header.\n * Note that the lower 16 bits will often vary from entry to entry.\n * In some cases, this variation occurs as libarchive learns more about\n * the archive (for example, later entries might utilize extensions that\n * weren't necessary earlier in the archive; in this case, libarchive\n * will change the format code to indicate the extended format that\n * was used).  In other cases, it's because different tools have\n * modified the archive and so different parts of the archive\n * actually have slightly different formts.  (Both tar and cpio store\n * format codes in each entry, so it is quite possible for each\n * entry to be in a different format.)\n */\n#define\ttk_archive_FORMAT_BASE_MASK\t\t0xff0000\n#define\ttk_archive_FORMAT_CPIO\t\t\t0x10000\n#define\ttk_archive_FORMAT_CPIO_POSIX\t\t(tk_archive_FORMAT_CPIO | 1)\n#define\ttk_archive_FORMAT_CPIO_BIN_LE\t\t(tk_archive_FORMAT_CPIO | 2)\n#define\ttk_archive_FORMAT_CPIO_BIN_BE\t\t(tk_archive_FORMAT_CPIO | 3)\n#define\ttk_archive_FORMAT_CPIO_SVR4_NOCRC\t\t(tk_archive_FORMAT_CPIO | 4)\n#define\ttk_archive_FORMAT_CPIO_SVR4_CRC\t\t(tk_archive_FORMAT_CPIO | 5)\n#define\ttk_archive_FORMAT_SHAR\t\t\t0x20000\n#define\ttk_archive_FORMAT_SHAR_BASE\t\t(tk_archive_FORMAT_SHAR | 1)\n#define\ttk_archive_FORMAT_SHAR_DUMP\t\t(tk_archive_FORMAT_SHAR | 2)\n#define\ttk_archive_FORMAT_TAR\t\t\t0x30000\n#define\ttk_archive_FORMAT_TAR_USTAR\t\t(tk_archive_FORMAT_TAR | 1)\n#define\ttk_archive_FORMAT_TAR_PAX_INTERCHANGE\t(tk_archive_FORMAT_TAR | 2)\n#define\ttk_archive_FORMAT_TAR_PAX_RESTRICTED\t(tk_archive_FORMAT_TAR | 3)\n#define\ttk_archive_FORMAT_TAR_GNUTAR\t\t(tk_archive_FORMAT_TAR | 4)\n#define\ttk_archive_FORMAT_ISO9660\t\t\t0x40000\n#define\ttk_archive_FORMAT_ISO9660_ROCKRIDGE\t(tk_archive_FORMAT_ISO9660 | 1)\n#define\ttk_archive_FORMAT_ZIP\t\t\t0x50000\n#define\ttk_archive_FORMAT_EMPTY\t\t\t0x60000\n#define\ttk_archive_FORMAT_AR\t\t\t0x70000\n#define\ttk_archive_FORMAT_AR_GNU\t\t\t(tk_archive_FORMAT_AR | 1)\n#define\ttk_archive_FORMAT_AR_BSD\t\t\t(tk_archive_FORMAT_AR | 2)\n#define\ttk_archive_FORMAT_MTREE\t\t\t0x80000\n#define\ttk_archive_FORMAT_RAW\t\t\t0x90000\n#define\ttk_archive_FORMAT_XAR\t\t\t0xA0000\n\n/*-\n * Basic outline for reading an archive:\n *   1) Ask tk_archive_read_new for an archive reader object.\n *   2) Update any global properties as appropriate.\n *      In particular, you'll certainly want to call appropriate\n *      tk_archive_read_support_XXX functions.\n *   3) Call tk_archive_read_open_XXX to open the archive\n *   4) Repeatedly call tk_archive_read_next_header to get information about\n *      successive archive entries.  Call tk_archive_read_data to extract\n *      data for entries of interest.\n *   5) Call tk_archive_read_finish to end processing.\n */\n__LA_DECL struct archive\t*tk_archive_read_new(void);\n\n/*\n * The tk_archive_read_support_XXX calls enable auto-detect for this\n * archive handle.  They also link in the necessary support code.\n * For example, if you don't want bzlib linked in, don't invoke\n * support_compression_bzip2().  The \"all\" functions provide the\n * obvious shorthand.\n */\n__LA_DECL int\t\t tk_archive_read_support_compression_all(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_bzip2(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_compress(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_gzip(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_lzma(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_none(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_program(struct archive *,\n\t\t     const char *command);\n__LA_DECL int\t\t tk_archive_read_support_compression_program_signature\n\t\t\t\t(struct archive *, const char *,\n\t\t\t\t    const void * /* match */, size_t);\n\n__LA_DECL int\t\t tk_archive_read_support_compression_rpm(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_uu(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_compression_xz(struct archive *);\n\n__LA_DECL int\t\t tk_archive_read_support_format_all(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_ar(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_cpio(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_empty(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_gnutar(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_iso9660(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_mtree(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_raw(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_tar(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_xar(struct archive *);\n__LA_DECL int\t\t tk_archive_read_support_format_zip(struct archive *);\n\n\n/* Open the archive using callbacks for archive I/O. */\n__LA_DECL int\t\t tk_archive_read_open(struct archive *, void *_client_data,\n\t\t     tk_archive_open_callback *, tk_archive_read_callback *,\n\t\t     tk_archive_close_callback *);\n__LA_DECL int\t\t tk_archive_read_open2(struct archive *, void *_client_data,\n\t\t     tk_archive_open_callback *, tk_archive_read_callback *,\n\t\t     tk_archive_skip_callback *, tk_archive_close_callback *);\n\n/*\n * A variety of shortcuts that invoke tk_archive_read_open() with\n * canned callbacks suitable for common situations.  The ones that\n * accept a block size handle tape blocking correctly.\n */\n/* Use this if you know the filename.  Note: NULL indicates stdin. */\n__LA_DECL int\t\t tk_archive_read_open_filename(struct archive *,\n\t\t     const char *_filename, size_t _block_size);\n/* tk_archive_read_open_file() is a deprecated synonym for ..._open_filename(). */\n__LA_DECL int\t\t tk_archive_read_open_file(struct archive *,\n\t\t     const char *_filename, size_t _block_size);\n/* Read an archive that's stored in memory. */\n__LA_DECL int\t\t tk_archive_read_open_memory(struct archive *,\n\t\t     void * buff, size_t size);\n/* A more involved version that is only used for internal testing. */\n__LA_DECL int\t\ttk_archive_read_open_memory2(struct archive *a, void *buff,\n\t\t     size_t size, size_t read_size);\n/* Read an archive that's already open, using the file descriptor. */\n__LA_DECL int\t\t tk_archive_read_open_fd(struct archive *, int _fd,\n\t\t     size_t _block_size);\n/* Read an archive that's already open, using a FILE *. */\n/* Note: DO NOT use this with tape drives. */\n__LA_DECL int\t\t tk_archive_read_open_FILE(struct archive *, FILE *_file);\n\n/* Parses and returns next entry header. */\n__LA_DECL int\t\t tk_archive_read_next_header(struct archive *,\n\t\t     struct tk_archive_entry **);\n\n/* Parses and returns next entry header using the tk_archive_entry passed in */\n__LA_DECL int\t\t tk_archive_read_next_header2(struct archive *,\n\t\t     struct tk_archive_entry *);\n\n/*\n * Retrieve the byte offset in UNCOMPRESSED data where last-read\n * header started.\n */\n__LA_DECL __LA_INT64_T\t\t tk_archive_read_header_position(struct archive *);\n\n/* Read data from the body of an entry.  Similar to read(2). */\n__LA_DECL __LA_SSIZE_T\t\t tk_archive_read_data(struct archive *,\n\t\t\t\t    void *, size_t);\n\n/*\n * A zero-copy version of tk_archive_read_data that also exposes the file offset\n * of each returned block.  Note that the client has no way to specify\n * the desired size of the block.  The API does guarantee that offsets will\n * be strictly increasing and that returned blocks will not overlap.\n */\n#if tk_archive_VERSION_NUMBER < 3000000\n__LA_DECL int\t\t tk_archive_read_data_block(struct archive *a,\n\t\t\t    const void **buff, size_t *size, off_t *offset);\n#else\n__LA_DECL int\t\t tk_archive_read_data_block(struct archive *a,\n\t\t\t    const void **buff, size_t *size,\n\t\t\t    __LA_INT64_T *offset);\n#endif\n\n/*-\n * Some convenience functions that are built on tk_archive_read_data:\n *  'skip': skips entire entry\n *  'into_buffer': writes data into memory buffer that you provide\n *  'into_fd': writes data to specified filedes\n */\n__LA_DECL int\t\t tk_archive_read_data_skip(struct archive *);\n__LA_DECL int\t\t tk_archive_read_data_into_buffer(struct archive *,\n\t\t\t    void *buffer, __LA_SSIZE_T len);\n__LA_DECL int\t\t tk_archive_read_data_into_fd(struct archive *, int fd);\n\n/*\n * Set read options.\n */\n/* Apply option string to the format only. */\n__LA_DECL int\t\ttk_archive_read_set_format_options(struct archive *_a,\n\t\t\t    const char *s);\n/* Apply option string to the filter only. */\n__LA_DECL int\t\ttk_archive_read_set_filter_options(struct archive *_a,\n\t\t\t    const char *s);\n/* Apply option string to both the format and the filter. */\n__LA_DECL int\t\ttk_archive_read_set_options(struct archive *_a,\n\t\t\t    const char *s);\n\n/*-\n * Convenience function to recreate the current entry (whose header\n * has just been read) on disk.\n *\n * This does quite a bit more than just copy data to disk. It also:\n *  - Creates intermediate directories as required.\n *  - Manages directory permissions:  non-writable directories will\n *    be initially created with write permission enabled; when the\n *    archive is closed, dir permissions are edited to the values specified\n *    in the archive.\n *  - Checks hardlinks:  hardlinks will not be extracted unless the\n *    linked-to file was also extracted within the same session. (TODO)\n */\n\n/* The \"flags\" argument selects optional behavior, 'OR' the flags you want. */\n\n/* Default: Do not try to set owner/group. */\n#define\ttk_archive_EXTRACT_OWNER\t\t\t(0x0001)\n/* Default: Do obey umask, do not restore SUID/SGID/SVTX bits. */\n#define\ttk_archive_EXTRACT_PERM\t\t\t(0x0002)\n/* Default: Do not restore mtime/atime. */\n#define\ttk_archive_EXTRACT_TIME\t\t\t(0x0004)\n/* Default: Replace existing files. */\n#define\ttk_archive_EXTRACT_NO_OVERWRITE \t\t(0x0008)\n/* Default: Try create first, unlink only if create fails with EEXIST. */\n#define\ttk_archive_EXTRACT_UNLINK\t\t\t(0x0010)\n/* Default: Do not restore ACLs. */\n#define\ttk_archive_EXTRACT_ACL\t\t\t(0x0020)\n/* Default: Do not restore fflags. */\n#define\ttk_archive_EXTRACT_FFLAGS\t\t\t(0x0040)\n/* Default: Do not restore xattrs. */\n#define\ttk_archive_EXTRACT_XATTR \t\t\t(0x0080)\n/* Default: Do not try to guard against extracts redirected by symlinks. */\n/* Note: With tk_archive_EXTRACT_UNLINK, will remove any intermediate symlink. */\n#define\ttk_archive_EXTRACT_SECURE_SYMLINKS\t\t(0x0100)\n/* Default: Do not reject entries with '..' as path elements. */\n#define\ttk_archive_EXTRACT_SECURE_NODOTDOT\t\t(0x0200)\n/* Default: Create parent directories as needed. */\n#define\ttk_archive_EXTRACT_NO_AUTODIR\t\t(0x0400)\n/* Default: Overwrite files, even if one on disk is newer. */\n#define\ttk_archive_EXTRACT_NO_OVERWRITE_NEWER\t(0x0800)\n/* Detect blocks of 0 and write holes instead. */\n#define\ttk_archive_EXTRACT_SPARSE\t\t\t(0x1000)\n\n__LA_DECL int\t tk_archive_read_extract(struct archive *, struct tk_archive_entry *,\n\t\t     int flags);\n__LA_DECL int\t tk_archive_read_extract2(struct archive *, struct tk_archive_entry *,\n\t\t     struct archive * /* dest */);\n__LA_DECL void\t tk_archive_read_extract_set_progress_callback(struct archive *,\n\t\t     void (*_progress_func)(void *), void *_user_data);\n\n/* Record the dev/ino of a file that will not be written.  This is\n * generally set to the dev/ino of the archive being read. */\n__LA_DECL void\t\ttk_archive_read_extract_set_skip_file(struct archive *,\n\t\t     dev_t, ino_t);\n\n/* Close the file and release most resources. */\n__LA_DECL int\t\t tk_archive_read_close(struct archive *);\n/* Release all resources and destroy the object. */\n/* Note that tk_archive_read_finish will call tk_archive_read_close for you. */\n#if tk_archive_VERSION_NUMBER < 2000000\n/* Erroneously declared to return void in libarchive 1.x */\n__LA_DECL void\t\t tk_archive_read_finish(struct archive *);\n#else\n__LA_DECL int\t\t tk_archive_read_finish(struct archive *);\n#endif\n\n/*-\n * To create an archive:\n *   1) Ask tk_archive_write_new for a archive writer object.\n *   2) Set any global properties.  In particular, you should set\n *      the compression and format to use.\n *   3) Call tk_archive_write_open to open the file (most people\n *       will use tk_archive_write_open_file or tk_archive_write_open_fd,\n *       which provide convenient canned I/O callbacks for you).\n *   4) For each entry:\n *      - construct an appropriate struct tk_archive_entry structure\n *      - tk_archive_write_header to write the header\n *      - tk_archive_write_data to write the entry data\n *   5) tk_archive_write_close to close the output\n *   6) tk_archive_write_finish to cleanup the writer and release resources\n */\n__LA_DECL struct archive\t*tk_archive_write_new(void);\n__LA_DECL int\t\t tk_archive_write_set_bytes_per_block(struct archive *,\n\t\t     int bytes_per_block);\n__LA_DECL int\t\t tk_archive_write_get_bytes_per_block(struct archive *);\n/* XXX This is badly misnamed; suggestions appreciated. XXX */\n__LA_DECL int\t\t tk_archive_write_set_bytes_in_last_block(struct archive *,\n\t\t     int bytes_in_last_block);\n__LA_DECL int\t\t tk_archive_write_get_bytes_in_last_block(struct archive *);\n\n/* The dev/ino of a file that won't be archived.  This is used\n * to avoid recursively adding an archive to itself. */\n__LA_DECL int\t\t tk_archive_write_set_skip_file(struct archive *, dev_t, ino_t);\n\n__LA_DECL int\t\t tk_archive_write_set_compression_bzip2(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_compression_compress(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_compression_gzip(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_compression_lzma(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_compression_none(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_compression_program(struct archive *,\n\t\t     const char *cmd);\n__LA_DECL int\t\t tk_archive_write_set_compression_xz(struct archive *);\n/* A convenience function to set the format based on the code or name. */\n__LA_DECL int\t\t tk_archive_write_set_format(struct archive *, int format_code);\n__LA_DECL int\t\t tk_archive_write_set_format_by_name(struct archive *,\n\t\t     const char *name);\n/* To minimize link pollution, use one or more of the following. */\n__LA_DECL int\t\t tk_archive_write_set_format_ar_bsd(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_ar_svr4(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_cpio(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_cpio_newc(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_mtree(struct archive *);\n/* TODO: int tk_archive_write_set_format_old_tar(struct archive *); */\n__LA_DECL int\t\t tk_archive_write_set_format_pax(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_pax_restricted(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_shar(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_shar_dump(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_ustar(struct archive *);\n__LA_DECL int\t\t tk_archive_write_set_format_zip(struct archive *);\n__LA_DECL int\t\t tk_archive_write_open(struct archive *, void *,\n\t\t     tk_archive_open_callback *, tk_archive_write_callback *,\n\t\t     tk_archive_close_callback *);\n__LA_DECL int\t\t tk_archive_write_open_fd(struct archive *, int _fd);\n__LA_DECL int\t\t tk_archive_write_open_filename(struct archive *, const char *_file);\n/* A deprecated synonym for tk_archive_write_open_filename() */\n__LA_DECL int\t\t tk_archive_write_open_file(struct archive *, const char *_file);\n__LA_DECL int\t\t tk_archive_write_open_FILE(struct archive *, FILE *);\n/* _buffSize is the size of the buffer, _used refers to a variable that\n * will be updated after each write into the buffer. */\n__LA_DECL int\t\t tk_archive_write_open_memory(struct archive *,\n\t\t\tvoid *_buffer, size_t _buffSize, size_t *_used);\n\n/*\n * Note that the library will truncate writes beyond the size provided\n * to tk_archive_write_header or pad if the provided data is short.\n */\n__LA_DECL int\t\t tk_archive_write_header(struct archive *,\n\t\t     struct tk_archive_entry *);\n#if tk_archive_VERSION_NUMBER < 2000000\n/* This was erroneously declared to return \"int\" in libarchive 1.x. */\n__LA_DECL int\t\t tk_archive_write_data(struct archive *,\n\t\t\t    const void *, size_t);\n#else\n/* Libarchive 2.0 and later return ssize_t here. */\n__LA_DECL __LA_SSIZE_T\t tk_archive_write_data(struct archive *,\n\t\t\t    const void *, size_t);\n#endif\n\n#if tk_archive_VERSION_NUMBER < 3000000\n/* Libarchive 1.x and 2.x use off_t for the argument, but that's not\n * stable on Linux. */\n__LA_DECL __LA_SSIZE_T\t tk_archive_write_data_block(struct archive *,\n\t\t\t\t    const void *, size_t, off_t);\n#else\n/* Libarchive 3.0 uses explicit int64_t to ensure consistent 64-bit support. */\n__LA_DECL __LA_SSIZE_T\t tk_archive_write_data_block(struct archive *,\n\t\t\t\t    const void *, size_t, __LA_INT64_T);\n#endif\n__LA_DECL int\t\t tk_archive_write_finish_entry(struct archive *);\n__LA_DECL int\t\t tk_archive_write_close(struct archive *);\n#if tk_archive_VERSION_NUMBER < 2000000\n/* Return value was incorrect in libarchive 1.x. */\n__LA_DECL void\t\t tk_archive_write_finish(struct archive *);\n#else\n/* Libarchive 2.x and later returns an error if this fails. */\n/* It can fail if the archive wasn't already closed, in which case\n * tk_archive_write_finish() will implicitly call tk_archive_write_close(). */\n__LA_DECL int\t\t tk_archive_write_finish(struct archive *);\n#endif\n\n/*\n * Set write options.\n */\n/* Apply option string to the format only. */\n__LA_DECL int\t\ttk_archive_write_set_format_options(struct archive *_a,\n\t\t\t    const char *s);\n/* Apply option string to the compressor only. */\n__LA_DECL int\t\ttk_archive_write_set_compressor_options(struct archive *_a,\n\t\t\t    const char *s);\n/* Apply option string to both the format and the compressor. */\n__LA_DECL int\t\ttk_archive_write_set_options(struct archive *_a,\n\t\t\t    const char *s);\n\n\n/*-\n * tk_archive_WRITE_DISK API\n *\n * To create objects on disk:\n *   1) Ask tk_archive_write_disk_new for a new tk_archive_write_disk object.\n *   2) Set any global properties.  In particular, you probably\n *      want to set the options.\n *   3) For each entry:\n *      - construct an appropriate struct tk_archive_entry structure\n *      - tk_archive_write_header to create the file/dir/etc on disk\n *      - tk_archive_write_data to write the entry data\n *   4) tk_archive_write_finish to cleanup the writer and release resources\n *\n * In particular, you can use this in conjunction with tk_archive_read()\n * to pull entries out of an archive and create them on disk.\n */\n__LA_DECL struct archive\t*tk_archive_write_disk_new(void);\n/* This file will not be overwritten. */\n__LA_DECL int\t\t tk_archive_write_disk_set_skip_file(struct archive *,\n\t\t     dev_t, ino_t);\n/* Set flags to control how the next item gets created.\n * This accepts a bitmask of tk_archive_EXTRACT_XXX flags defined above. */\n__LA_DECL int\t\t tk_archive_write_disk_set_options(struct archive *,\n\t\t     int flags);\n/*\n * The lookup functions are given uname/uid (or gname/gid) pairs and\n * return a uid (gid) suitable for this system.  These are used for\n * restoring ownership and for setting ACLs.  The default functions\n * are naive, they just return the uid/gid.  These are small, so reasonable\n * for applications that don't need to preserve ownership; they\n * are probably also appropriate for applications that are doing\n * same-system backup and restore.\n */\n/*\n * The \"standard\" lookup functions use common system calls to lookup\n * the uname/gname, falling back to the uid/gid if the names can't be\n * found.  They cache lookups and are reasonably fast, but can be very\n * large, so they are not used unless you ask for them.  In\n * particular, these match the specifications of POSIX \"pax\" and old\n * POSIX \"tar\".\n */\n__LA_DECL int\t tk_archive_write_disk_set_standard_lookup(struct archive *);\n/*\n * If neither the default (naive) nor the standard (big) functions suit\n * your needs, you can write your own and register them.  Be sure to\n * include a cleanup function if you have allocated private data.\n */\n__LA_DECL int\t tk_archive_write_disk_set_group_lookup(struct archive *,\n\t\t\t    void * /* private_data */,\n\t\t\t    __LA_GID_T (*)(void *, const char *, __LA_GID_T),\n\t\t\t    void (* /* cleanup */)(void *));\n__LA_DECL int\t tk_archive_write_disk_set_user_lookup(struct archive *,\n\t\t\t    void * /* private_data */,\n\t\t\t    __LA_UID_T (*)(void *, const char *, __LA_UID_T),\n\t\t\t    void (* /* cleanup */)(void *));\n\n/*\n * tk_archive_READ_DISK API\n *\n * This is still evolving and somewhat experimental.\n */\n__LA_DECL struct archive *tk_archive_read_disk_new(void);\n/* The names for symlink modes here correspond to an old BSD\n * command-line argument convention: -L, -P, -H */\n/* Follow all symlinks. */\n__LA_DECL int tk_archive_read_disk_set_symlink_logical(struct archive *);\n/* Follow no symlinks. */\n__LA_DECL int tk_archive_read_disk_set_symlink_physical(struct archive *);\n/* Follow symlink initially, then not. */\n__LA_DECL int tk_archive_read_disk_set_symlink_hybrid(struct archive *);\n/* TODO: Handle Linux stat32/stat64 ugliness. <sigh> */\n__LA_DECL int tk_archive_read_disk_entry_from_file(struct archive *,\n    struct tk_archive_entry *, int /* fd */, const struct stat *);\n/* Look up gname for gid or uname for uid. */\n/* Default implementations are very, very stupid. */\n__LA_DECL const char *tk_archive_read_disk_gname(struct archive *, __LA_GID_T);\n__LA_DECL const char *tk_archive_read_disk_uname(struct archive *, __LA_UID_T);\n/* \"Standard\" implementation uses getpwuid_r, getgrgid_r and caches the\n * results for performance. */\n__LA_DECL int\ttk_archive_read_disk_set_standard_lookup(struct archive *);\n/* You can install your own lookups if you like. */\n__LA_DECL int\ttk_archive_read_disk_set_gname_lookup(struct archive *,\n    void * /* private_data */,\n    const char *(* /* lookup_fn */)(void *, __LA_GID_T),\n    void (* /* cleanup_fn */)(void *));\n__LA_DECL int\ttk_archive_read_disk_set_uname_lookup(struct archive *,\n    void * /* private_data */,\n    const char *(* /* lookup_fn */)(void *, __LA_UID_T),\n    void (* /* cleanup_fn */)(void *));\n\n/*\n * Accessor functions to read/set various information in\n * the struct archive object:\n */\n/* Bytes written after compression or read before decompression. */\n__LA_DECL __LA_INT64_T\t tk_archive_position_compressed(struct archive *);\n/* Bytes written to compressor or read from decompressor. */\n__LA_DECL __LA_INT64_T\t tk_archive_position_uncompressed(struct archive *);\n\n__LA_DECL const char\t*tk_archive_compression_name(struct archive *);\n__LA_DECL int\t\t tk_archive_compression(struct archive *);\n__LA_DECL int\t\t tk_archive_errno(struct archive *);\n__LA_DECL const char\t*tk_archive_error_string(struct archive *);\n__LA_DECL const char\t*tk_archive_format_name(struct archive *);\n__LA_DECL int\t\t tk_archive_format(struct archive *);\n__LA_DECL void\t\t tk_archive_clear_error(struct archive *);\n__LA_DECL void\t\t tk_archive_set_error(struct archive *, int _err,\n\t\t\t    const char *fmt, ...);\n__LA_DECL void\t\t tk_archive_copy_error(struct archive *dest,\n\t\t\t    struct archive *src);\n__LA_DECL int\t\t tk_archive_file_count(struct archive *);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* These are meaningless outside of this header. */\n#undef __LA_DECL\n#undef __LA_GID_T\n#undef __LA_UID_T\n\n/* These need to remain defined because they're used in the\n * callback type definitions.  XXX Fix this.  This is ugly. XXX */\n/* #undef __LA_INT64_T */\n/* #undef __LA_SSIZE_T */\n\n#endif /* !tk_archive_H_INCLUDED */\n"
  },
  {
    "path": "Dash/archive_entry.h",
    "content": "/*-\n * Copyright (c) 2003-2008 Tim Kientzle\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * $FreeBSD: head/lib/libarchive/tk_archive_entry.h 201096 2009-12-28 02:41:27Z kientzle $\n */\n\n#ifndef tk_archive_ENTRY_H_INCLUDED\n#define\ttk_archive_ENTRY_H_INCLUDED\n\n/*\n * Note: tk_archive_entry.h is for use outside of libarchive; the\n * configuration headers (config.h, tk_archive_platform.h, etc.) are\n * purely internal.  Do NOT use HAVE_XXX configuration macros to\n * control the behavior of this header!  If you must conditionalize,\n * use predefined compiler and/or platform macros.\n */\n\n#include <sys/types.h>\n#include <stddef.h>  /* for wchar_t */\n#include <time.h>\n\n#if defined(_WIN32) && !defined(__CYGWIN__)\n#include <windows.h>\n#endif\n\n/* Get appropriate definitions of standard POSIX-style types. */\n/* These should match the types used in 'struct stat' */\n#if defined(_WIN32) && !defined(__CYGWIN__)\n#define\t__LA_INT64_T\t__int64\n# if defined(__BORLANDC__)\n#  define\t__LA_UID_T\tuid_t\n#  define\t__LA_GID_T\tgid_t\n#  define\t__LA_DEV_T\tdev_t\n#  define\t__LA_MODE_T\tmode_t\n# else\n#  define\t__LA_UID_T\tshort\n#  define\t__LA_GID_T\tshort\n#  define\t__LA_DEV_T\tunsigned int\n#  define\t__LA_MODE_T\tunsigned short\n# endif\n#else\n#include <unistd.h>\n#define\t__LA_INT64_T\tint64_t\n#define\t__LA_UID_T\tuid_t\n#define\t__LA_GID_T\tgid_t\n#define\t__LA_DEV_T\tdev_t\n#define\t__LA_MODE_T\tmode_t\n#endif\n\n/*\n * XXX Is this defined for all Windows compilers?  If so, in what\n * header?  It would be nice to remove the __LA_INO_T indirection and\n * just use plain ino_t everywhere.  Likewise for the other types just\n * above.\n */\n#define\t__LA_INO_T\tino_t\n\n\n/*\n * On Windows, define LIBtk_archive_STATIC if you're building or using a\n * .lib.  The default here assumes you're building a DLL.  Only\n * libarchive source should ever define __LIBtk_archive_BUILD.\n */\n#if ((defined __WIN32__) || (defined _WIN32) || defined(__CYGWIN__)) && (!defined LIBtk_archive_STATIC)\n# ifdef __LIBtk_archive_BUILD\n#  ifdef __GNUC__\n#   define __LA_DECL\t__attribute__((dllexport)) extern\n#  else\n#   define __LA_DECL\t__declspec(dllexport)\n#  endif\n# else\n#  ifdef __GNUC__\n#   define __LA_DECL\t__attribute__((dllimport)) extern\n#  else\n#   define __LA_DECL\t__declspec(dllimport)\n#  endif\n# endif\n#else\n/* Static libraries on all platforms and shared libraries on non-Windows. */\n# define __LA_DECL\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Description of an archive entry.\n *\n * You can think of this as \"struct stat\" with some text fields added in.\n *\n * TODO: Add \"comment\", \"charset\", and possibly other entries that are\n * supported by \"pax interchange\" format.  However, GNU, ustar, cpio,\n * and other variants don't support these features, so they're not an\n * excruciatingly high priority right now.\n *\n * TODO: \"pax interchange\" format allows essentially arbitrary\n * key/value attributes to be attached to any entry.  Supporting\n * such extensions may make this library useful for special\n * applications (e.g., a package manager could attach special\n * package-management attributes to each entry).\n */\nstruct tk_archive_entry;\n\n/*\n * File-type constants.  These are returned from tk_archive_entry_filetype()\n * and passed to tk_archive_entry_set_filetype().\n *\n * These values match S_XXX defines on every platform I've checked,\n * including Windows, AIX, Linux, Solaris, and BSD.  They're\n * (re)defined here because platforms generally don't define the ones\n * they don't support.  For example, Windows doesn't define S_IFLNK or\n * S_IFBLK.  Instead of having a mass of conditional logic and system\n * checks to define any S_XXX values that aren't supported locally,\n * I've just defined a new set of such constants so that\n * libarchive-based applications can manipulate and identify archive\n * entries properly even if the hosting platform can't store them on\n * disk.\n *\n * These values are also used directly within some portable formats,\n * such as cpio.  If you find a platform that varies from these, the\n * correct solution is to leave these alone and translate from these\n * portable values to platform-native values when entries are read from\n * or written to disk.\n */\n#define\tAE_IFMT\t\t0170000\n#define\tAE_IFREG\t0100000\n#define\tAE_IFLNK\t0120000\n#define\tAE_IFSOCK\t0140000\n#define\tAE_IFCHR\t0020000\n#define\tAE_IFBLK\t0060000\n#define\tAE_IFDIR\t0040000\n#define\tAE_IFIFO\t0010000\n\n/*\n * Basic object manipulation\n */\n\n__LA_DECL struct tk_archive_entry\t*tk_archive_entry_clear(struct tk_archive_entry *);\n/* The 'clone' function does a deep copy; all of the strings are copied too. */\n__LA_DECL struct tk_archive_entry\t*tk_archive_entry_clone(struct tk_archive_entry *);\n__LA_DECL void\t\t\t tk_archive_entry_free(struct tk_archive_entry *);\n__LA_DECL struct tk_archive_entry\t*tk_archive_entry_new(void);\n\n/*\n * Retrieve fields from an tk_archive_entry.\n *\n * There are a number of implicit conversions among these fields.  For\n * example, if a regular string field is set and you read the _w wide\n * character field, the entry will implicitly convert narrow-to-wide\n * using the current locale.  Similarly, dev values are automatically\n * updated when you write devmajor or devminor and vice versa.\n *\n * In addition, fields can be \"set\" or \"unset.\"  Unset string fields\n * return NULL, non-string fields have _is_set() functions to test\n * whether they've been set.  You can \"unset\" a string field by\n * assigning NULL; non-string fields have _unset() functions to\n * unset them.\n *\n * Note: There is one ambiguity in the above; string fields will\n * also return NULL when implicit character set conversions fail.\n * This is usually what you want.\n */\n__LA_DECL time_t\t tk_archive_entry_atime(struct tk_archive_entry *);\n__LA_DECL long\t\t tk_archive_entry_atime_nsec(struct tk_archive_entry *);\n__LA_DECL int\t\t tk_archive_entry_atime_is_set(struct tk_archive_entry *);\n__LA_DECL time_t\t tk_archive_entry_birthtime(struct tk_archive_entry *);\n__LA_DECL long\t\t tk_archive_entry_birthtime_nsec(struct tk_archive_entry *);\n__LA_DECL int\t\t tk_archive_entry_birthtime_is_set(struct tk_archive_entry *);\n__LA_DECL time_t\t tk_archive_entry_ctime(struct tk_archive_entry *);\n__LA_DECL long\t\t tk_archive_entry_ctime_nsec(struct tk_archive_entry *);\n__LA_DECL int\t\t tk_archive_entry_ctime_is_set(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_dev(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_devmajor(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_devminor(struct tk_archive_entry *);\n__LA_DECL __LA_MODE_T\t tk_archive_entry_filetype(struct tk_archive_entry *);\n__LA_DECL void\t\t tk_archive_entry_fflags(struct tk_archive_entry *,\n\t\t\t    unsigned long * /* set */,\n\t\t\t    unsigned long * /* clear */);\n__LA_DECL const char\t*tk_archive_entry_fflags_text(struct tk_archive_entry *);\n__LA_DECL __LA_GID_T\t tk_archive_entry_gid(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_gname(struct tk_archive_entry *);\n__LA_DECL const wchar_t\t*tk_archive_entry_gname_w(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_hardlink(struct tk_archive_entry *);\n__LA_DECL const wchar_t\t*tk_archive_entry_hardlink_w(struct tk_archive_entry *);\n__LA_DECL __LA_INO_T\t tk_archive_entry_ino(struct tk_archive_entry *);\n__LA_DECL __LA_INT64_T\t tk_archive_entry_ino64(struct tk_archive_entry *);\n__LA_DECL __LA_MODE_T\t tk_archive_entry_mode(struct tk_archive_entry *);\n__LA_DECL time_t\t tk_archive_entry_mtime(struct tk_archive_entry *);\n__LA_DECL long\t\t tk_archive_entry_mtime_nsec(struct tk_archive_entry *);\n__LA_DECL int\t\t tk_archive_entry_mtime_is_set(struct tk_archive_entry *);\n__LA_DECL unsigned int\t tk_archive_entry_nlink(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_pathname(struct tk_archive_entry *);\n__LA_DECL const wchar_t\t*tk_archive_entry_pathname_w(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_rdev(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_rdevmajor(struct tk_archive_entry *);\n__LA_DECL dev_t\t\t tk_archive_entry_rdevminor(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_sourcepath(struct tk_archive_entry *);\n__LA_DECL __LA_INT64_T\t tk_archive_entry_size(struct tk_archive_entry *);\n__LA_DECL int\t\t tk_archive_entry_size_is_set(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_strmode(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_symlink(struct tk_archive_entry *);\n__LA_DECL const wchar_t\t*tk_archive_entry_symlink_w(struct tk_archive_entry *);\n__LA_DECL __LA_UID_T\t tk_archive_entry_uid(struct tk_archive_entry *);\n__LA_DECL const char\t*tk_archive_entry_uname(struct tk_archive_entry *);\n__LA_DECL const wchar_t\t*tk_archive_entry_uname_w(struct tk_archive_entry *);\n\n/*\n * Set fields in an tk_archive_entry.\n *\n * Note that string 'set' functions do not copy the string, only the pointer.\n * In contrast, 'copy' functions do copy the object pointed to.\n *\n * Note: As of libarchive 2.4, 'set' functions do copy the string and\n * are therefore exact synonyms for the 'copy' versions.  The 'copy'\n * names will be retired in libarchive 3.0.\n */\n\n__LA_DECL void\ttk_archive_entry_set_atime(struct tk_archive_entry *, time_t, long);\n__LA_DECL void  tk_archive_entry_unset_atime(struct tk_archive_entry *);\n#if defined(_WIN32) && !defined(__CYGWIN__)\n__LA_DECL void tk_archive_entry_copy_bhfi(struct tk_archive_entry *,\n\t\t\t\t\t\t\t\t\t   BY_HANDLE_FILE_INFORMATION *);\n#endif\n__LA_DECL void\ttk_archive_entry_set_birthtime(struct tk_archive_entry *, time_t, long);\n__LA_DECL void  tk_archive_entry_unset_birthtime(struct tk_archive_entry *);\n__LA_DECL void\ttk_archive_entry_set_ctime(struct tk_archive_entry *, time_t, long);\n__LA_DECL void  tk_archive_entry_unset_ctime(struct tk_archive_entry *);\n__LA_DECL void\ttk_archive_entry_set_dev(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_devmajor(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_devminor(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_filetype(struct tk_archive_entry *, unsigned int);\n__LA_DECL void\ttk_archive_entry_set_fflags(struct tk_archive_entry *,\n\t    unsigned long /* set */, unsigned long /* clear */);\n/* Returns pointer to start of first invalid token, or NULL if none. */\n/* Note that all recognized tokens are processed, regardless. */\n__LA_DECL const char *tk_archive_entry_copy_fflags_text(struct tk_archive_entry *,\n\t    const char *);\n__LA_DECL const wchar_t *tk_archive_entry_copy_fflags_text_w(struct tk_archive_entry *,\n\t    const wchar_t *);\n__LA_DECL void\ttk_archive_entry_set_gid(struct tk_archive_entry *, __LA_GID_T);\n__LA_DECL void\ttk_archive_entry_set_gname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_gname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_gname_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_gname_utf8(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_set_hardlink(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_hardlink(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_hardlink_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_hardlink_utf8(struct tk_archive_entry *, const char *);\n#if tk_archive_VERSION_NUMBER >= 3000000\n/* Starting with libarchive 3.0, this will be synonym for ino64. */\n__LA_DECL void\ttk_archive_entry_set_ino(struct tk_archive_entry *, __LA_INT64_T);\n#else\n__LA_DECL void\ttk_archive_entry_set_ino(struct tk_archive_entry *, unsigned long);\n#endif\n__LA_DECL void\ttk_archive_entry_set_ino64(struct tk_archive_entry *, __LA_INT64_T);\n__LA_DECL void\ttk_archive_entry_set_link(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_link(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_link_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_link_utf8(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_set_mode(struct tk_archive_entry *, __LA_MODE_T);\n__LA_DECL void\ttk_archive_entry_set_mtime(struct tk_archive_entry *, time_t, long);\n__LA_DECL void  tk_archive_entry_unset_mtime(struct tk_archive_entry *);\n__LA_DECL void\ttk_archive_entry_set_nlink(struct tk_archive_entry *, unsigned int);\n__LA_DECL void\ttk_archive_entry_set_pathname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_pathname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_pathname_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_pathname_utf8(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_set_perm(struct tk_archive_entry *, __LA_MODE_T);\n__LA_DECL void\ttk_archive_entry_set_rdev(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_rdevmajor(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_rdevminor(struct tk_archive_entry *, dev_t);\n__LA_DECL void\ttk_archive_entry_set_size(struct tk_archive_entry *, __LA_INT64_T);\n__LA_DECL void\ttk_archive_entry_unset_size(struct tk_archive_entry *);\n__LA_DECL void\ttk_archive_entry_copy_sourcepath(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_set_symlink(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_symlink(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_symlink_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_symlink_utf8(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_set_uid(struct tk_archive_entry *, __LA_UID_T);\n__LA_DECL void\ttk_archive_entry_set_uname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_uname(struct tk_archive_entry *, const char *);\n__LA_DECL void\ttk_archive_entry_copy_uname_w(struct tk_archive_entry *, const wchar_t *);\n__LA_DECL int\ttk_archive_entry_update_uname_utf8(struct tk_archive_entry *, const char *);\n/*\n * Routines to bulk copy fields to/from a platform-native \"struct\n * stat.\"  Libarchive used to just store a struct stat inside of each\n * tk_archive_entry object, but this created issues when trying to\n * manipulate archives on systems different than the ones they were\n * created on.\n *\n * TODO: On Linux, provide both stat32 and stat64 versions of these functions.\n */\n__LA_DECL const struct stat\t*tk_archive_entry_stat(struct tk_archive_entry *);\n__LA_DECL void\ttk_archive_entry_copy_stat(struct tk_archive_entry *, const struct stat *);\n\n\n/*\n * ACL routines.  This used to simply store and return text-format ACL\n * strings, but that proved insufficient for a number of reasons:\n *   = clients need control over uname/uid and gname/gid mappings\n *   = there are many different ACL text formats\n *   = would like to be able to read/convert archives containing ACLs\n *     on platforms that lack ACL libraries\n *\n *  This last point, in particular, forces me to implement a reasonably\n *  complete set of ACL support routines.\n *\n *  TODO: Extend this to support NFSv4/NTFS permissions.  That should\n *  allow full ACL support on Mac OS, in particular, which uses\n *  POSIX.1e-style interfaces to manipulate NFSv4/NTFS permissions.\n */\n\n/*\n * Permission bits mimic POSIX.1e.  Note that I've not followed POSIX.1e's\n * \"permset\"/\"perm\" abstract type nonsense.  A permset is just a simple\n * bitmap, following long-standing Unix tradition.\n */\n#define\ttk_archive_ENTRY_ACL_EXECUTE\t1\n#define\ttk_archive_ENTRY_ACL_WRITE\t\t2\n#define\ttk_archive_ENTRY_ACL_READ\t\t4\n\n/* We need to be able to specify either or both of these. */\n#define\ttk_archive_ENTRY_ACL_TYPE_ACCESS\t256\n#define\ttk_archive_ENTRY_ACL_TYPE_DEFAULT\t512\n\n/* Tag values mimic POSIX.1e */\n#define\ttk_archive_ENTRY_ACL_USER\t\t10001\t/* Specified user. */\n#define\ttk_archive_ENTRY_ACL_USER_OBJ \t10002\t/* User who owns the file. */\n#define\ttk_archive_ENTRY_ACL_GROUP\t\t10003\t/* Specified group. */\n#define\ttk_archive_ENTRY_ACL_GROUP_OBJ\t10004\t/* Group who owns the file. */\n#define\ttk_archive_ENTRY_ACL_MASK\t\t10005\t/* Modify group access. */\n#define\ttk_archive_ENTRY_ACL_OTHER\t\t10006\t/* Public. */\n\n/*\n * Set the ACL by clearing it and adding entries one at a time.\n * Unlike the POSIX.1e ACL routines, you must specify the type\n * (access/default) for each entry.  Internally, the ACL data is just\n * a soup of entries.  API calls here allow you to retrieve just the\n * entries of interest.  This design (which goes against the spirit of\n * POSIX.1e) is useful for handling archive formats that combine\n * default and access information in a single ACL list.\n */\n__LA_DECL void\t tk_archive_entry_acl_clear(struct tk_archive_entry *);\n__LA_DECL void\t tk_archive_entry_acl_add_entry(struct tk_archive_entry *,\n\t    int /* type */, int /* permset */, int /* tag */,\n\t    int /* qual */, const char * /* name */);\n__LA_DECL void\t tk_archive_entry_acl_add_entry_w(struct tk_archive_entry *,\n\t    int /* type */, int /* permset */, int /* tag */,\n\t    int /* qual */, const wchar_t * /* name */);\n\n/*\n * To retrieve the ACL, first \"reset\", then repeatedly ask for the\n * \"next\" entry.  The want_type parameter allows you to request only\n * access entries or only default entries.\n */\n__LA_DECL int\t tk_archive_entry_acl_reset(struct tk_archive_entry *, int /* want_type */);\n__LA_DECL int\t tk_archive_entry_acl_next(struct tk_archive_entry *, int /* want_type */,\n\t    int * /* type */, int * /* permset */, int * /* tag */,\n\t    int * /* qual */, const char ** /* name */);\n__LA_DECL int\t tk_archive_entry_acl_next_w(struct tk_archive_entry *, int /* want_type */,\n\t    int * /* type */, int * /* permset */, int * /* tag */,\n\t    int * /* qual */, const wchar_t ** /* name */);\n\n/*\n * Construct a text-format ACL.  The flags argument is a bitmask that\n * can include any of the following:\n *\n * tk_archive_ENTRY_ACL_TYPE_ACCESS - Include access entries.\n * tk_archive_ENTRY_ACL_TYPE_DEFAULT - Include default entries.\n * tk_archive_ENTRY_ACL_STYLE_EXTRA_ID - Include extra numeric ID field in\n *    each ACL entry.  (As used by 'star'.)\n * tk_archive_ENTRY_ACL_STYLE_MARK_DEFAULT - Include \"default:\" before each\n *    default ACL entry.\n */\n#define\ttk_archive_ENTRY_ACL_STYLE_EXTRA_ID\t1024\n#define\ttk_archive_ENTRY_ACL_STYLE_MARK_DEFAULT\t2048\n__LA_DECL const wchar_t\t*tk_archive_entry_acl_text_w(struct tk_archive_entry *,\n\t\t    int /* flags */);\n\n/* Return a count of entries matching 'want_type' */\n__LA_DECL int\t tk_archive_entry_acl_count(struct tk_archive_entry *, int /* want_type */);\n\n/*\n * Private ACL parser.  This is private because it handles some\n * very weird formats that clients should not be messing with.\n * Clients should only deal with their platform-native formats.\n * Because of the need to support many formats cleanly, new arguments\n * are likely to get added on a regular basis.  Clients who try to use\n * this interface are likely to be surprised when it changes.\n *\n * You were warned!\n *\n * TODO: Move this declaration out of the public header and into\n * a private header.  Warnings above are silly.\n */\n__LA_DECL int\t\t __tk_archive_entry_acl_parse_w(struct tk_archive_entry *,\n\t\t    const wchar_t *, int /* type */);\n\n/*\n * extended attributes\n */\n\n__LA_DECL void\t tk_archive_entry_xattr_clear(struct tk_archive_entry *);\n__LA_DECL void\t tk_archive_entry_xattr_add_entry(struct tk_archive_entry *,\n\t    const char * /* name */, const void * /* value */,\n\t    size_t /* size */);\n\n/*\n * To retrieve the xattr list, first \"reset\", then repeatedly ask for the\n * \"next\" entry.\n */\n\n__LA_DECL int\ttk_archive_entry_xattr_count(struct tk_archive_entry *);\n__LA_DECL int\ttk_archive_entry_xattr_reset(struct tk_archive_entry *);\n__LA_DECL int\ttk_archive_entry_xattr_next(struct tk_archive_entry *,\n\t    const char ** /* name */, const void ** /* value */, size_t *);\n\n/*\n * Utility to match up hardlinks.\n *\n * The 'struct tk_archive_entry_linkresolver' is a cache of archive entries\n * for files with multiple links.  Here's how to use it:\n *   1. Create a lookup object with tk_archive_entry_linkresolver_new()\n *   2. Tell it the archive format you're using.\n *   3. Hand each tk_archive_entry to tk_archive_entry_linkify().\n *      That function will return 0, 1, or 2 entries that should\n *      be written.\n *   4. Call tk_archive_entry_linkify(resolver, NULL) until\n *      no more entries are returned.\n *   5. Call tk_archive_entry_link_resolver_free(resolver) to free resources.\n *\n * The entries returned have their hardlink and size fields updated\n * appropriately.  If an entry is passed in that does not refer to\n * a file with multiple links, it is returned unchanged.  The intention\n * is that you should be able to simply filter all entries through\n * this machine.\n *\n * To make things more efficient, be sure that each entry has a valid\n * nlinks value.  The hardlink cache uses this to track when all links\n * have been found.  If the nlinks value is zero, it will keep every\n * name in the cache indefinitely, which can use a lot of memory.\n *\n * Note that tk_archive_entry_size() is reset to zero if the file\n * body should not be written to the archive.  Pay attention!\n */\nstruct tk_archive_entry_linkresolver;\n\n/*\n * There are three different strategies for marking hardlinks.\n * The descriptions below name them after the best-known\n * formats that rely on each strategy:\n *\n * \"Old cpio\" is the simplest, it always returns any entry unmodified.\n *    As far as I know, only cpio formats use this.  Old cpio archives\n *    store every link with the full body; the onus is on the dearchiver\n *    to detect and properly link the files as they are restored.\n * \"tar\" is also pretty simple; it caches a copy the first time it sees\n *    any link.  Subsequent appearances are modified to be hardlink\n *    references to the first one without any body.  Used by all tar\n *    formats, although the newest tar formats permit the \"old cpio\" strategy\n *    as well.  This strategy is very simple for the dearchiver,\n *    and reasonably straightforward for the archiver.\n * \"new cpio\" is trickier.  It stores the body only with the last\n *    occurrence.  The complication is that we might not\n *    see every link to a particular file in a single session, so\n *    there's no easy way to know when we've seen the last occurrence.\n *    The solution here is to queue one link until we see the next.\n *    At the end of the session, you can enumerate any remaining\n *    entries by calling tk_archive_entry_linkify(NULL) and store those\n *    bodies.  If you have a file with three links l1, l2, and l3,\n *    you'll get the following behavior if you see all three links:\n *           linkify(l1) => NULL   (the resolver stores l1 internally)\n *           linkify(l2) => l1     (resolver stores l2, you write l1)\n *           linkify(l3) => l2, l3 (all links seen, you can write both).\n *    If you only see l1 and l2, you'll get this behavior:\n *           linkify(l1) => NULL\n *           linkify(l2) => l1\n *           linkify(NULL) => l2   (at end, you retrieve remaining links)\n *    As the name suggests, this strategy is used by newer cpio variants.\n *    It's noticably more complex for the archiver, slightly more complex\n *    for the dearchiver than the tar strategy, but makes it straightforward\n *    to restore a file using any link by simply continuing to scan until\n *    you see a link that is stored with a body.  In contrast, the tar\n *    strategy requires you to rescan the archive from the beginning to\n *    correctly extract an arbitrary link.\n */\n\n__LA_DECL struct tk_archive_entry_linkresolver *tk_archive_entry_linkresolver_new(void);\n__LA_DECL void tk_archive_entry_linkresolver_set_strategy(\n\tstruct tk_archive_entry_linkresolver *, int /* format_code */);\n__LA_DECL void tk_archive_entry_linkresolver_free(struct tk_archive_entry_linkresolver *);\n__LA_DECL void tk_archive_entry_linkify(struct tk_archive_entry_linkresolver *,\n    struct tk_archive_entry **, struct tk_archive_entry **);\n\n#ifdef __cplusplus\n}\n#endif\n\n/* This is meaningless outside of this header. */\n#undef __LA_DECL\n\n#endif /* !tk_archive_ENTRY_H_INCLUDED */\n"
  },
  {
    "path": "Dash/cocoa.js",
    "content": "var language = document.getElementById('language');\nif(language)\n{\n    var labels = language.getElementsByTagName('label');\n    for(var i = 0; i < labels.length; i++)\n    {\n        var label = labels[i];\n        label.setAttribute(\"onclick\", \"window.dash.switchAppleLanguage(this.getAttribute('for'))\");\n    }\n}\n\nfunction toggleOverviews()\n{\n    var toggles = document.getElementsByClassName('overview-bulk-toggle');\n    for(var i = 0; i < toggles.length; i++)\n    {\n        toggles[i].setAttribute(\"style\", \"display:none !important;\");\n    }\n    var bulks = document.getElementsByClassName('overview-bulk');\n    for(var i = 0; i < bulks.length; i++)\n    {\n        bulks[i].setAttribute(\"style\", \"display:block !important;\");\n    }\n}\n\nvar toggles = document.getElementsByClassName('overview-bulk-toggle');\nfor(var i = 0; i < toggles.length; i++)\n{\n    var toggle = toggles[i];\n    toggle.setAttribute(\"onclick\", \"toggleOverviews()\");\n}\n\nvar collapsedTasks = document.getElementsByClassName('task');\nfor(var i = 0; i < collapsedTasks.length; i++)\n{\n    var collapsedTask = collapsedTasks[i];\n    collapsedTask.setAttribute(\"onclick\", \"if(this.className.indexOf('closed') != -1) { this.className = 'task'; Array.prototype.forEach.call(this.getElementsByClassName('task-content'), function(el) { el.className = 'task-content showing'; } ); } else { this.className = 'task closed'; Array.prototype.forEach.call(this.getElementsByClassName('task-content'), function(el) { el.className = 'task-content'; } );}\");\n}\n"
  },
  {
    "path": "Dash/en.lproj/InfoPlist.strings",
    "content": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "Dash/hash_change_notifier.js",
    "content": "window.onhashchange = function () {\n    window.dash.webViewDidChangeLocationWithinPage();\n}\n"
  },
  {
    "path": "Dash/home.html",
    "content": "<html><head>\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; user-scalable=1\"/>\n<title>Dash</title>\n</head>\n\n<body style='font-family: Helvetica Neue; font-weight:lighter;-webkit-user-select:none; padding:0px 5px; color:#333333'>\n<div style='position:absolute; right:0; left:0; top:0; bottom:0; width:300px; height:100px; margin:auto; text-align:center;'>This page intentionally left blank.</div>\n</body>\n</html>"
  },
  {
    "path": "Dash/main.m",
    "content": "#import <UIKit/UIKit.h>\n\n#import \"DHAppDelegate.h\"\n\nint main(int argc, char * argv[])\n{\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([DHAppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "Dash/msdn.js",
    "content": "function dashSetUpMSDN(prefs)\n{\n    if(prefs && prefs.length)\n    {\n        var topPref = prefs[0];\n        var tabs = document.getElementsByClassName(\"codeSnippetContainerTab\");\n        for(var i = 0; i < tabs.length; i++)\n        {\n            var tab = tabs[i];\n            var anchors = tab.getElementsWithTagName(\"a\");\n            var anchor = (anchors && anchors.length) ? anchors[0] : nil;\n            if(anchor && anchor.innerText.toUpperCase() === topPref.toUpperCase())\n            {\n                makeActive(anchor);\n            }\n        }\n        if(prefs.length > 1)\n        {\n            \n        }\n    }\n}\n\noldMakeActive = makeActive; makeActive = function(s) { oldMakeActive(s); window.dash.msdnMakeActive(s)}"
  },
  {
    "path": "Dash/on_page_load.js",
    "content": ""
  },
  {
    "path": "Dash/ruby.js",
    "content": "function replaceAll(str, find, replace)\n{\n    return str.replace(new RegExp(find, 'g'), replace);\n}\n\nvar documentation = document.getElementById('documentation');\nif(documentation)\n{\n    var classes = documentation.getElementsByClassName('class');\n    var isModule = false;\n    if(!classes || !classes.length)\n    {\n        classes = documentation.getElementsByClassName('module');\n        isModule = true;\n    }\n    for(var i = 0; i < classes.length; i++)\n    {\n        var aClass = classes[i];\n        aClass.setAttribute(\"class\", aClass.getAttribute('class')+\" class-loaded\");\n        var parent = document.createElement('span');\n        var parentClassHTML = \"None.\";\n        var parentSection = document.getElementById('parent-class-section');\n        if(parentSection)\n        {\n            var links = parentSection.getElementsByClassName('link');\n            if(links.length)\n            {\n                var link = links[0];\n                if(link.innerText && link.innerText.trim().length)\n                {\n                    parentClassHTML = link.innerText.trim();\n                    var anchors = link.getElementsByTagName('a');\n                    var anchor = (anchors.length) ? anchors[0] : false;\n                    var href = (anchor) ? anchor.getAttribute('href') : false;\n                    if(href && href.length)\n                    {\n                        parentClassHTML = \"<a class='rubyDashNamespaceClass' href='\"+href+\"'>\"+parentClassHTML+\"</a>.\";\n                    }\n                    else\n                    {\n                        parentClassHTML = parentClassHTML+\".\";\n                    }\n                }\n            }\n        }\n        var namespaceHTML = \"\";\n        var namespaceSection = document.getElementById('namespace-list-section');\n        if(namespaceSection)\n        {\n            var namespaceLinks = namespaceSection.getElementsByTagName('a');\n            var addedMultipleNamespaces = false;\n            for(var j = 0; j < namespaceLinks.length; j++)\n            {\n                var link = namespaceLinks[j];\n                if(link.innerText && link.innerText.length)\n                {\n                    var namespaceText = link.innerText;\n                    var href = link.getAttribute('href');\n                    if(namespaceText && namespaceText.length && href && href.length)\n                    {\n                        if(namespaceHTML.length)\n                        {\n                            addedMultipleNamespaces = true;\n                            namespaceHTML = namespaceHTML+\", \";\n                        }\n                        var previousText = link.previousElementSibling.innerText;\n                        var type = (previousText.toUpperCase() === \"MODULE\") ? \"rubyDashNamespaceModule\" : \"rubyDashNamespaceClass\";\n                        namespaceHTML = namespaceHTML+\"<a class='\"+type+\"' href='\"+href+\"'>\"+namespaceText+\"</a>\";\n                    }\n                }\n            }\n        }\n        if(namespaceHTML.length)\n        {\n            if(addedMultipleNamespaces)\n            {\n                namespaceHTML = \" Namespaces: <a href='#' onclick='this.outerHTML = \\\"\"+replaceAll(replaceAll(namespaceHTML, \"'\", \"\\\"\"), '\"', '\\\\\"')+\"\\\"; return false;'>Show</a>.\";\n            }\n            else\n            {\n                namespaceHTML = \" Namespace: \"+namespaceHTML+\".\";\n            }\n        }\n        \n        var includedHTML = \"\";\n        var includesSection = document.getElementById('includes-section');\n        if(includesSection)\n        {\n            var includeLinks = includesSection.getElementsByClassName('include');\n            var addedMultipleIncludes = false;\n            for(var j = 0; j < includeLinks.length; j++)\n            {\n                var link = includeLinks[j];\n                if(link.innerText && link.innerText.length)\n                {\n                    var includeText = link.innerText;\n                    var href = link.getAttribute('href');\n                    if(includeText && includeText.length && href && href.length)\n                    {\n                        if(includedHTML.length)\n                        {\n                            addedMultipleIncludes = true;\n                            includedHTML = includedHTML + \", \";\n                        }\n                        includedHTML = includedHTML+\"<a class=\\\"rubyDashNamespaceModule\\\" href=\\\"\"+href+\"\\\">\"+includeText+\"</a>\";\n                    }\n                }\n            }\n        }\n        if(namespaceHTML && namespaceHTML.length && isModule && !includedHTML.length)\n        {\n            namespaceHTML = namespaceHTML.trim();\n        }\n        if(includedHTML.length)\n        {\n            if(addedMultipleIncludes)\n            {\n                includedHTML = \"Included Modules: <a href='#' onclick='this.outerHTML = \\\"\"+replaceAll(replaceAll(includedHTML, \"'\", \"\\\"\"), '\"', '\\\\\"')+\"\\\"; return false;'>Show</a>.\";\n            }\n            else\n            {\n                includedHTML = \"Included Modules: \"+includedHTML+\".\";\n            }\n            if(!isModule)\n            {\n                includedHTML = \" \"+includedHTML;\n            }\n        }\n        var appendHTML = \"Parent Class: \"+parentClassHTML+includedHTML;\n        if(isModule)\n        {\n            appendHTML = includedHTML;\n        }\n        if(namespaceHTML.length)\n        {\n            appendHTML = appendHTML+namespaceHTML;\n        }\n        if(!appendHTML.length)\n        {\n            appendHTML = \"&nbsp;\";\n        }\n        parent.innerHTML = appendHTML;\n        aClass.appendChild(parent);\n    }\n}\n"
  },
  {
    "path": "Dash/scroll_to_current_anchor.js",
    "content": "var hash = window.location.hash;\nhash = hash.replace(/^#/, '');\nvar didScroll = false;\nif(hash && hash.length)\n{\n    var anchor = document.anchors.namedItem(hash);\n    anchor = (anchor) ? anchor : document.getElementById(hash);\n    if(anchor)\n    {\n        didScroll = true;\n        anchor.scrollIntoView();\n    }\n}\nif(!didScroll)\n{\n    window.scrollTo(0,0);\n}"
  },
  {
    "path": "Dash/style.css",
    "content": "body.dash_cleared {opacity:0.0 !important}\n\nbody.jazz {background-color:white !important}\nbody.jazz .hideInXcode {display:none !important;}\nbody.jazz section#valence {display:none !important}\nbody.jazz .chapter div.pixel-line {display:none !important}\nbody.jazz .chapter {border:none !important; position:static !important; overflow-x:visible !important; overflow-y:visible !important; width:auto !important; margin:0px !important; top:0px !important; box-shadow:none !important;}\nbody.jazz .content-wrapper {width:auto !important; background-color:white !important}\nbody.jazz #bashful {text-align:right; width:100% !important; height:auto !important; position:absolute !important; background:none !important; top:10px !important; margin:0px !important; padding:0px !important; padding-right:0px !important; padding-left:0px !important;}\nbody.jazz #language label.selected {background: transparent !important; color: rgba(0,136,204,1) !important; cursor:pointer !important;}\nbody.jazz #bashful .shield {width:auto !important}\nbody.jazz #bashful #language {user-select:none !important;-webkit-touch-callout:none !important; -webkit-user-select:none !important; padding:0px !important; float:none !important; position: static !important; left:auto !important; font-size:11px !important; -webkit-text-size-adjust: none !important; padding-right:0px !important;}\nbody.jazz #bashful #jump_to, body.jazz #bashful #options {display:none !important}\nbody.jazz #next_previous .copyright {display:none !important}\nbody.jazz .height-container {height:inherit !important;}\nbody.jazz .height-container .section {background-color:white !important; border:none !important; padding-left:40px !important; padding-bottom:25px !important; width:auto !important;}\nbody.jazz #next_previous {position:static !important; width:auto !important}\nbody.jazz .next-link a, body.jazz .previous-link a {margin-top: 0px !important}\nbody.jazz .pointy-thing-container, body.jazz .pointy-thing {display:none !important;}\nbody.jazz .hiding-symbol-counts {display:none !important}\nbody.jazz .overview-bulk-toggle {display:inline-block;}\nbody.jazz .overview-bulk {display:none; pointer-events:auto !important; opacity:1 !important; height:auto !important;}\nbody.jazz .pixel-line {display:none !important;}\nbody.jazz .chapter-name {margin-top:10px !important}\nbody.jazz a[name] {margin-top:-10px !important; padding-top:10px !important}\nbody.jazz p.para {display:block;}\nbody.jazz .task-name-container {padding-right: 0px !important;}\nbody.jazz span.x-name {word-wrap:break-word}\n@media only screen and (max-width:320px) {\n    body.jazz td {word-break:break-word !important; width: 2% !important}\n    body.jazz td:first-of-type {width:1% !important}\n}\nbody.jazz .rubber-band-gap { display:none !important; }\nbody.jazz .metadata-table, body.jazz #metadata_table { max-height:none !important}\nbody.jazz .metadata-table > div {margin-bottom:15px !important}\n\nhtml.dash .method-declaration code { padding:0.5em !important; display:inline-block !important; } /* for cocoadocs docs */\nhtml.dash .method-subsection h4 {text-align:left !important; float:none !important;}\nhtml.dash .method-subsection .params {float:none !important; width:auto !important;}\nhtml.dash div.method-subsection.method-declaration { word-wrap: break-word !important;}\nhtml.dash code {word-wrap: break-word !important}\n\nbody.jazz .section, body.jazz .height-container, body.jazz .symbol, body.jazz .task-group-section {padding-right:5px !important}\nbody.jazz {-webkit-nbsp-mode: space !important;}\n\n.jazz h3.section-name:before {margin-top:0px !important; height:auto !important;}\n.jazz .section .section .section-name {padding-top:0px !important}\n.jazz .section-name { margin-top:16px !important}\n\nbody, #contents, #adcHeader\n{\n    min-width:0 !important;\n}\n\n#contents .specbox span\n{\n    white-space:normal !important;\n}\n\narticle#contents a[href=\"\"]\n{\n    pointer-events: none;\n    cursor: default;\n}\n\nbody#conceptual_flow_with_tasks a[href=\"\"]\n{\n    pointer-events: none;\n    cursor: default;\n}\n\nbody\n{\n    overflow:visible !important;\n}\n\nbody.docs-theme--influxdb\n{\n    overflow: auto !important;\n}\n\ndiv#leave_feedback, div#xcode_leave_feedback\n{\n    display:none !important;\n}\n\ndiv#adcHeader, div#adcHeader + header\n{\n    display:none !important;\n}\n\nbody#conceptual_flow_with_tasks div.content-wrapper nav.book-parts\n{\n    display:none !important;\n}\n\nbody#conceptual_flow_with_tasks div.content-wrapper input#ssi_SearchField\n{\n    display:none !important;\n}\n\nbody#conceptual_flow_with_tasks div.content-wrapper section#mini_toc\n{\n    display:none !important;\n}\n\nbody#conceptual_flow_with_tasks section#valence\n{\n    position:static !important;\n}\n\nbody#conceptual_flow_with_tasks div.pixel-line {display:none !important;}\n\nbody#conceptual_flow_with_tasks div.content-wrapper\n{\n    margin:0px !important;\n    width:auto !important;\n    padding:0 0px 0 0px !important;\n}\n\nbody#conceptual_flow_with_tasks div.content-wrapper section#next_previous\n{\n    position:relative !important;\n    width: auto !important;\n}\n\nbody#conceptual_flow_with_tasks div.content-wrapper article.chapter\n{\n    margin-left:0px !important;\n    margin-right:0px !important;\n    width:auto !important;\n}\n\nbody#conceptual_flow_with_tasks header#ios_header\n{\n    display:none !important;\n}\n\n.rubyDashNamespaceClass\n{\n    background:url(Dash-Intercept-ClassRuby.png) transparent no-repeat;\n    background-image: -webkit-image-set(url(DashClassRuby.png) 1x, url(Dash-Intercept-ClassRubyRetina.png) 2x);\n    background-size:14px 14px;\n    padding-left:18px !important;\n    background-position:left;\n}\n\n.rubyDashNamespaceModule\n{\n    background:url(Dash-Intercept-ModuleRuby.png) transparent no-repeat;\n    background-image: -webkit-image-set(url(Dash-Intercept-ModuleRuby.png) 1x, url(Dash-Intercept-ModuleRubyRetina.png) 2x);\n    background-size:14px 14px;\n    padding-left:18px !important;\n    background-position:left;\n}\n\narticle#contents .task\n{\n    -webkit-transition: none !important;\n    transition: none !important;\n}\n\narticle#contents pre.declaration\n{\n    white-space:pre-wrap !important;\n}\n\ndiv#ppStaticForm\n{\n    display:none !important;\n}\n\ndiv#feedbackForm\n{\n    display:none !important;\n}\n\ndiv.spec_sheet_info_box\n{\n    display:block !important;\n}\n\nbody.class#top, body.file, body.module#top {margin-left:0px !important; margin-bottom:40px !important}\nbody.class#top #validator-badges, body.file #validator-badges, body.module#top #validator-badges {display:none !important}\nbody.class#top h1 span, body.class#top h2 span, body.class#top h3 span, body.class#top h4 span, body.class#top h5 span, body.class#top h6 span, body.file h1 span, body.file h2 span, body.file h3 span, body.file h4 span, body.file h5 span, body.file h6 span, body.module#top h1 span, body.module#top h2 span, body.module#top h3 span, body.module#top h4 span, body.module#top h5 span, body.module#top h6 span {display:none !important}\nbody.class#top #metadata, body.file #metadata, body.module#top #metadata {display:none !important}\nbody.class#top div#documentation, body.file div#documentation, body.module#top div#documentation {margin: 10px 10px 0px 10px !important}\nbody.class#top div#documentation div.method-detail:hover, body.file div#documentation div.method-detail:hover, body.module#topdiv#documentation div.method-detail:hover {background-color:rgba(1,1,1,0) !important}\nbody.class#top div#documentation div.section div.target-section, body.file div#documentation div.section div.target-section, body.module#top div#documentation div.section div.target-section {border:0px !important; border-left-width: 0px !important; padding:0px !important;background:rgba(1,1,1,0) !important}\n\nbody.class#top div#documentation .class::after, body.module#top div#documentation .module::after  {content:\"Loading...\"; display:block; font-size:14px;}\nbody.class#top div#documentation .class.class-loaded::after, body.module#top div#documentation .module.class-loaded::after {content:none !important}\nbody.class#top div#documentation .class.class-loaded span, body.module#top div#documentation .module.class-loaded span { display:block !important; font-size:14px !important; padding:0px !important; margin:0px !important; color:inherit !important;}\nbody.class#top div#documentation .class.class-loaded span a, body.module#top div#documentation .module.class-loaded span a { font-size:14px !important; color:inherit !important; text-decoration:underline !important;}\nbody.class#top div#documentation .class.class-loaded span a:hover, body.module#top div#documentation .module.class-loaded span a:hover { border-bottom:0px !important; color:red !important;}\n\nbody.appledoc {background:transparent !important; }\nbody.appledoc > header, body.appledoc > aside {display:none !important}\nbody.appledoc > article {margin-top:0px !important}\nbody.appledoc .container {padding-left: 0px !important; padding-right:0px !important; max-width: none !important;}\nbody.appledoc #content {padding: 0px 25px 30px !important; border: 0px !important}\nbody.appledoc article #content .title {padding-top:0px !important}\nbody.appledoc .method-info .pointy-thing::before { content: normal !important}\n\n.subsubtitle {height:100% !important}\n#bodyText{margin-left:0px !important}\n#tocMenu{display:none !important}\n#tocContainer{display:none !important}\n#tocPinky{display:none !important}\n#headerButtons{display:none !important}\n#top_header{display:none !important}\n#contents{left:0px !important;position:static !important; top:0px !important; border-top:0px !important; margin-top:0px !important; padding-top:0px !important;}\n#overview_contents{left:0px !important;position:static !important; top:0px !important; border-top:0px !important}\n#maincontainer{position:static !important}\n#mainpinky{display:none !important}\n#content{position:static !important}\n#tocContainer.isShowingTOC{display:none !important}\n#contents.isShowingTOC{left:0px !important}\n#overview_contents{position:static !important;top:0 !important;border-top:0 !important;}\n"
  },
  {
    "path": "Dash/whitespace_tokenizer.c",
    "content": "#include <assert.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"whitespace_tokenizer.h\"\n\nstatic int whitespaceDelim(whitespace_tokenizer *t, unsigned char c){\n    return c == ' ' || c == '*';\n}\n\n/*\n ** Create a new tokenizer instance.\n */\nint whitespaceCreate(\n                        int argc, const char * const *argv,\n                        sqlite3_tokenizer **ppTokenizer\n                        ){\n    whitespace_tokenizer *t;\n    t = (whitespace_tokenizer *) sqlite3_malloc(sizeof(*t));\n    if( t==NULL ) return SQLITE_NOMEM;\n    memset(t, 0, sizeof(*t));\n    \n    *ppTokenizer = &t->base;\n    return SQLITE_OK;\n}\n\n/*\n ** Destroy a tokenizer\n */\nint whitespaceDestroy(sqlite3_tokenizer *pTokenizer){\n    sqlite3_free(pTokenizer);\n    return SQLITE_OK;\n}\n\n/*\n ** Prepare to begin tokenizing a particular string.  The input\n ** string to be tokenized is pInput[0..nBytes-1].  A cursor\n ** used to incrementally tokenize this string is returned in\n ** *ppCursor.\n */\nint whitespaceOpen(\n                      sqlite3_tokenizer *pTokenizer,         /* The tokenizer */\n                      const char *pInput, int nBytes,        /* String to be tokenized */\n                      sqlite3_tokenizer_cursor **ppCursor    /* OUT: Tokenization cursor */\n                      ){\n    whitespace_tokenizer_cursor *c;\n        \n    c = (whitespace_tokenizer_cursor *) sqlite3_malloc(sizeof(*c));\n    if( c==NULL ) return SQLITE_NOMEM;\n    \n    c->pInput = pInput;\n    if( pInput==0 ){\n        c->nBytes = 0;\n    }else if( nBytes<0 ){\n        c->nBytes = (int)strlen(pInput);\n    }else{\n        c->nBytes = nBytes;\n    }\n    c->iOffset = 0;                 /* start tokenizing at the beginning */\n    c->iToken = 0;\n    c->pToken = NULL;               /* no space allocated, yet. */\n    c->nTokenAllocated = 0;\n    \n    *ppCursor = &c->base;\n    return SQLITE_OK;\n}\n\n/*\n ** Close a tokenization cursor previously opened by a call to\n ** whitespaceOpen() above.\n */\nint whitespaceClose(sqlite3_tokenizer_cursor *pCursor){\n    whitespace_tokenizer_cursor *c = (whitespace_tokenizer_cursor *) pCursor;\n    sqlite3_free(c->pToken);\n    sqlite3_free(c);\n    return SQLITE_OK;\n}\n\n/*\n ** Extract the next token from a tokenization cursor.  The cursor must\n ** have been opened by a prior call to whitespaceOpen().\n */\nint whitespaceNext(\n                      sqlite3_tokenizer_cursor *pCursor,  /* Cursor returned by whitespaceOpen */\n                      const char **ppToken,               /* OUT: *ppToken is the token text */\n                      int *pnBytes,                       /* OUT: Number of bytes in token */\n                      int *piStartOffset,                 /* OUT: Starting offset of token */\n                      int *piEndOffset,                   /* OUT: Ending offset of token */\n                      int *piPosition                     /* OUT: Position integer of token */\n                      ){\n    whitespace_tokenizer_cursor *c = (whitespace_tokenizer_cursor *) pCursor;\n    whitespace_tokenizer *t = (whitespace_tokenizer *) pCursor->pTokenizer;\n    unsigned char *p = (unsigned char *)c->pInput;\n    \n    while( c->iOffset<c->nBytes ){\n        int iStartOffset;\n        \n        /* Scan past delimiter characters */\n        while( c->iOffset<c->nBytes && whitespaceDelim(t, p[c->iOffset]) ){\n            c->iOffset++;\n        }\n        \n        /* Count non-delimiter characters. */\n        iStartOffset = c->iOffset;\n        while( c->iOffset<c->nBytes && !whitespaceDelim(t, p[c->iOffset]) ){\n            c->iOffset++;\n        }\n        \n        if( c->iOffset>iStartOffset ){\n            int i, n = c->iOffset-iStartOffset;\n            if( n>c->nTokenAllocated ){\n                char *pNew;\n                c->nTokenAllocated = n+20;\n                pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated);\n                if( !pNew ) return SQLITE_NOMEM;\n                c->pToken = pNew;\n            }\n            for(i=0; i<n; i++){\n                /* TODO(shess) This needs expansion to handle UTF-8\n                 ** case-insensitivity.\n                 */\n                unsigned char ch = p[iStartOffset+i];\n                c->pToken[i] = (char)((ch>='A' && ch<='Z') ? ch-'A'+'a' : ch);\n            }\n            *ppToken = c->pToken;\n            *pnBytes = n;\n            *piStartOffset = iStartOffset;\n            *piEndOffset = c->iOffset;\n            *piPosition = c->iToken++;\n            \n            return SQLITE_OK;\n        }\n    }\n    return SQLITE_DONE;\n}\n\n/*\n ** Allocate a new whitespace tokenizer.  Return a pointer to the new\n ** tokenizer in *ppModule\n */\nvoid sqlite3Fts3WhitespaceTokenizerModule(\n                                      sqlite3_tokenizer_module const**ppModule\n                                      ){\n    *ppModule = &whitespaceTokenizerModule;\n}\n\nvoid rankfunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){\n    unsigned int *aMatchinfo;       /* Return value of matchinfo() */\n    int nCol;                       /* Number of columns in the table */\n    int nPhrase;                    /* Number of phrases in the query */\n    int iPhrase;                    /* Current phrase */\n    double score = 0.0;             /* Value to return */\n\n    /* Check that the number of arguments passed to this function is correct.\n     ** If not, jump to wrong_number_args. Set aMatchinfo to point to the array\n     ** of unsigned integer values returned by FTS function matchinfo. Set\n     ** nPhrase to contain the number of reportable phrases in the users full-text\n     ** query, and nCol to the number of columns in the table.\n     */\n    aMatchinfo = (unsigned int *)sqlite3_value_blob(apVal[0]);\n    nPhrase = aMatchinfo[0];\n    nCol = aMatchinfo[1];\n    if ( (nVal - 1) > nCol ) goto wrong_number_args;\n    \n    \n    /* Iterate through each phrase in the users query. */\n    for(iPhrase=0; iPhrase<nPhrase; iPhrase++){\n        \n        /* Now iterate through each column in the users query. For each column,\n         ** increment the relevancy score by:\n         **\n         **   (<hit count> / <global hit count>) * <column weight>\n         **\n         ** aPhraseinfo[] points to the start of the data for phrase iPhrase. So\n         ** the hit count and global hit counts for each column are found in\n         ** aPhraseinfo[iCol*3] and aPhraseinfo[iCol*3+1], respectively.\n         */\n        unsigned int *aPhraseinfo = &aMatchinfo[2 + iPhrase*nCol*3];\n        int iCol = 1;\n        int nHitCount = aPhraseinfo[3*iCol];\n        if( nHitCount>0 )\n        {\n            score += 1;\n        }\n    }\n    \n    sqlite3_result_double(pCtx, score);\n    return;\n    \n    /* Jump here if the wrong number of arguments are passed to this function */\nwrong_number_args:\n    sqlite3_result_error(pCtx, \"wrong number of arguments to function rank()\", -1);\n}\n\nvoid dashCompress(sqlite3_context *context, int argc, sqlite3_value **argv){\n    if(argc == 1)\n    {\n        const char *text = (const char*)sqlite3_value_text(argv[0]);\n        for(int i = 0; text[i] != '\\0'; i++)\n        {\n            if(text[i] == ' ')\n            {\n                char compressed[i+3];\n                compressed[0] = '`';\n                compressed[1] = '`';\n                memcpy(compressed+2, text, i);\n                compressed[i+2] = '\\0';\n                sqlite3_result_text(context, compressed, -1, SQLITE_TRANSIENT);\n                return;\n            }\n        }\n        sqlite3_result_text(context, text, -1, SQLITE_TRANSIENT);\n        return;\n    }\n    sqlite3_result_null(context);\n}\n\nvoid dashUncompress(sqlite3_context *context, int argc, sqlite3_value **argv){\n    if(argc == 1)\n    {\n        const char *text = (const char*)sqlite3_value_text(argv[0]);\n        size_t len = strlen(text);\n        if(len > 2 && text[0] == '`' && text[1] == '`')\n        {\n            size_t actualLen = len-2;\n            size_t suffixLength = ((actualLen*(actualLen+1))/2)+actualLen+1;\n            char suffix[suffixLength];\n            int suffixIndex = 0;\n            for(int i = 2; i < len; i++)\n            {\n                for(int j = i; j < len; j++)\n                {\n                    suffix[suffixIndex] = text[j];\n                    ++suffixIndex;\n                }\n                if(text[i] == '`')\n                {\n                    for(int j = i+1; j < len; j++)\n                    {\n                        if(text[j] == '`')\n                        {\n                            i = j;\n                            break;\n                        }\n                    }\n                }\n                if(i+1<len)\n                {\n                    suffix[suffixIndex] = ' ';\n                    ++suffixIndex;\n                }\n            }\n            suffix[suffixIndex] = '\\0';\n            sqlite3_result_text(context, suffix, -1, SQLITE_TRANSIENT);\n        }\n        else\n        {\n            sqlite3_result_text(context, text, -1, SQLITE_TRANSIENT);\n        }\n        return;\n    }\n    sqlite3_result_null(context);\n}\n\n\n"
  },
  {
    "path": "Dash/whitespace_tokenizer.h",
    "content": "#ifndef Dash_whitespace_tokenizer_h\n#define Dash_whitespace_tokenizer_h\n\n/*\n ** 2006 July 10\n **\n ** The author disclaims copyright to this source code.\n **\n *************************************************************************\n ** Defines the interface to tokenizers used by fulltext-search.  There\n ** are three basic components:\n **\n ** sqlite3_tokenizer_module is a singleton defining the tokenizer\n ** interface functions.  This is essentially the class structure for\n ** tokenizers.\n **\n ** sqlite3_tokenizer is used to define a particular tokenizer, perhaps\n ** including customization information defined at creation time.\n **\n ** sqlite3_tokenizer_cursor is generated by a tokenizer to generate\n ** tokens from a particular input.\n */\n\n/* TODO(shess) Only used for SQLITE_OK and SQLITE_DONE at this time.\n ** If tokenizers are to be allowed to call sqlite3_*() functions, then\n ** we will need a way to register the API consistently.\n */\n#include \"sqlite3.h\"\n\n/*\n ** Structures used by the tokenizer interface. When a new tokenizer\n ** implementation is registered, the caller provides a pointer to\n ** an sqlite3_tokenizer_module containing pointers to the callback\n ** functions that make up an implementation.\n **\n ** When an fts3 table is created, it passes any arguments passed to\n ** the tokenizer clause of the CREATE VIRTUAL TABLE statement to the\n ** sqlite3_tokenizer_module.xCreate() function of the requested tokenizer\n ** implementation. The xCreate() function in turn returns an\n ** sqlite3_tokenizer structure representing the specific tokenizer to\n ** be used for the fts3 table (customized by the tokenizer clause arguments).\n **\n ** To tokenize an input buffer, the sqlite3_tokenizer_module.xOpen()\n ** method is called. It returns an sqlite3_tokenizer_cursor object\n ** that may be used to tokenize a specific input buffer based on\n ** the tokenization rules supplied by a specific sqlite3_tokenizer\n ** object.\n */\ntypedef struct sqlite3_tokenizer_module sqlite3_tokenizer_module;\ntypedef struct sqlite3_tokenizer sqlite3_tokenizer;\ntypedef struct sqlite3_tokenizer_cursor sqlite3_tokenizer_cursor;\n\nstruct sqlite3_tokenizer_module {\n    \n    /*\n     ** Structure version. Should always be set to 0 or 1.\n     */\n    int iVersion;\n    \n    /*\n     ** Create a new tokenizer. The values in the argv[] array are the\n     ** arguments passed to the \"tokenizer\" clause of the CREATE VIRTUAL\n     ** TABLE statement that created the fts3 table. For example, if\n     ** the following SQL is executed:\n     **\n     **   CREATE .. USING fts3( ... , tokenizer <tokenizer-name> arg1 arg2)\n     **\n     ** then argc is set to 2, and the argv[] array contains pointers\n     ** to the strings \"arg1\" and \"arg2\".\n     **\n     ** This method should return either SQLITE_OK (0), or an SQLite error\n     ** code. If SQLITE_OK is returned, then *ppTokenizer should be set\n     ** to point at the newly created tokenizer structure. The generic\n     ** sqlite3_tokenizer.pModule variable should not be initialised by\n     ** this callback. The caller will do so.\n     */\n    int (*xCreate)(\n                   int argc,                           /* Size of argv array */\n                   const char *const*argv,             /* Tokenizer argument strings */\n                   sqlite3_tokenizer **ppTokenizer     /* OUT: Created tokenizer */\n                   );\n    \n    /*\n     ** Destroy an existing tokenizer. The fts3 module calls this method\n     ** exactly once for each successful call to xCreate().\n     */\n    int (*xDestroy)(sqlite3_tokenizer *pTokenizer);\n    \n    /*\n     ** Create a tokenizer cursor to tokenize an input buffer. The caller\n     ** is responsible for ensuring that the input buffer remains valid\n     ** until the cursor is closed (using the xClose() method).\n     */\n    int (*xOpen)(\n                 sqlite3_tokenizer *pTokenizer,       /* Tokenizer object */\n                 const char *pInput, int nBytes,      /* Input buffer */\n                 sqlite3_tokenizer_cursor **ppCursor  /* OUT: Created tokenizer cursor */\n                 );\n    \n    /*\n     ** Destroy an existing tokenizer cursor. The fts3 module calls this\n     ** method exactly once for each successful call to xOpen().\n     */\n    int (*xClose)(sqlite3_tokenizer_cursor *pCursor);\n    \n    /*\n     ** Retrieve the next token from the tokenizer cursor pCursor. This\n     ** method should either return SQLITE_OK and set the values of the\n     ** \"OUT\" variables identified below, or SQLITE_DONE to indicate that\n     ** the end of the buffer has been reached, or an SQLite error code.\n     **\n     ** *ppToken should be set to point at a buffer containing the\n     ** normalized version of the token (i.e. after any case-folding and/or\n     ** stemming has been performed). *pnBytes should be set to the length\n     ** of this buffer in bytes. The input text that generated the token is\n     ** identified by the byte offsets returned in *piStartOffset and\n     ** *piEndOffset. *piStartOffset should be set to the index of the first\n     ** byte of the token in the input buffer. *piEndOffset should be set\n     ** to the index of the first byte just past the end of the token in\n     ** the input buffer.\n     **\n     ** The buffer *ppToken is set to point at is managed by the tokenizer\n     ** implementation. It is only required to be valid until the next call\n     ** to xNext() or xClose().\n     */\n    /* TODO(shess) current implementation requires pInput to be\n     ** nul-terminated.  This should either be fixed, or pInput/nBytes\n     ** should be converted to zInput.\n     */\n    int (*xNext)(\n                 sqlite3_tokenizer_cursor *pCursor,   /* Tokenizer cursor */\n                 const char **ppToken, int *pnBytes,  /* OUT: Normalized text for token */\n                 int *piStartOffset,  /* OUT: Byte offset of token in input buffer */\n                 int *piEndOffset,    /* OUT: Byte offset of end of token in input buffer */\n                 int *piPosition      /* OUT: Number of tokens returned before this one */\n                 );\n    \n    /***********************************************************************\n     ** Methods below this point are only available if iVersion>=1.\n     */\n    \n    /*\n     ** Configure the language id of a tokenizer cursor.\n     */\n    int (*xLanguageid)(sqlite3_tokenizer_cursor *pCsr, int iLangid);\n};\n\nstruct sqlite3_tokenizer {\n    const sqlite3_tokenizer_module *pModule;  /* The module for this tokenizer */\n    /* Tokenizer implementations will typically add additional fields */\n};\n\nstruct sqlite3_tokenizer_cursor {\n    sqlite3_tokenizer *pTokenizer;       /* Tokenizer for this cursor. */\n    /* Tokenizer implementations will typically add additional fields */\n};\n\nint fts3_global_term_cnt(int iTerm, int iCol);\nint fts3_term_cnt(int iTerm, int iCol);\n\ntypedef struct whitespace_tokenizer {\n    sqlite3_tokenizer base;\n    char delim[128];             /* flag ASCII delimiters */\n} whitespace_tokenizer;\n\ntypedef struct whitespace_tokenizer_cursor {\n    sqlite3_tokenizer_cursor base;\n    const char *pInput;          /* input we are tokenizing */\n    int nBytes;                  /* size of the input */\n    int iOffset;                 /* current position in pInput */\n    int iToken;                  /* index of next token to be returned */\n    char *pToken;                /* storage for current token */\n    int nTokenAllocated;         /* space allocated to zToken buffer */\n} whitespace_tokenizer_cursor;\n\nvoid sqlite3Fts3WhitespaceTokenizerModule(\n                                          sqlite3_tokenizer_module const**ppModule\n                                          );\n\nint whitespaceCreate(\n                            int argc, const char * const *argv,\n                            sqlite3_tokenizer **ppTokenizer\n                            );\nint whitespaceDestroy(sqlite3_tokenizer *pTokenizer);\nint whitespaceOpen(\n                          sqlite3_tokenizer *pTokenizer,         /* The tokenizer */\n                          const char *pInput, int nBytes,        /* String to be tokenized */\n                          sqlite3_tokenizer_cursor **ppCursor    /* OUT: Tokenization cursor */\n                          );\nint whitespaceClose(sqlite3_tokenizer_cursor *pCursor);\nint whitespaceNext(\n                          sqlite3_tokenizer_cursor *pCursor,  /* Cursor returned by whitespaceOpen */\n                          const char **ppToken,               /* OUT: *ppToken is the token text */\n                          int *pnBytes,                       /* OUT: Number of bytes in token */\n                          int *piStartOffset,                 /* OUT: Starting offset of token */\n                          int *piEndOffset,                   /* OUT: Ending offset of token */\n                          int *piPosition                     /* OUT: Position integer of token */\n                          );\nstatic const sqlite3_tokenizer_module whitespaceTokenizerModule = {\n    0,\n    whitespaceCreate,\n    whitespaceDestroy,\n    whitespaceOpen,\n    whitespaceClose,\n    whitespaceNext,\n    0,\n};\n\nvoid rankfunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal);\nvoid dashCompress(sqlite3_context *context, int argc, sqlite3_value **argv);\nvoid dashUncompress(sqlite3_context *context, int argc, sqlite3_value **argv);\n\n#endif\n"
  },
  {
    "path": "Dash iOS.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Dash/Dash iOS.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Dash iOS.xcworkspace/xcshareddata/Dash iOS.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>IDESourceControlProjectFavoriteDictionaryKey</key>\n\t<false/>\n\t<key>IDESourceControlProjectIdentifier</key>\n\t<string>C4B6CCF8-8BDE-49C7-A543-3BDC57330F43</string>\n\t<key>IDESourceControlProjectName</key>\n\t<string>Dash iOS</string>\n\t<key>IDESourceControlProjectOriginsDictionary</key>\n\t<dict>\n\t\t<key>17D30876-33D3-4F61-A64A-2D9FFAB15213</key>\n\t\t<string>file:///Users/bogdan/Dropbox/repos/Dash%20iOS.git/</string>\n\t\t<key>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</key>\n\t\t<string>/Users/bogdan/Dropbox/repos/Dash%20iOS.git</string>\n\t</dict>\n\t<key>IDESourceControlProjectPath</key>\n\t<string>Dash iOS.xcworkspace</string>\n\t<key>IDESourceControlProjectRelativeInstallPathDictionary</key>\n\t<dict>\n\t\t<key>17D30876-33D3-4F61-A64A-2D9FFAB15213</key>\n\t\t<string>../../Dash iOS</string>\n\t\t<key>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</key>\n\t\t<string>..</string>\n\t</dict>\n\t<key>IDESourceControlProjectURL</key>\n\t<string>/Users/bogdan/Dropbox/repos/Dash%20iOS.git</string>\n\t<key>IDESourceControlProjectVersion</key>\n\t<integer>111</integer>\n\t<key>IDESourceControlProjectWCCIdentifier</key>\n\t<string>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</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>17D30876-33D3-4F61-A64A-2D9FFAB15213</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Dash iOS</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>F06BACAE22F3F16FFBC5A77320E75D5F66B7147B</string>\n\t\t\t<key>IDESourceControlWCCName</key>\n\t\t\t<string>Dash%20iOS</string>\n\t\t</dict>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dash iOS.xcworkspace/xcshareddata/Dash iOS.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"F5E17E5D12ABF060C985F6771FC999275B646DB4\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"17D30876-33D3-4F61-A64A-2D9FFAB15213\" : 0,\n    \"F5E17E5D12ABF060C985F6771FC999275B646DB4\" : 9223372036854775807\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"C4B6CCF8-8BDE-49C7-A543-3BDC57330F43\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"17D30876-33D3-4F61-A64A-2D9FFAB15213\" : \"Dash iOS\",\n    \"F5E17E5D12ABF060C985F6771FC999275B646DB4\" : \"Dash%20iOS\\/\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"Dash iOS\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"Dash iOS.xcworkspace\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"file:\\/\\/\\/Users\\/bogdan\\/Dropbox\\/repos\\/Dash%20iOS.git\\/\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"17D30876-33D3-4F61-A64A-2D9FFAB15213\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"\\/Users\\/bogdan\\/Dropbox\\/repos\\/Dash%20iOS.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"F5E17E5D12ABF060C985F6771FC999275B646DB4\"\n    }\n  ]\n}"
  },
  {
    "path": "Dash iOS.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/Apple_Docs_Framework.h",
    "content": "#import <UIKit/UIKit.h>\n\n//! Project version number for Apple_Docs_Framework.\nFOUNDATION_EXPORT double Apple_Docs_FrameworkVersionNumber;\n\n//! Project version string for Apple_Docs_Framework.\nFOUNDATION_EXPORT const unsigned char Apple_Docs_FrameworkVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Apple_Docs_Framework/PublicHeader.h>\n\n#import <Apple_Docs_Framework/DHViewer.h>\n#import <Apple_Docs_Framework/DHViewerHelper.h>\n#import <Apple_Docs_Framework/DHXcodeHelper.h>\n#import <Apple_Docs_Framework/DHCommandLineParser.h>\n#import <Apple_Docs_Framework/DHTester.h>\n\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/DHCommandLineParser.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface DHCommandLineParser : NSObject\n\n@property (strong) NSString *ownPath;\n@property (strong) NSString *bestMirror;\n@property (strong) NSString *dashPath; // can be nil, added in Dash build number >250 (Dash 3.4.1)\n@property (assign) NSInteger dashBuildNumber; // can be 0, added in Dash build number >250 (Dash 3.4.1)\n\n+ (DHCommandLineParser *)sharedParser;\n\n@end\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/DHTester.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface DHTester : NSObject\n\n@property (assign) BOOL isIOS;\n\n+ (DHTester *)sharedTester;\n- (void)test;\n\n@end\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/DHViewer.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface DHViewer : NSObject\n\n@property (strong) NSString *url;\n@property (strong) NSString *desiredLanguage;\n@property (strong) NSString *requestKey;\n@property (strong) NSMutableDictionary *json;\n@property (strong) NSMutableString *output;\n@property (strong) NSString *currentLanguage;\n@property (strong) NSMutableDictionary *references;\n@property (strong) NSMutableArray *tocEntries;\n@property (strong) NSMutableArray *inheritances;\n@property (assign) BOOL isTesting;\n@property (assign) BOOL isDumping;\n@property (assign) BOOL isPreviewing;\n@property (strong) NSMutableSet *previewedSymbolIds;\n@property (strong) NSString *type;\n@property (assign) BOOL isIOS;\n\n+ (DHViewer *)sharedViewer;\n- (NSString *)htmlOutput;\n- (NSString *)previewHTMLOutput;\n- (NSString *)renderText:(NSString *)textValue;\n- (NSString *)renderContentXML:(id)contentXML;\n- (NSString *)renderDisplayNameXML:(NSString *)displayNameXML;\n- (NSString *)convertDashLinkToLocalDumpIfAppropriate:(NSString *)dashLink;\n- (NSMutableDictionary *)grabJSON;\n+ (void)cleanUp;\n\n@end\n\n#ifndef DHXMLOptions\n#define DHXMLOptions NSXMLNodePreserveNamespaceOrder|NSXMLNodePreserveAttributeOrder|NSXMLNodePreserveEntities|NSXMLNodePreservePrefixes|NSXMLNodePreserveCDATA|NSXMLNodePreserveEmptyElements|NSXMLNodePreserveQuotes|NSXMLNodePreserveWhitespace|NSXMLNodePreserveDTD\n#endif\n\n// Also add these to encodedToHumanJSONMappings!\n\n#define kAbstract @\"a\"\n#define kAdopted_By @\"ab\"\n#define kAlternative_Text @\"al\"\n#define kApp_Extension @\"ae\"\n#define kAttributes @\"at\"\n#define kBeta @\"b\"\n#define kCategory @\"cg\"\n#define kChildren @\"c\"\n#define kCode_Listing @\"cl\"\n#define kConformance @\"co\"\n#define kConstraints @\"cs\"\n#define kContainer_ID @\"cd\"\n#define kCurrent @\"cr\"\n#define kDeclaration @\"d\"\n#define kDeprecated @\"de\"\n#define kDeprecation_Summary @\"ds\"\n#define kReferences @\"f\"\n#define kGenerics @\"g\"\n#define kHeight @\"h\"\n#define kId @\"i\"\n#define kImport_Statement @\"im\"\n#define kInheritance @\"in\"\n#define kIntroduced @\"ir\"\n#define kDefault_Implementations @\"di\"\n#define kIds @\"is\"\n#define kTypedef @\"it\"\n#define kKind @\"k\"\n#define kLanguage @\"l\"\n#define kLanguages @\"ls\"\n#define kModule @\"md\"\n#define kName @\"nm\"\n#define kMedia_Output @\"mp\"\n#define kMessage @\"ms\"\n#define kDisplay_Name @\"n\"\n#define kNested_Types @\"nt\"\n#define kDiscussion @\"o\"\n#define kHierarchy @\"hi\"\n#define kRelated_Project @\"rp\"\n#define kRelated_Project_Link @\"du\"\n#define kOperator_Fixity @\"of\"\n#define kOptional @\"op\"\n#define kRequired @\"rq\"\n#define kPlatform @\"p\"\n#define kParent @\"pa\"\n#define kProtocol_Implementation @\"pm\"\n#define kParameters @\"pr\"\n#define kPlatforms @\"ps\"\n#define kPaths @\"pt\"\n#define kProtocol_Extension @\"px\"\n#define kRole @\"r\"\n#define kRead_Only @\"ro\"\n#define kReturn_Value @\"rv\"\n#define kSymbols @\"s\"\n#define kSee_Also @\"sa\"\n#define kTitle @\"t\"\n#define kTable @\"tb\"\n#define kUSR @\"u\"\n#define kURL @\"ur\"\n#define kHasDefaultImplementation @\"dc\"\n#define kReallyHasDefaultImplementation @\"hc\"\n#define kApp_Extension_Availability @\"v\"\n#define kValue @\"vl\"\n#define kWidth @\"w\"\n#define kContent @\"x\"\n#define kAvailability @\"y\"\n#define k1x_Scale @\"1x\"\n#define k1x_DarkScale @\"d1x\"\n#define k2x_Scale @\"2x\"\n#define k2x_DarkScale @\"d2x\"\n#define kMissing_Paths @\"xp\"\n#define kAvailabilityConstraints @\"availabilityConstraints\"\n#define kNewAvailabilityConstraints @\"yc\"\n#define kPageType @\"rg\"\n#define kPossible_Values @\"av\"\n#define kProperty_List_Declaration @\"atd\"\n#define kProperty_List_Declaration_Type @\"bt\"\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/DHViewerHelper.h",
    "content": "#import <Foundation/Foundation.h>\n\n@interface DHViewerHelper : NSObject\n\n+ (DHViewerHelper *)sharedViewerHelper;\n- (NSString *)encodedTypeToHumanType:(NSString *)encodedType;\n- (NSString *)encodedTypeToDashType:(NSString *)encodedType;\n- (NSString *)htmlForLanguagePickerForLanguage:(NSString *)language;\n- (NSString *)htmlForPlatformSidebarForPlatform:(NSDictionary *)platform viewer:(DHViewer *)viewer;\n- (NSString *)htmlForSymbol:(NSDictionary *)symbol taskTitle:(NSString *)taskTitle viewer:(DHViewer *)viewer;\n- (BOOL)shouldShowPreviewForSymbol:(NSDictionary *)symbol;\n- (NSMutableArray *)fullInheritanceStartingWith:(NSArray *)inheritance indentLevel:(NSInteger)level;\n\n@end\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Headers/DHXcodeHelper.h",
    "content": "#import <Foundation/Foundation.h>\n\n@class FMDatabase;\n\n@interface DHXcodeHelper : NSObject\n\n@property (strong) NSString *xcodePath;\n@property (strong) NSString *xcodeDocsPath;\n@property (strong) FMDatabase *cacheDB;\n@property (strong) FMDatabase *mapDB;\n@property (strong) FMDatabase *docsetDB;\n@property (strong) NSDictionary *encodedToHumanJSONMappings;\n@property (strong) NSMutableDictionary *requestKeyReferencePathCache;\n@property (strong) NSMutableDictionary *usrCache;\n@property (strong) NSMutableDictionary *nameCache;\n@property (strong) NSMutableDictionary *inheritancesCache;\n@property (strong) NSMutableDictionary *dataCache;\n@property (strong) NSMutableDictionary *topicIdCache;\n@property (strong) NSNumber *_isXcode9;\n@property (strong) NSNumber *_usrInSearchIndex;\n\n+ (DHXcodeHelper *)sharedXcodeHelper;\n- (NSString *)xcodeDocsVersion;\n- (void)enumerateLinesOfSearchIndex:(NSString *)indexName usingBlock:(void(^)(NSString *line, BOOL *stop))block;\n- (NSMutableDictionary *)jsonForHref:(NSString *)href;\n- (NSData *)cacheDataForHref:(NSString *)href;\n- (id)makeJSONHumanReadable:(id)json;\n- (NSString *)requestKeyForTopicId:(NSString *)topicId language:(NSString *)language;\n- (NSDictionary *)mapRowForRequestKey:(NSString *)requestKey;\n- (NSArray *)allRequestKeys;\n- (NSArray *)inheritancesForRequestKey:(NSString *)requestKey;\n- (NSString *)requestKeyForReferencePath:(NSString *)referencePath language:(NSString *)language;\n- (NSString *)imageBase64StringForHref:(NSString *)href;\n- (NSString *)nameForRequestKey:(NSString *)requestKey;\n- (NSString *)requestKeyForUSR:(NSString *)usr;\n- (NSString *)xcodeCacheDBPath;\n- (NSString *)cacheDBPath;\n- (NSString *)mapDBPath;\n- (NSString *)xcodeMapDBPath;\n- (void)addIndexesToDatabasesAtPath:(NSString *)path;\n- (NSString *)fsFolderPath;\n- (NSString *)xcodeFSFolderPath;\n+ (void)cleanUp;\n- (BOOL)isXcode9;\n\n@end\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/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>BuildMachineOSBuild</key>\n\t<string>18F203</string>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>Apple_Docs_Framework</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>com.kapeli.Apple-Docs-Framework</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>Apple_Docs_Framework</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>DTCompiler</key>\n\t<string>com.apple.compilers.llvm.clang.1_0</string>\n\t<key>DTPlatformBuild</key>\n\t<string>10E1001</string>\n\t<key>DTPlatformName</key>\n\t<string>iphonesimulator</string>\n\t<key>DTPlatformVersion</key>\n\t<string>12.2</string>\n\t<key>DTSDKBuild</key>\n\t<string>16E226</string>\n\t<key>DTSDKName</key>\n\t<string>iphonesimulator12.2</string>\n\t<key>DTXcode</key>\n\t<string>1020</string>\n\t<key>DTXcodeBuild</key>\n\t<string>10E1001</string>\n\t<key>MinimumOSVersion</key>\n\t<string>9.0</string>\n\t<key>UIDeviceFamily</key>\n\t<array>\n\t\t<integer>1</integer>\n\t\t<integer>2</integer>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/Modules/module.modulemap",
    "content": "framework module Apple_Docs_Framework {\n  umbrella header \"Apple_Docs_Framework.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Frameworks/Apple_Docs_Framework.framework/prism.js",
    "content": "/* PrismJS 1.14.0\n https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript+c+cpp+json+markdown+objectivec */\nvar _self = (typeof window !== 'undefined')\n? window   // if in browser\n: (\n   (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n   ? self // if in worker\n   : {}   // if in node js\n   );\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n * MIT license http://www.opensource.org/licenses/mit-license.php/\n * @author Lea Verou http://lea.verou.me\n */\n\nvar Prism = (function(){\n             \n             // Private helper vars\n             var lang = /\\blang(?:uage)?-([\\w-]+)\\b/i;\n             var uniqueId = 0;\n             \n             var _ = _self.Prism = {\n             manual: _self.Prism && _self.Prism.manual,\n             disableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n             util: {\n             encode: function (tokens) {\n             if (tokens instanceof Token) {\n             return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);\n             } else if (_.util.type(tokens) === 'Array') {\n             return tokens.map(_.util.encode);\n             } else {\n             return tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n             }\n             },\n             \n             type: function (o) {\n             return Object.prototype.toString.call(o).match(/\\[object (\\w+)\\]/)[1];\n             },\n             \n             objId: function (obj) {\n             if (!obj['__id']) {\n             Object.defineProperty(obj, '__id', { value: ++uniqueId });\n             }\n             return obj['__id'];\n             },\n             \n             // Deep clone a language definition (e.g. to extend it)\n             clone: function (o, visited) {\n             var type = _.util.type(o);\n             visited = visited || {};\n             \n             switch (type) {\n             case 'Object':\n             if (visited[_.util.objId(o)]) {\n             return visited[_.util.objId(o)];\n             }\n             var clone = {};\n             visited[_.util.objId(o)] = clone;\n             \n             for (var key in o) {\n             if (o.hasOwnProperty(key)) {\n             clone[key] = _.util.clone(o[key], visited);\n             }\n             }\n             \n             return clone;\n             \n             case 'Array':\n             if (visited[_.util.objId(o)]) {\n             return visited[_.util.objId(o)];\n             }\n             var clone = [];\n             visited[_.util.objId(o)] = clone;\n             \n             o.forEach(function (v, i) {\n                       clone[i] = _.util.clone(v, visited);\n                       });\n             \n             return clone;\n             }\n             \n             return o;\n             }\n             },\n             \n             languages: {\n             extend: function (id, redef) {\n             var lang = _.util.clone(_.languages[id]);\n             \n             for (var key in redef) {\n             lang[key] = redef[key];\n             }\n             \n             return lang;\n             },\n             \n             /**\n              * Insert a token before another token in a language literal\n              * As this needs to recreate the object (we cannot actually insert before keys in object literals),\n              * we cannot just provide an object, we need anobject and a key.\n              * @param inside The key (or language id) of the parent\n              * @param before The key to insert before. If not provided, the function appends instead.\n              * @param insert Object with the key/value pairs to insert\n              * @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.\n              */\n             insertBefore: function (inside, before, insert, root) {\n             root = root || _.languages;\n             var grammar = root[inside];\n             \n             if (arguments.length == 2) {\n             insert = arguments[1];\n             \n             for (var newToken in insert) {\n             if (insert.hasOwnProperty(newToken)) {\n             grammar[newToken] = insert[newToken];\n             }\n             }\n             \n             return grammar;\n             }\n             \n             var ret = {};\n             \n             for (var token in grammar) {\n             \n             if (grammar.hasOwnProperty(token)) {\n             \n             if (token == before) {\n             \n             for (var newToken in insert) {\n             \n             if (insert.hasOwnProperty(newToken)) {\n             ret[newToken] = insert[newToken];\n             }\n             }\n             }\n             \n             ret[token] = grammar[token];\n             }\n             }\n             \n             // Update references in other language definitions\n             _.languages.DFS(_.languages, function(key, value) {\n                             if (value === root[inside] && key != inside) {\n                             this[key] = ret;\n                             }\n                             });\n             \n             return root[inside] = ret;\n             },\n             \n             // Traverse a language definition with Depth First Search\n             DFS: function(o, callback, type, visited) {\n             visited = visited || {};\n             for (var i in o) {\n             if (o.hasOwnProperty(i)) {\n             callback.call(o, i, o[i], type || i);\n             \n             if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {\n             visited[_.util.objId(o[i])] = true;\n             _.languages.DFS(o[i], callback, null, visited);\n             }\n             else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {\n             visited[_.util.objId(o[i])] = true;\n             _.languages.DFS(o[i], callback, i, visited);\n             }\n             }\n             }\n             }\n             },\n             plugins: {},\n             \n             highlightAll: function(async, callback) {\n             _.highlightAllUnder(document, async, callback);\n             },\n             \n             highlightAllUnder: function(container, async, callback) {\n             var env = {\n             callback: callback,\n             selector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n             };\n             \n             _.hooks.run(\"before-highlightall\", env);\n             \n             var elements = env.elements || container.querySelectorAll(env.selector);\n             \n             for (var i=0, element; element = elements[i++];) {\n             _.highlightElement(element, async === true, env.callback);\n             }\n             },\n             \n             highlightElement: function(element, async, callback) {\n             // Find language\n             var language, grammar, parent = element;\n             \n             while (parent && !lang.test(parent.className)) {\n             parent = parent.parentNode;\n             }\n             \n             if (parent) {\n             language = (parent.className.match(lang) || [,''])[1].toLowerCase();\n             grammar = _.languages[language];\n             }\n             \n             // Set language on the element, if not present\n             element.className = element.className.replace(lang, '').replace(/\\s+/g, ' ') + ' language-' + language;\n             \n             if (element.parentNode) {\n             // Set language on the parent, for styling\n             parent = element.parentNode;\n             \n             if (/pre/i.test(parent.nodeName)) {\n             parent.className = parent.className.replace(lang, '').replace(/\\s+/g, ' ') + ' language-' + language;\n             }\n             }\n             \n             var code = element.textContent;\n             \n             var env = {\n             element: element,\n             language: language,\n             grammar: grammar,\n             code: code\n             };\n             \n             _.hooks.run('before-sanity-check', env);\n             \n             if (!env.code || !env.grammar) {\n             if (env.code) {\n             _.hooks.run('before-highlight', env);\n             env.element.textContent = env.code;\n             _.hooks.run('after-highlight', env);\n             }\n             _.hooks.run('complete', env);\n             return;\n             }\n             \n             _.hooks.run('before-highlight', env);\n             \n             if (async && _self.Worker) {\n             var worker = new Worker(_.filename);\n             \n             worker.onmessage = function(evt) {\n             env.highlightedCode = evt.data;\n             \n             _.hooks.run('before-insert', env);\n             \n             env.element.innerHTML = env.highlightedCode;\n             \n             callback && callback.call(env.element);\n             _.hooks.run('after-highlight', env);\n             _.hooks.run('complete', env);\n             };\n             \n             worker.postMessage(JSON.stringify({\n                                               language: env.language,\n                                               code: env.code,\n                                               immediateClose: true\n                                               }));\n             }\n             else {\n             env.highlightedCode = _.highlight(env.code, env.grammar, env.language);\n             \n             _.hooks.run('before-insert', env);\n             \n             env.element.innerHTML = env.highlightedCode;\n             \n             callback && callback.call(element);\n             \n             _.hooks.run('after-highlight', env);\n             _.hooks.run('complete', env);\n             }\n             },\n             \n             highlight: function (text, grammar, language) {\n             var env = {\n             code: text,\n             grammar: grammar,\n             language: language\n             };\n             _.hooks.run('before-tokenize', env);\n             env.tokens = _.tokenize(env.code, env.grammar);\n             _.hooks.run('after-tokenize', env);\n             return Token.stringify(_.util.encode(env.tokens), env.language);\n             },\n             \n             matchGrammar: function (text, strarr, grammar, index, startPos, oneshot, target) {\n             var Token = _.Token;\n             \n             for (var token in grammar) {\n             if(!grammar.hasOwnProperty(token) || !grammar[token]) {\n             continue;\n             }\n             \n             if (token == target) {\n             return;\n             }\n             \n             var patterns = grammar[token];\n             patterns = (_.util.type(patterns) === \"Array\") ? patterns : [patterns];\n             \n             for (var j = 0; j < patterns.length; ++j) {\n             var pattern = patterns[j],\n             inside = pattern.inside,\n             lookbehind = !!pattern.lookbehind,\n             greedy = !!pattern.greedy,\n             lookbehindLength = 0,\n             alias = pattern.alias;\n             \n             if (greedy && !pattern.pattern.global) {\n             // Without the global flag, lastIndex won't work\n             var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];\n             pattern.pattern = RegExp(pattern.pattern.source, flags + \"g\");\n             }\n             \n             pattern = pattern.pattern || pattern;\n             \n             // Don’t cache length as it changes during the loop\n             for (var i = index, pos = startPos; i < strarr.length; pos += strarr[i].length, ++i) {\n             \n             var str = strarr[i];\n             \n             if (strarr.length > text.length) {\n             // Something went terribly wrong, ABORT, ABORT!\n             return;\n             }\n             \n             if (str instanceof Token) {\n             continue;\n             }\n             \n             if (greedy && i != strarr.length - 1) {\n             pattern.lastIndex = pos;\n             var match = pattern.exec(text);\n             if (!match) {\n             break;\n             }\n             \n             var from = match.index + (lookbehind ? match[1].length : 0),\n             to = match.index + match[0].length,\n             k = i,\n             p = pos;\n             \n             for (var len = strarr.length; k < len && (p < to || (!strarr[k].type && !strarr[k - 1].greedy)); ++k) {\n             p += strarr[k].length;\n             // Move the index i to the element in strarr that is closest to from\n             if (from >= p) {\n             ++i;\n             pos = p;\n             }\n             }\n             \n             // If strarr[i] is a Token, then the match starts inside another Token, which is invalid\n             if (strarr[i] instanceof Token) {\n             continue;\n             }\n             \n             // Number of tokens to delete and replace with the new match\n             delNum = k - i;\n             str = text.slice(pos, p);\n             match.index -= pos;\n             } else {\n             pattern.lastIndex = 0;\n             \n             var match = pattern.exec(str),\n             delNum = 1;\n             }\n             \n             if (!match) {\n             if (oneshot) {\n             break;\n             }\n             \n             continue;\n             }\n             \n             if(lookbehind) {\n             lookbehindLength = match[1] ? match[1].length : 0;\n             }\n             \n             var from = match.index + lookbehindLength,\n             match = match[0].slice(lookbehindLength),\n             to = from + match.length,\n             before = str.slice(0, from),\n             after = str.slice(to);\n             \n             var args = [i, delNum];\n             \n             if (before) {\n             ++i;\n             pos += before.length;\n             args.push(before);\n             }\n             \n             var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);\n             \n             args.push(wrapped);\n             \n             if (after) {\n             args.push(after);\n             }\n             \n             Array.prototype.splice.apply(strarr, args);\n             \n             if (delNum != 1)\n             _.matchGrammar(text, strarr, grammar, i, pos, true, token);\n             \n             if (oneshot)\n             break;\n             }\n             }\n             }\n             },\n             \n             tokenize: function(text, grammar, language) {\n             var strarr = [text];\n             \n             var rest = grammar.rest;\n             \n             if (rest) {\n             for (var token in rest) {\n             grammar[token] = rest[token];\n             }\n             \n             delete grammar.rest;\n             }\n             \n             _.matchGrammar(text, strarr, grammar, 0, 0, false);\n             \n             return strarr;\n             },\n             \n             hooks: {\n             all: {},\n             \n             add: function (name, callback) {\n             var hooks = _.hooks.all;\n             \n             hooks[name] = hooks[name] || [];\n             \n             hooks[name].push(callback);\n             },\n             \n             run: function (name, env) {\n             var callbacks = _.hooks.all[name];\n             \n             if (!callbacks || !callbacks.length) {\n             return;\n             }\n             \n             for (var i=0, callback; callback = callbacks[i++];) {\n             callback(env);\n             }\n             }\n             }\n             };\n             \n             var Token = _.Token = function(type, content, alias, matchedStr, greedy) {\n             this.type = type;\n             this.content = content;\n             this.alias = alias;\n             // Copy of the full string this token was created from\n             this.length = (matchedStr || \"\").length|0;\n             this.greedy = !!greedy;\n             };\n             \n             Token.stringify = function(o, language, parent) {\n             if (typeof o == 'string') {\n             return o;\n             }\n             \n             if (_.util.type(o) === 'Array') {\n             return o.map(function(element) {\n                          return Token.stringify(element, language, o);\n                          }).join('');\n             }\n             \n             var env = {\n             type: o.type,\n             content: Token.stringify(o.content, language, parent),\n             tag: 'span',\n             classes: ['token', o.type],\n             attributes: {},\n             language: language,\n             parent: parent\n             };\n             \n             if (o.alias) {\n             var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];\n             Array.prototype.push.apply(env.classes, aliases);\n             }\n             \n             _.hooks.run('wrap', env);\n             \n             var attributes = Object.keys(env.attributes).map(function(name) {\n                                                              return name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n                                                                                                                        }).join(' ');\n                                                              \n                                                              return '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';\n                                                              \n                                                              };\n                                                              \n                                                              if (!_self.document) {\n                                                              if (!_self.addEventListener) {\n                                                              // in Node.js\n                                                              return _self.Prism;\n                                                              }\n                                                              \n                                                              if (!_.disableWorkerMessageHandler) {\n                                                              // In worker\n                                                              _self.addEventListener('message', function (evt) {\n                                                                                     var message = JSON.parse(evt.data),\n                                                                                     lang = message.language,\n                                                                                     code = message.code,\n                                                                                     immediateClose = message.immediateClose;\n                                                                                     \n                                                                                     _self.postMessage(_.highlight(code, _.languages[lang], lang));\n                                                                                     if (immediateClose) {\n                                                                                     _self.close();\n                                                                                     }\n                                                                                     }, false);\n                                                              }\n                                                              \n                                                              return _self.Prism;\n                                                              }\n                                                              \n                                                              //Get current script and highlight\n                                                              var script = document.currentScript || [].slice.call(document.getElementsByTagName(\"script\")).pop();\n                                                              \n                                                              if (script) {\n                                                              _.filename = script.src;\n                                                              \n                                                              if (!_.manual && !script.hasAttribute('data-manual')) {\n                                                              if(document.readyState !== \"loading\") {\n                                                              if (window.requestAnimationFrame) {\n                                                              window.requestAnimationFrame(_.highlightAll);\n                                                              } else {\n                                                              window.setTimeout(_.highlightAll, 16);\n                                                              }\n                                                              }\n                                                              else {\n                                                              document.addEventListener('DOMContentLoaded', _.highlightAll);\n                                                              }\n                                                              }\n                                                              }\n                                                              \n                                                              return _self.Prism;\n                                                              \n                                                              })();\n             \n             if (typeof module !== 'undefined' && module.exports) {\n             module.exports = Prism;\n             }\n             \n             // hack for components to work correctly in node.js\n             if (typeof global !== 'undefined') {\n             global.Prism = Prism;\n             }\n             ;\n             Prism.languages.markup = {\n             'syntax-comment': /<!--[\\s\\S]*?-->/,\n             'prolog': /<\\?[\\s\\S]+?\\?>/,\n             'doctype': /<!DOCTYPE[\\s\\S]+?>/i,\n             'cdata': /<!\\[CDATA\\[[\\s\\S]*?]]>/i,\n             'tag': {\n             pattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s+[^\\s>\\/=]+(?:=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+))?)*\\s*\\/?>/i,\n                                               greedy: true,\n                                               inside: {\n                                               'tag': {\n                                               pattern: /^<\\/?[^\\s>\\/]+/i,\n                                               inside: {\n                                               'punctuation': /^<\\/?/,\n                                               'namespace': /^[^\\s>\\/:]+:/\n                                               }\n                                               },\n                                               'attr-value': {\n                                               pattern: /=(?:(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1|[^\\s'\">=]+)/i,\n                                                           inside: {\n                                                           'punctuation': [\n                                                                           /^=/,\n                                                                           {\n                                                                           pattern: /(^|[^\\\\])[\"']/,\n                                                                                               lookbehind: true\n                                                                                               }\n                                                                                               ]\n                                                                           }\n                                                                           },\n                                                                           'punctuation': /\\/?>/,\n                                                                           'attr-name': {\n                                                                           pattern: /[^\\s>\\/]+/,\n                                                                           inside: {\n                                                                           'namespace': /^[^\\s>\\/:]+:/\n                                                                           }\n                                                                           }\n                                                                           \n                                                                           }\n                                                                           },\n                                                                           'entity': /&#?[\\da-z]{1,8};/i\n                                                                           };\n                                                                           \n                                                                           Prism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n                                                                           Prism.languages.markup['entity'];\n                                                                           \n                                                                           // Plugin to make entity title show the real entity, idea by Roman Komarov\n                                                                           Prism.hooks.add('wrap', function(env) {\n                                                                                           \n                                                                                           if (env.type === 'entity') {\n                                                                                           env.attributes['title'] = env.content.replace(/&amp;/, '&');\n                                                                                           }\n                                                                                           });\n                                                                           \n                                                                           Prism.languages.xml = Prism.languages.markup;\n                                                                           Prism.languages.html = Prism.languages.markup;\n                                                                           Prism.languages.mathml = Prism.languages.markup;\n                                                                           Prism.languages.svg = Prism.languages.markup;\n                                                                           \n                                                                           Prism.languages.css = {\n                                                                           'syntax-comment': /\\/\\*[\\s\\S]*?\\*\\//,\n                                                                           'atrule': {\n                                                                           pattern: /@[\\w-]+?.*?(?:;|(?=\\s*\\{))/i,\n                                                                           inside: {\n                                                                           'rule': /@[\\w-]+/\n                                                                           // See rest below\n                                                                           }\n                                                                           },\n                                                                           'url': /url\\((?:([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1|.*?)\\)/i,\n                                                                                             'syntax-keyword': /[^{}\\s][^{};]*?(?=\\s*\\{)/,\n                                                                                             'syntax-string': {\n                                                                                             pattern: /(\"|')(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n                                                                                                        greedy: true\n                                                                                                        },\n                                                                                                        'property': /[-_a-z\\xA0-\\uFFFF][-\\w\\xA0-\\uFFFF]*(?=\\s*:)/i,\n                                                                                                        'important': /\\B!important\\b/i,\n                                                                                                        'function': /[-a-z0-9]+(?=\\()/i,\n                                                                                                                                };\n                                                                                                                                \n                                                                                                                                Prism.languages.css['atrule'].inside.rest = Prism.languages.css;\n                                                                                                                                \n                                                                                                                                if (Prism.languages.markup) {\n                                                                                                                                Prism.languages.insertBefore('markup', 'tag', {\n                                                                                                                                                             'style': {\n                                                                                                                                                             pattern: /(<style[\\s\\S]*?>)[\\s\\S]*?(?=<\\/style>)/i,\n                                                                                                                                                             lookbehind: true,\n                                                                                                                                                             inside: Prism.languages.css,\n                                                                                                                                                             alias: 'language-css',\n                                                                                                                                                             greedy: true\n                                                                                                                                                             }\n                                                                                                                                                             });\n                                                                                                                                \n                                                                                                                                Prism.languages.insertBefore('inside', 'attr-value', {\n                                                                                                                                                             'style-attr': {\n                                                                                                                                                             pattern: /\\s*style=(\"|')(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])*\\1/i,\n                                                                                                                                                                                 inside: {\n                                                                                                                                                                                 'attr-name': {\n                                                                                                                                                                                 pattern: /^\\s*style/i,\n                                                                                                                                                                                 inside: Prism.languages.markup.tag.inside\n                                                                                                                                                                                 },\n                                                                                                                                                                                 'punctuation': /^\\s*=\\s*['\"]|['\"]\\s*$/,\n                                                                                                                                                                                                          'attr-value': {\n                                                                                                                                                                                                          pattern: /.+/i,\n                                                                                                                                                                                                          inside: Prism.languages.css\n                                                                                                                                                                                                          }\n                                                                                                                                                                                                          },\n                                                                                                                                                                                                          alias: 'language-css'\n                                                                                                                                                                                                          }\n                                                                                                                                                                                                          }, Prism.languages.markup.tag);\n                                                                                                                                                                                                          };\n                                                                                                                                                                                                          Prism.languages.clike = {\n                                                                                                                                                                                                          'syntax-placeholder': {\n                                                                                                                                                                                                          pattern: /<#[^#]*#>/,\n                                                                                                                                                                                                          greedy: true\n                                                                                                                                                                                                          },\n                                                                                                                                                                                                          'syntax-comment': [\n                                                                                                                                                                                                                             {\n                                                                                                                                                                                                                             pattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n                                                                                                                                                                                                                             lookbehind: true\n                                                                                                                                                                                                                             },\n                                                                                                                                                                                                                             {\n                                                                                                                                                                                                                             pattern: /(^|[^\\\\:])\\/\\/.*/,\n                                                                                                                                                                                                                             lookbehind: true,\n                                                                                                                                                                                                                             greedy: true\n                                                                                                                                                                                                                             }\n                                                                                                                                                                                                                             ],\n                                                                                                                                                                                                          'syntax-string': {\n                                                                                                                                                                                                          pattern: /[@]?([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n                                                                                                                                                                                                                          greedy: true\n                                                                                                                                                                                                                          },\n                                                                                                                                                                                                                          'syntax-keyword': /\\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue|true|false)\\b/,\n                                                                                                                                                                                                                          'function': /[a-z0-9_]+(?=\\()/i,\n                                                                                                                                                                                                                                                  'syntax-number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n                                                                                                                                                                                                                                                  //    'operator': /--?|\\+\\+?|!=?=?|<=?|>=?|==?=?|&&?|\\|\\|?|\\?|\\*|\\/|~|\\^|%/,\n                                                                                                                                                                                                                                                  };\n                                                                                                                                                                                                                                                  \n                                                                                                                                                                                                                                                  Prism.languages.javascript = Prism.languages.extend('clike', {\n                                                                                                                                                                                                                                                                                                      'syntax-keyword': /\\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\\b/,\n                                                                                                                                                                                                                                                                                                      'syntax-number': /\\b(?:0[xX][\\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\\b|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:[Ee][+-]?\\d+)?/,\n                                                                                                                                                                                                                                                                                                      // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n                                                                                                                                                                                                                                                                                                      'function': /[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*\\()/i,\n                                                                                                                                                                                                                                                                                                                                                       });\n                                                                                                                                                                                                                                                                                                      \n                                                                                                                                                                                                                                                                                                      Prism.languages.insertBefore('javascript', 'keyword', {\n                                                                                                                                                                                                                                                                                                                                   'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                   pattern: /((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s])\\s*)\\/(\\[[^\\]\\r\\n]+]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[gimyu]{0,5}(?=\\s*($|[\\r\\n,.;})\\]]))/,\n                                                                                                                                                                                                                                                                                                                                                    lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                    greedy: true\n                                                                                                                                                                                                                                                                                                                                                    },\n                                                                                                                                                                                                                                                                                                                                                    // This must be declared before keyword because we use \"function\" inside the look-forward\n                                                                                                                                                                                                                                                                                                                                                    'function-variable': {\n                                                                                                                                                                                                                                                                                                                                                    pattern: /[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*(?=\\s*=\\s*(?:function\\b|(?:\\([^()]*\\)|[_$a-z\\xA0-\\uFFFF][$\\w\\xA0-\\uFFFF]*)\\s*=>))/i,\n                                                                                                                                                                                                                                                                                                                                                    alias: 'function'\n                                                                                                                                                                                                                                                                                                                                                    },\n                                                                                                                                                                                                                                                                                                                                                    });\n                                                                                                                                                                                                                                                                                                                                                    \n                                                                                                                                                                                                                                                                                                                                                    Prism.languages.insertBefore('javascript', 'syntax-string', {\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /`(?:\\\\[\\s\\S]|\\${[^}]+}|[^\\\\`])*`/,\n                                                                                                                                                                                                                                                                                                                                                                                 greedy: true,\n                                                                                                                                                                                                                                                                                                                                                                                 inside: {\n                                                                                                                                                                                                                                                                                                                                                                                 'interpolation': {\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /\\${[^}]+}/,\n                                                                                                                                                                                                                                                                                                                                                                                 inside: {\n                                                                                                                                                                                                                                                                                                                                                                                 'interpolation-punctuation': {\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /^\\${|}$/,\n                                                                                                                                                                                                                                                                                                                                                                                 alias: 'punctuation'\n                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                 rest: null // See below\n                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-string': /[\\s\\S]+/\n                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                 });\n                                                                                                                                                                                                                                                                                                                                                    \n                                                                                                                                                                                                                                                                                                                                                    if (Prism.languages.markup) {\n                                                                                                                                                                                                                                                                                                                                                    Prism.languages.insertBefore('markup', 'tag', {\n                                                                                                                                                                                                                                                                                                                                                                                 'script': {\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /(<script[\\s\\S]*?>)[\\s\\S]*?(?=<\\/script>)/i,\n                                                                                                                                                                                                                                                                                                                                                                                 lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                 inside: Prism.languages.javascript,\n                                                                                                                                                                                                                                                                                                                                                                                 alias: 'language-javascript',\n                                                                                                                                                                                                                                                                                                                                                                                 greedy: true\n                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                 });\n                                                                                                                                                                                                                                                                                                                                                    }\n                                                                                                                                                                                                                                                                                                                                                    \n                                                                                                                                                                                                                                                                                                                                                    Prism.languages.js = Prism.languages.javascript;\n                                                                                                                                                                                                                                                                                                                                                    \n                                                                                                                                                                                                                                                                                                                                                    Prism.languages.cfamily = Prism.languages.extend('clike', {\n                                                                                                                                                                                                                                                                                                                                                                                                     'syntax-keyword': /\\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr|alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while|true|false|id|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\\b/,\n                                                                                                                                                                                                                                                                                                                                                                                                     'syntax-number': /(?:\\b0x[\\da-f]+|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:e[+-]?\\d+)?)[ful]*/i,\n                                                                                                                                                                                                                                                                                                                                                                                                     });\n                                                                                                                                                                                                                                                                                                                                                    \n                                                                                                                                                                                                                                                                                                                                                    Prism.languages.insertBefore('swift', 'syntax-keyword', {\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-build-config-keyword': {\n                                                                                                                                                                                                                                                                                                                                                                                 // allow for multiline macro definitions\n                                                                                                                                                                                                                                                                                                                                                                                 // spaces after the # character compile fine with gcc\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /(^\\s*)#\\s*[a-z]+(?:[^\\r\\n\\\\]|\\\\(?:\\r\\n|[\\s\\S]))*/im,\n                                                                                                                                                                                                                                                                                                                                                                                 lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                 alias: 'property',\n                                                                                                                                                                                                                                                                                                                                                                                 inside: {\n                                                                                                                                                                                                                                                                                                                                                                                 // highlight the path of the include statement as a string\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                                                                 pattern: /(#\\s*include\\s*)(?:<.+?>|(\"|')(?:\\\\?.)+?\\2)/,\n                                                                                                                                                                                                                                                                                                                                                                                                                     lookbehind: true\n                                                                                                                                                                                                                                                                                                                                                                                                                     }\n                                                                                                                                                                                                                                                                                                                                                                                                                     }\n                                                                                                                                                                                                                                                                                                                                                                                                                     }\n                                                                                                                                                                                                                                                                                                                                                                                                                     });\n                                                                                                                                                                                                                                                                                                                                                                                                            \n                                                                                                                                                                                                                                                                                                                                                                                                            Prism.languages.json = {\n                                                                                                                                                                                                                                                                                                                                                                                                            'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                                                                                            pattern: /\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?!\\s*:)/,\n                                                                                                                                                                                                                                                                                                                                                                                 greedy: true\n                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+\\.?\\d*|\\B\\.\\d+)(?:[Ee][+-]?\\d+)?/,\n                                                                                                                                                                                                                                                                                                                                                                                 'syntax-keyword': /\\b(?:true|false|null)\\b/i,\n                                                                                                                                                                                                                                                                                                                                                                                 };\n                                                                                                                                                                                                                                                                                                                                                                                 \n                                                                                                                                                                                                                                                                                                                                                                                 Prism.languages.jsonp = Prism.languages.json;\n                                                                                                                                                                                                                                                                                                                                                                                 \n                                                                                                                                                                                                                                                                                                                                                                                 Prism.languages.markdown = Prism.languages.extend('markup', {});\n                                                                                                                                                                                                                                                                                                                                                                                 Prism.languages.insertBefore('markdown', 'prolog', {\n                                                                                                                                                                                                                                                                                                                                                                                                              'blockquote': {\n                                                                                                                                                                                                                                                                                                                                                                                                              // > ...\n                                                                                                                                                                                                                                                                                                                                                                                                              pattern: /^>(?:[\\t ]*>)*/m,\n                                                                                                                                                                                                                                                                                                                                                                                                              alias: 'punctuation'\n                                                                                                                                                                                                                                                                                                                                                                                                              },\n                                                                                                                                                                                                                                                                                                                                                                                                              'code': [\n                                                                                                                                                                                                                                                                                                                                                                                                                       {\n                                                                                                                                                                                                                                                                                                                                                                                                                       // Prefixed by 4 spaces or 1 tab\n                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /^(?: {4}|\\t).+/m,\n                                                                                                                                                                                                                                                                                                                                                                                                                       alias: 'keyword'\n                                                                                                                                                                                                                                                                                                                                                                                                                       },\n                                                                                                                                                                                                                                                                                                                                                                                                                       {\n                                                                                                                                                                                                                                                                                                                                                                                                                       // `code`\n                                                                                                                                                                                                                                                                                                                                                                                                                       // ``code``\n                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /``.+?``|`[^`\\n]+`/,\n                                                                                                                                                                                                                                                                                                                                                                                                                       alias: 'keyword'\n                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                       ],\n                                                                                                                                                                                                                                                                                                                                                                                                              'title': [\n                                                                                                                                                                                                                                                                                                                                                                                                                        {\n                                                                                                                                                                                                                                                                                                                                                                                                                        // title 1\n                                                                                                                                                                                                                                                                                                                                                                                                                        // =======\n                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                        // title 2\n                                                                                                                                                                                                                                                                                                                                                                                                                        // -------\n                                                                                                                                                                                                                                                                                                                                                                                                                        pattern: /\\w+.*(?:\\r?\\n|\\r)(?:==+|--+)/,\n                                                                                                                                                                                                                                                                                                                                                                                                                        alias: 'important',\n                                                                                                                                                                                                                                                                                                                                                                                                                        inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                        punctuation: /==+$|--+$/\n                                                                                                                                                                                                                                                                                                                                                                                                                        }\n                                                                                                                                                                                                                                                                                                                                                                                                                        },\n                                                                                                                                                                                                                                                                                                                                                                                                                        {\n                                                                                                                                                                                                                                                                                                                                                                                                                        // # title 1\n                                                                                                                                                                                                                                                                                                                                                                                                                        // ###### title 6\n                                                                                                                                                                                                                                                                                                                                                                                                                        pattern: /(^\\s*)#+.+/m,\n                                                                                                                                                                                                                                                                                                                                                                                                                        lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                                                        alias: 'important',\n                                                                                                                                                                                                                                                                                                                                                                                                                        inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                        punctuation: /^#+|#+$/\n                                                                                                                                                                                                                                                                                                                                                                                                                        }\n                                                                                                                                                                                                                                                                                                                                                                                                                        }\n                                                                                                                                                                                                                                                                                                                                                                                                                        ],\n                                                                                                                                                                                                                                                                                                                                                                                                              'hr': {\n                                                                                                                                                                                                                                                                                                                                                                                                              // ***\n                                                                                                                                                                                                                                                                                                                                                                                                              // ---\n                                                                                                                                                                                                                                                                                                                                                                                                              // * * *\n                                                                                                                                                                                                                                                                                                                                                                                                              // -----------\n                                                                                                                                                                                                                                                                                                                                                                                                              pattern: /(^\\s*)([*-])(?:[\\t ]*\\2){2,}(?=\\s*$)/m,\n                                                                                                                                                                                                                                                                                                                                                                                                              lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                                              alias: 'punctuation'\n                                                                                                                                                                                                                                                                                                                                                                                                              },\n                                                                                                                                                                                                                                                                                                                                                                                                              'list': {\n                                                                                                                                                                                                                                                                                                                                                                                                              // * item\n                                                                                                                                                                                                                                                                                                                                                                                                              // + item\n                                                                                                                                                                                                                                                                                                                                                                                                              // - item\n                                                                                                                                                                                                                                                                                                                                                                                                              // 1. item\n                                                                                                                                                                                                                                                                                                                                                                                                              pattern: /(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,\n                                                                                                                                                                                                                                                                                                                                                                                                              lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                                              alias: 'punctuation'\n                                                                                                                                                                                                                                                                                                                                                                                                              },\n                                                                                                                                                                                                                                                                                                                                                                                                              'url-reference': {\n                                                                                                                                                                                                                                                                                                                                                                                                              // [id]: http://example.com \"Optional title\"\n                                                                                                                                                                                                                                                                                                                                                                                                              // [id]: http://example.com 'Optional title'\n                                                                                                                                                                                                                                                                                                                                                                                                              // [id]: http://example.com (Optional title)\n                                                                                                                                                                                                                                                                                                                                                                                                              // [id]: <http://example.com> \"Optional title\"\n                                                                                                                                                                                                                                                                                                                                                                                                              pattern: /!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                     inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                     'variable': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                     pattern: /^(!?\\[)[^\\]]+/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 lookbehind: true\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'syntax-string': /(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'punctuation': /^[\\[\\]!:]|[<>]/\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 alias: 'url'\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'bold': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // **strong**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // __strong__\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // Allow only one line break\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 pattern: /(^|[^\\\\])(\\*\\*|__)(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'punctuation': /^\\*\\*|^__|\\*\\*$|__$/\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'italic': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // *em*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // _em_\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // Allow only one line break\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 pattern: /(^|[^\\\\])([*_])(?:(?:\\r?\\n|\\r)(?!\\r?\\n|\\r)|.)+?\\2/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 lookbehind: true,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'punctuation': /^[*_]|[*_]$/\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 'url': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // [example](http://example.com \"Optional title\")\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 // [example] [id]\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 pattern: /!?\\[[^\\]]+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)| ?\\[[^\\]\\n]*\\])/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            'variable': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            pattern: /(!?\\[)[^\\]]+(?=\\]$)/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       lookbehind: true\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            });\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.markdown['bold'].inside['url'] = Prism.languages.markdown['url'];\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.markdown['italic'].inside['url'] = Prism.languages.markdown['url'];\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.markdown['bold'].inside['italic'] = Prism.languages.markdown['italic'];\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.markdown['italic'].inside['bold'] = Prism.languages.markdown['bold'];\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        \n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        // issues: nested multiline comments\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.swift = Prism.languages.extend('clike', {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'syntax-string': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /(\"|\"\"\")(\\\\(?:\\((?:[^()]|\\([^)]+\\))+\\)|\\r\\n|[\\s\\S])|(?!\\1)[^\\\\])*\\1/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       greedy: true,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'interpolation': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /\\\\\\((?:[^()]|\\([^)]+\\))+\\)/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       delimiter: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /\\\\(\\([^)]*\\))/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       alias: 'syntax-code-text',\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       inside: {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'left-paren': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       pattern: /\\(/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   alias: 'syntax-string'\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   'right-paren': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   pattern: /\\)$/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       alias: 'syntax-string'\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       // See rest below\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       // See rest below\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       },\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'syntax-keyword': /\\b(?:as|associativity|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic(?:Type)?|else|enum|extension|fallthrough|final|for|func|get|guard|if|import|in|infix|init|inout|internal|is|lazy|left|let|mutating|new|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|Protocol|public|repeat|required|rethrows|return|right|safe|self|Self|set|static|struct|subscript|super|switch|throws?|try|Type|typealias|unowned|unsafe|var|weak|where|while|willSet|__(?:COLUMN__|FILE__|FUNCTION__|LINE__)|#(?:file|line|column|function|available|selector|keyPath))\\b/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       'syntax-number': /\\b(?:[\\d_]+(?:\\.[\\de_]+)?|0x[a-f0-9_]+(?:\\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b/i,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       });\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.insertBefore('swift', 'syntax-keyword', {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     'syntax-build-config-keyword': /#(?:if|elseif|else|endif)/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     'syntax-build-config-id': /\\b(?:os|arch|swift|canImport|error|warning|targetEnvironment|macOS|macOSApplicationExtension|iOS|iOSApplicationExtension|watchOS|tvOS|simulator|linux|i386|x86_64|arm|arm64)\\b/i\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     });\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.insertBefore('swift', 'function', {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     'atrule': {\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     pattern: /@\\b(?:IB(?:Outlet|Designable|Action|Inspectable)|class_protocol|exported|noreturn|NS(?:Copying|Managed)|objc|UIApplicationMain|auto_closure|escaping|rethrows|available)\\b/,\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     alias: 'syntax-keyword'\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     }\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     });\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.swift['syntax-string'].inside['interpolation'].inside.rest = Prism.languages.swift;\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Prism.languages.swift['syntax-string'].inside['interpolation'].inside.delimiter.inside.rest = Prism.languages.swift;\n"
  },
  {
    "path": "LICENSE",
    "content": "Dash for iOS is distributed under the GNU public license, found below.\n----------------------------------------------------------------------\n                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    {one line to give the program's name and a brief idea of what it does.}\n    Copyright (C) {year}  {name of author}\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    {project}  Copyright (C) {year}  {fullname}\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n"
  },
  {
    "path": "Modified Pods/DTBonjour/.gitignore",
    "content": ".DS_Store\nbuild\n*.mode1v3\n*.pbxuser\nproject.xcworkspace\nxcuserdata\n.svn\n"
  },
  {
    "path": "Modified Pods/DTBonjour/.travis.yml",
    "content": "---\nlanguage: objective-c\n\nbefore_install:\n  - brew update\n  - brew upgrade xctool\n\nbefore_script:\n  - sudo easy_install cpp-coveralls\n\nscript:\n  - xctool project DTBonjour.xcodeproj -scheme \"DTBonjour (iOS)\" build -sdk iphonesimulator -arch i386 ONLY_ACTIVE_ARCH=NO\n  - xctool project DTBonjour.xcodeproj -scheme \"DTBonjour (OS X)\" build -arch x86_64 ONLY_ACTIVE_ARCH=NO\n  - appledoc -o /tmp .\n\nafter_success:\n  - ./coveralls.rb --extension m --exclude-folder Demo --exclude-folder Test --exclude-folder Externals\n"
  },
  {
    "path": "Modified Pods/DTBonjour/AppledocSettings.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>--project-name</key>\n\t<string>DTBonjour</string>\n\t<key>--project-company</key>\n\t<string>Cocoanetics</string>\n\t<key>--project-version</key>\n\t<string>1.0</string>\n\t<key>--company-id</key>\n\t<string>com.cocoanetics</string>\n\t<key>--docset-atom-filename</key>\n\t<string>DTBonjour.atom</string>\n\t<key>--docset-feed-url</key>\n\t<string>https://docs.cocoanetics.com/DTBonjour/%DOCSETATOMFILENAME</string>\n\t<key>--docset-package-url</key>\n\t<string>https://docs.cocoanetics.com/DTBonjour/%DOCSETPACKAGEFILENAME</string>\n\t<key>--docset-fallback-url</key>\n\t<string>https://docs.cocoanetics.com/DTBonjour/</string>\n\t<key>--create-docset</key>\n\t<true/>\n\t<key>--publish-docset</key>\n\t<true/>\n\t<key>--install-docset</key>\n\t<false/>\n\t<key>--logformat</key>\n\t<string>xcode</string>\n\t<key>--keep-intermediate-files</key>\n\t<true/>\n\t<key>--no-repeat-first-par</key>\n\t<true/>\n\t<key>--include</key>\n\t<array>\n\t\t<string>./Documentation/Change Log-template.markdown</string>\n\t</array>\n\t<key>--ignore</key>\n\t<array>\n\t\t<string>*.m</string>\n\t\t<string>Core/Externals</string>\n\t\t<string>Demo</string>\n\t</array>\n\t<key>--index-desc</key>\n\t<string>readme.markdown</string>\n\t<key>--warn-invalid-crossref</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/DTBonjour-Prefix.pch",
    "content": "//\n// Prefix header for all source files of the 'DTFoundation' target in the 'DTFoundation' project\n//\n\n#import <TargetConditionals.h>\n#import <Availability.h>\n\n#ifdef __OBJC__\n\n#if TARGET_OS_IPHONE\n#import <UIKit/UIKit.h>\n#endif\n\n#import <Foundation/Foundation.h>\n\n#endif\n\n\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourDataChunk.h",
    "content": "//\n//  DTBonjourDataChunk.h\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 15.11.12.\n//  Copyright (c) 2012 Cocoanetics. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#import \"DTBonjourDataConnection.h\"\n\n\n/**\n This class represents an object that is being transmitted as a chunk of data comprised of a header and the raw data.\n */\n\n@interface DTBonjourDataChunk : NSObject\n\n/**\n @name Creating Data Chunks\n */\n\n/**\n Creates a data chunk meant for sending.\n @param object An object to be encoded and transmitted\n @param encoding The transport encoding to be used for encoding the object\n @param error An optional error output parameter for when the object cannot be encoded\n */\n- (id)initWithObject:(id)object encoding:(DTBonjourDataConnectionContentType)encoding error:(NSError **)error;\n\n/**\n Creates a data chunk meant for receiving.\n */\n- (id)initForReading;\n\n/**\n @name Getting Information\n */\n\n/**\n @returns `YES` if all bytes have been written/read\n */\n- (BOOL)isTransmissionComplete;\n\n/**\n Number of bytes of the receiver\n */\n@property (nonatomic, readonly) NSUInteger totalBytes;\n\n/**\n Number of bytes that have been transferred already\n */\n@property (nonatomic, readonly) NSUInteger numberOfTransferredBytes;\n\n/**\n Sequence number of this chunk on the connection\n*/\n@property (nonatomic, readonly) NSUInteger sequenceNumber;\n\n/**\n @name Reading/Writing\n */\n\n/**\n Writes the as many bytes to the output stream as it would accept\n @param stream The output stream to write to\n @returns The number of bytes written. -1 means that there was an error.\n */\n- (NSInteger)writeToOutputStream:(NSOutputStream *)stream;\n\n/**\n Reads from the input stream and initializes the header and payload as the necessary data becomes available.\n @param stream The input stream to read from\n @returns The number of bytes read. -1 means that there was an error.\n */\n- (NSInteger)readFromInputStream:(NSInputStream *)stream;\n\n/**\n Decodes the object contained in the received data.\n \n Note: You should only call this method once transmission is complete.\n @see isTransmissionComplete\n */\n- (id)decodedObject;\n\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourDataChunk.m",
    "content": "//\n//  DTBonjourDataChunk.m\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 15.11.12.\n//  Copyright (c) 2012 Cocoanetics. All rights reserved.\n//\n\n#import \"DTBonjourDataChunk.h\"\n#import \"DTBonjourDataConnection.h\"\n#import \"NSScanner+DTBonjour.h\"\n\n#import <Foundation/NSJSONSerialization.h>\n\n\n@interface DTBonjourDataChunk ()\n\n@property (nonatomic, assign) NSUInteger sequenceNumber;\n\n@end\n\n@implementation DTBonjourDataChunk\n{\n\tNSMutableData *_data;\n\t\n\tNSUInteger _numberOfTransferredBytes;\n\tNSUInteger _totalBytes;\n\tNSUInteger _sequenceNumber;\n\t\n\tDTBonjourDataConnectionContentType _encoding;\n\t\n\tNSRange _rangeOfHeader;\n\tNSUInteger _contentLength;\n}\n\n- (id)initWithObject:(id)object encoding:(DTBonjourDataConnectionContentType)encoding error:(NSError **)error\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n\t\t_encoding = encoding;\n\t\t\n\t\tif (![self _encodeObject:object error:error])\n\t\t{\n\t\t\treturn nil;\n\t\t}\n\t}\n\t\n\treturn self;\n}\n\n- (id)initForReading\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n\t\t_data = [[NSMutableData alloc] initWithCapacity:1000];\n\t}\n\t\n\treturn self;\n}\n\n\n\n- (BOOL)_encodeObject:(id)object error:(NSError **)error\n{\n\tNSData *archivedData = nil;\n\tNSString *contentType = nil;\n\t\n\tswitch (_encoding)\n\t{\n\t\tcase DTBonjourDataConnectionContentTypeJSON:\n\t\t{\n\t\t\t// check if our sending encoding type permits this object\n\t\t\tif (![NSJSONSerialization isValidJSONObject:object])\n\t\t\t{\n\t\t\t\tif (error)\n\t\t\t\t{\n\t\t\t\t\tNSString *errorMsg = [NSString stringWithFormat:@\"Object %@ is not a valid root object for JSON serialization\", object];\n\t\t\t\t\tNSDictionary *userInfo = @{NSLocalizedDescriptionKey:errorMsg};\n\t\t\t\t\t*error = [NSError errorWithDomain:DTBonjourDataConnectionErrorDomain code:1 userInfo:userInfo];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn NO;\n\t\t\t}\n\t\t\t\n\t\t\tarchivedData = [NSJSONSerialization dataWithJSONObject:object options:0 error:error];\n\t\t\t\n\t\t\tif (!archivedData)\n\t\t\t{\n\t\t\t\treturn NO;\n\t\t\t}\n\t\t\t\n\t\t\tcontentType = @\"application/json\";\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tcase DTBonjourDataConnectionContentTypeNSCoding:\n\t\t{\n\t\t\t// check if our sending encoding type permits this object\n\t\t\tif (![object conformsToProtocol:@protocol(NSCoding)])\n\t\t\t{\n\t\t\t\tif (error)\n\t\t\t\t{\n\t\t\t\t\tNSString *errorMsg = [NSString stringWithFormat:@\"Object %@ does not conform to NSCoding\", object];\n\t\t\t\t\tNSDictionary *userInfo = @{NSLocalizedDescriptionKey:errorMsg};\n\t\t\t\t\t*error = [NSError errorWithDomain:DTBonjourDataConnectionErrorDomain code:1 userInfo:userInfo];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn NO;\n\t\t\t}\n\t\t\t\n\t\t\tarchivedData = [NSKeyedArchiver archivedDataWithRootObject:object];\n\t\t\tcontentType = @\"application/octet-stream\";\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tdefault:\n\t\t{\n\t\t\tif (error)\n\t\t\t{\n\t\t\t\tNSString *errorMsg = [NSString stringWithFormat:@\"Unknown encoding type %d\", (int)_encoding];\n\t\t\t\tNSDictionary *userInfo = @{NSLocalizedDescriptionKey:errorMsg};\n\t\t\t\t*error = [NSError errorWithDomain:DTBonjourDataConnectionErrorDomain code:1 userInfo:userInfo];\n\t\t\t}\n\t\t\t\n\t\t\treturn NO;\n\t\t}\n\t}\n\t\n\tNSString *type = NSStringFromClass([object class]);\n\tNSString *header = [NSString stringWithFormat:@\"PUT\\r\\nClass: %@\\r\\nContent-Type: %@\\r\\nSequence-Number: %ld\\r\\nContent-Length:%ld\\r\\n\\r\\n\", type, contentType, (unsigned long)_sequenceNumber, (long)[archivedData length]];\n\tNSData *headerData = [header dataUsingEncoding:NSUTF8StringEncoding];\n\n\t_contentLength = [archivedData length];\n\t_rangeOfHeader = NSMakeRange(0, [headerData length]);\n\t\n\t_totalBytes = _rangeOfHeader.length + _contentLength;\n\n\tNSMutableData *data = [[NSMutableData alloc] initWithCapacity:_totalBytes];\n\t\n\t[data appendData:headerData];\n\t[data appendData:archivedData];\n\t\n\t_data = data;\n\t\n\treturn YES;\n}\n\n- (id)decodedObject\n{\n\tif (!_totalBytes || [_data length] < _totalBytes)\n\t{\n\t\tNSLog(@\"Insufficient data received yet for decoding object\");\n\t\treturn nil;\n\t}\n\t\n\tNSInteger indexAfterHeader = NSMaxRange(_rangeOfHeader);\n\tNSRange payloadRange = NSMakeRange(indexAfterHeader, _contentLength);\n\tNSData *payloadData = [_data subdataWithRange:payloadRange];\n\t\n\t// decode data\n\tid object = nil;\n\t\n\tif (_encoding == DTBonjourDataConnectionContentTypeJSON)\n\t{\n\t\tobject = [NSJSONSerialization JSONObjectWithData:payloadData options:0 error:NULL];\n\t}\n\telse if (_encoding == DTBonjourDataConnectionContentTypeNSCoding)\n\t{\n\t\tobject = [NSKeyedUnarchiver unarchiveObjectWithData:payloadData];\n\t}\n\t\n\tif (!object)\n\t{\n\t\tNSLog(@\"Unable to decode object\");\n\t}\n\t\n\treturn object;\n}\n\n\n- (BOOL)_hasCompleteHeader\n{\n\t// find end of header, \\r\\n\\r\\n\n\tNSData *headerEnd = [@\"\\r\\n\\r\\n\" dataUsingEncoding:NSUTF8StringEncoding];\n\t\n\tNSRange headerEndRange = [_data rangeOfData:headerEnd options:0 range:NSMakeRange(0, [_data length])];\n\t\n\tif (headerEndRange.location == NSNotFound)\n\t{\n\t\t// we don't have a complete header\n\t\treturn NO;\n\t}\n\t\n\t// update the range\n\t_rangeOfHeader = NSMakeRange(0, headerEndRange.location + headerEndRange.length);\n\t\n\treturn YES;\n}\n\n- (void)_decodeHeader\n{\n\tNSAssert(_rangeOfHeader.length>0, @\"Don't decode header if range is unknown yet\");\n\t\n\tNSString *string = [[NSString alloc] initWithBytesNoCopy:(void *)[_data bytes] length:_rangeOfHeader.length encoding:NSUTF8StringEncoding freeWhenDone:NO];\n\t\n\tif (!string)\n\t{\n\t\tNSLog(@\"Error decoding header, not a valid NSString\");\n\t\treturn;\n\t}\n\t\n\tNSScanner *scanner = [NSScanner scannerWithString:string];\n\tscanner.charactersToBeSkipped = [NSCharacterSet whitespaceAndNewlineCharacterSet];\n\t\n\tif (![scanner scanString:@\"PUT\" intoString:NULL])\n\t{\n\t\treturn;\n\t}\n\t\n\tNSDictionary *headers;\n\tif (![scanner scanBonjourConnectionHeaders:&headers])\n\t{\n\t\treturn;\n\t}\n\t\n\tNSString *contentType = headers[@\"Content-Type\"];\n\tif ([contentType isEqualToString:@\"application/json\"])\n\t{\n\t\t_encoding = DTBonjourDataConnectionContentTypeJSON;\n\t}\n\telse if ([contentType isEqualToString:@\"application/octet-stream\"])\n\t{\n\t\t_encoding = DTBonjourDataConnectionContentTypeNSCoding;\n\t}\n\telse\n\t{\n\t\tNSLog(@\"Unknown transport type: %@\", contentType);\n\t\treturn;\n\t}\n\t\n\t/*\n\t // unused\n\tNSString *classString = headers[@\"Class\"];\n\t_receivingDataClass = NSClassFromString(classString);\n\t */\n\t\n\t_sequenceNumber = [headers[@\"Sequence-Number:\"] unsignedIntegerValue];\n\t_contentLength = [[[NSNumberFormatter new] numberFromString:headers[@\"Content-Length\"]] unsignedIntegerValue];\n\t_totalBytes = _rangeOfHeader.length + _contentLength;\n}\n\n- (NSInteger)writeToOutputStream:(NSOutputStream *)stream\n{\n\t// how many bytes there are still untransmitted\n\tNSUInteger maxLength = [_data length] - _numberOfTransferredBytes;\n\t\n\tif (!maxLength)\n\t{\n\t\treturn 0;\n\t}\n\n\t// current write position\n\tconst uint8_t *position = [_data bytes]+_numberOfTransferredBytes;\n\t\n\tNSInteger actuallyWritten = [stream write:position maxLength:maxLength];\n\t\n\tif (actuallyWritten>0)\n\t{\n\t\t_numberOfTransferredBytes += actuallyWritten;\n\t}\n\t\n\treturn actuallyWritten;\n}\n\n- (NSInteger)readFromInputStream:(NSInputStream *)stream\n{\n\tuint8_t buffer[2048*8];\n\t\n\tNSUInteger maxLength;\n\n\tBOOL readingHeader;\n\t\n\tif (!_rangeOfHeader.length)\n\t{\n\t\tmaxLength = 1;\n\t\treadingHeader = YES;\n\t}\n\telse\n\t{\n\t\tmaxLength = MIN(sizeof(buffer), (_totalBytes - _numberOfTransferredBytes));\n\t\treadingHeader = NO;\n\t}\n\t\n\tNSInteger actuallyRead = [stream read:(uint8_t *)buffer maxLength:maxLength];\n\t\n\tif (actuallyRead > 0)\n\t{\n\t\t[_data appendBytes:buffer length:actuallyRead];\n\t\t\n\t\tif (readingHeader)\n\t\t{\n\t\t\tif ([self _hasCompleteHeader])\n\t\t\t{\n\t\t\t\t[self _decodeHeader];\n\t\t\t}\n\t\t}\n\t\t\n\t\t_numberOfTransferredBytes += actuallyRead;\n\t}\n\n\treturn actuallyRead;\n}\n\n- (BOOL)isTransmissionComplete\n{\n\tif (!_totalBytes)\n\t{\n\t\treturn NO;\n\t}\n\t\n\treturn (_numberOfTransferredBytes == _totalBytes);\n}\n\n#pragma mark - Properties\n\n@synthesize numberOfTransferredBytes = _numberOfTransferredBytes;\n@synthesize totalBytes = _totalBytes;\n@synthesize sequenceNumber = _sequenceNumber;\n\t\t\t  \n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourDataConnection.h",
    "content": "//\n//  DTBonjourDataConnection.h\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 01.11.12.\n//  Copyright (c) 2012 Oliver Drobnik. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <CoreFoundation/CoreFoundation.h>\n\n/**\n Type of encoding to use for sending objects\n */\ntypedef NS_ENUM(NSUInteger, DTBonjourDataConnectionContentType)\n{\n   /**\n    Encode sent objects with NSCoding\n    */\n\tDTBonjourDataConnectionContentTypeNSCoding = 0,\n   \n   /**\n    Encode sent objects as JSON. Note that not all kinds of Objective-C objects can be represented as JSON.\n    */\n\tDTBonjourDataConnectionContentTypeJSON,\n};\n\nextern NSString * DTBonjourDataConnectionErrorDomain;\nextern NSTimeInterval DTBonjourDataConnectionDefaultTimeout;\n\n@class DTBonjourDataConnection, DTBonjourDataChunk;\n\n\n/**\n Protocol to inform delegate of a DTBonjourDataConnection about what is happening\n */\n@protocol DTBonjourDataConnectionDelegate <NSObject>\n\n@optional\n\n// sending\n\n/**\n Called before the connection will start sending a data chunk\n @param connection The connection\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection willStartSendingChunk:(DTBonjourDataChunk *)chunk;\n\n/**\n Called multiple times while the the connection is sending a data chunk\n @param connection The connection\n @param bytesSent The number of bytes sent so far\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection didSendBytes:(NSUInteger)bytesSent ofChunk:(DTBonjourDataChunk *)chunk;\n\n/**\n Called after the connection did finish sending a data chunk\n @param connection The connection\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection didFinishSendingChunk:(DTBonjourDataChunk *)chunk;\n\n// receiving\n\n/**\n Called before the connection will start receiving a data chunk\n @param connection The connection\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection willStartReceivingChunk:(DTBonjourDataChunk *)chunk;\n\n/**\n Called multiple times while the the connection is receiving a data chunk\n @param connection The connection\n @param bytesReceived The number of bytes received so far\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection didReceiveBytes:(NSUInteger)bytesReceived ofChunk:(DTBonjourDataChunk *)chunk;\n\n/**\n Called after the connection did finish receiving a data chunk\n @param connection The connection\n @param chunk The chunk\n */\n- (void)connection:(DTBonjourDataConnection *)connection didFinishReceivingChunk:(DTBonjourDataChunk *)chunk;\n\n/**\n Called when the connection did received and decode an object\n @param connection The connection\n @param object The decoded object that was received\n */\n- (void)connection:(DTBonjourDataConnection *)connection didReceiveObject:(id)object;\n\n// connection\n\n/**\n Called when the connection was successfully opend.\n @param connection The connection\n */\n- (void)connectionDidOpen:(DTBonjourDataConnection *)connection;\n\n/**\n Called when the connection was closed\n @param connection The connection\n */\n- (void)connectionDidClose:(DTBonjourDataConnection *)connection;\n@end\n\n/**\n This class represents a data connection, established via file handle or Bonjour `NSNetService`\n \n It can be used by itself to establish a connection as a client to a remote server. In the context of a `DTBonjourServer` there might be any number of live connections. In the server context you should not modify the connection delegate as the connections are owned and maintained by the server.\n */\n@interface DTBonjourDataConnection : NSObject\n\n/**\n @name Creating a Data Connection\n */\n\n/**\n Initializes the receiver from a native Posix file handle representing a socket.\n @param nativeSocketHandle The native socket handle to create the connection for\n */\n- (id)initWithNativeSocketHandle:(CFSocketNativeHandle)nativeSocketHandle originAddress:(NSString *)originAddress;\n\n/**\n Initialized the receiver from a Bonjour `NSNetService`\n @param service The `NSNetService` to create the connection for\n */\n- (id)initWithService:(NSNetService *)service;\n\n/**\n Initializes the receiver from the given input and output streams.\n @param inStream Input stream for the connection.\n @param outStream Output stream for the connection.\n */\n- (id)initWithInputStream:(NSInputStream *)inStream outputStream:(NSOutputStream *)outStream;\n\n/**\n @name Connection Lifetime\n */\n\n/**\n Opens the connection and establishes the input and output streams. Cancels the \n opening after a timeout of `DTBonjourDataConnectionDefaultTimeout` seconds.\n @returns `YES` if the connection could be established.\n */\n- (BOOL)open;\n\n/**\n Opens the connection and establishes the input and output streams.\n @param timeout Timeout in seconds after which to cancel the stream opening.\n @returns `YES` if the connection could be established.\n */\n- (BOOL)openWithTimeout:(NSTimeInterval)timeout;\n\n/**\n Closes the connection\n */\n- (void)close;\n\n/**\n @name Sending Objects\n */\n\n/**\n Encodes the passed object via the current sendingContentType and adds it to the output stream.\n \n Note: The return parameter does not tell if the actual sending has already taken place, only if the object could be encoded and enqueued for sending.\n @param object Can be any object that is supported by the current sending content type.\n @param error An option error output parameter\n @returns `YES` if the object was successfully encoded and enqueued for sending\n */\n- (BOOL)sendObject:(id)object error:(NSError **)error;\n\n/**\n @name Getting Information\n */\n\n/**\n @returns `YES` if the connection is open and can be used to send or receive data\n */\n- (BOOL)isOpen;\n\n/**\n A delegate to be informed about activities of the connection. If the connection is owned by a `DTBonjourServer` you should not modify this property.\n */\n@property (nonatomic, weak) id <DTBonjourDataConnectionDelegate> delegate;\n\n/**\n The type of how objects are to be encoded for transit. The default is to encode with NSCoding, JSON is also available as an option.\n \n Note: JSON can only encode `NSArray` and `NSDictionary` root objects.\n */\n@property (nonatomic, assign) DTBonjourDataConnectionContentType sendingContentType;\n\n@property (strong) NSString *originAddress;\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourDataConnection.m",
    "content": "//\n//  DTBonjourDataConnection.m\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 01.11.12.\n//  Copyright (c) 2012 Oliver Drobnik. All rights reserved.\n//\n\n#import \"DTBonjourDataConnection.h\"\n#import \"DTBonjourDataChunk.h\"\n#import \"NSScanner+DTBonjour.h\"\n\n#import <Foundation/NSJSONSerialization.h>\n\n#define kDTBonjourQNetworkAdditionsCheckSEL NSSelectorFromString(@\"netService:didAcceptConnectionWithInputStream:outputStream:\")\n\nNSTimeInterval DTBonjourDataConnectionDefaultTimeout = 60.0;\nNSString * DTBonjourDataConnectionErrorDomain = @\"DTBonjourDataConnection\";\n\n@interface NSNetService (QNetworkAdditions)\n \n- (BOOL)qNetworkAdditions_getInputStream:(out NSInputStream **)inputStreamPtr \n    outputStream:(out NSOutputStream **)outputStreamPtr;\n \n@end\n \n@implementation NSNetService (QNetworkAdditions)\n \n- (BOOL)qNetworkAdditions_getInputStream:(out NSInputStream **)inputStreamPtr \n    outputStream:(out NSOutputStream **)outputStreamPtr\n    // The following works around three problems with \n    // -[NSNetService getInputStream:outputStream:]:\n    //\n    // o <rdar://problem/6868813> -- Currently the returns the streams with \n    //   +1 retain count, which is counter to Cocoa conventions and results in \n    //   leaks when you use it in ARC code.\n    //\n    // o <rdar://problem/9821932> -- If you create two pairs of streams from \n    //   one NSNetService and then attempt to open all the streams simultaneously, \n    //   some of the streams might fail to open.\n    //\n    // o <rdar://problem/9856751> -- If you create streams using \n    //   -[NSNetService getInputStream:outputStream:], start to open them, and \n    //   then release the last reference to the original NSNetService, the \n    //   streams never finish opening.  This problem is exacerbated under ARC \n    //   because ARC is better about keeping things out of the autorelease pool.\n{\n    BOOL                result;\n    CFReadStreamRef     readStream;\n    CFWriteStreamRef    writeStream;\n \n    result = NO;\n    \n    readStream = NULL;\n    writeStream = NULL;\n    \n    if ( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) ) {\n        CFNetServiceRef     netService;\n \n        netService = CFNetServiceCreate(\n            NULL, \n            (__bridge CFStringRef) [self domain], \n            (__bridge CFStringRef) [self type], \n            (__bridge CFStringRef) [self name], \n            0\n        );\n        if (netService != NULL) {\n            CFStreamCreatePairWithSocketToNetService(\n                NULL, \n                netService, \n                ((inputStreamPtr  != nil) ? &readStream  : NULL), \n                ((outputStreamPtr != nil) ? &writeStream : NULL)\n            );\n            CFRelease(netService);\n        }\n        \n        // We have failed if the client requested an input stream and didn't \n        // get one, or requested an output stream and didn't get one.  We also \n        // fail if the client requested neither the input nor the output \n        // stream, but we don't get here in that case.\n        \n        result = ! ((( inputStreamPtr != NULL) && ( readStream == NULL)) || \n                    ((outputStreamPtr != NULL) && (writeStream == NULL)));\n    }\n    if (inputStreamPtr != NULL) {\n        *inputStreamPtr  = CFBridgingRelease(readStream);\n    }\n    if (outputStreamPtr != NULL) {\n        *outputStreamPtr = CFBridgingRelease(writeStream);\n    }\n    \n    return result;\n}\n \n@end\n\n@interface DTBonjourDataConnection () <NSStreamDelegate>\n\n@end\n\n@interface DTBonjourDataChunk (private)\n\n// make read-only property assignable\n@property (nonatomic, assign) NSUInteger sequenceNumber;\n\n@end\n\ntypedef enum\n{\n\tDTBonjourDataConnectionExpectedDataTypeNothing,\n\tDTBonjourDataConnectionExpectedDataTypeHeader,\n\tDTBonjourDataConnectionExpectedDataTypeData\n} DTBonjourDataConnectionExpectedDataType;\n\n@implementation DTBonjourDataConnection\n{\n\tNSInputStream *_inputStream;\n\tNSOutputStream *_outputStream;\n\t\n\tNSMutableArray *_outputQueue;\n\tDTBonjourDataChunk *_receivingChunk;\n\n\tNSUInteger _chunkSequenceNumber;\n\t\n\t__weak id <DTBonjourDataConnectionDelegate> _delegate;\n}\n\n- (id)initWithNativeSocketHandle:(CFSocketNativeHandle)nativeSocketHandle originAddress:(NSString *)originAddress\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n        self.originAddress = originAddress;\n\t\tCFReadStreamRef readStream = NULL;\n\t\tCFWriteStreamRef writeStream = NULL;\n\t\tCFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, &readStream, &writeStream);\n\t\t\n\t\tif (readStream && writeStream)\n\t\t{\n\t\t\tCFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);\n\t\t\tCFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);\n\t\t\t\n\t\t\t_inputStream = (__bridge_transfer NSInputStream *)readStream;\n\t\t\t_outputStream = (__bridge_transfer NSOutputStream *)writeStream;\n\t\t\t\n\t\t\t_outputQueue = [[NSMutableArray alloc] init];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tclose(nativeSocketHandle);\n\t\t\t\n\t\t\treturn nil;\n\t\t}\n\t}\n\t\n\treturn self;\n}\n\n- (id)initWithService:(NSNetService *)service\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n  \tNSInputStream *in;\n    NSOutputStream *out;\n\n    if (![[service delegate] respondsToSelector:kDTBonjourQNetworkAdditionsCheckSEL])\n    {\n      // Older iOS/OSX versions need a patch for getting input and output\n      // streams see the `QNetworkAdditions` above. (If the delegate does not\n      // implement the `kDTBonjourQNetworkAdditionsCheck` selector, we can\n      // simply use the patched version.\n      if (![service qNetworkAdditions_getInputStream:&in outputStream:&out])\n        return nil;\n    }\n    else\n    {\n      // iOS7/OSX10.9\n      if (![service getInputStream:&in outputStream:&out])\n        return nil;\n    }\n\n\t\t_inputStream = in;\n    _outputStream = out;\n\t\t_outputQueue = [[NSMutableArray alloc] init];\n\t}\n\t\n\treturn self;\n}\n\n- (id)initWithInputStream:(NSInputStream *)inStream outputStream:(NSOutputStream *)outStream\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n  \t_inputStream = inStream;\n    _outputStream = outStream;\n\t\t_outputQueue = [[NSMutableArray alloc] init];\n\t}\n\t\n\treturn self;\n}\n\n- (void)dealloc\n{\n\t_delegate = nil;\n\t[self close];\n}\n\n- (BOOL)openWithTimeout:(NSTimeInterval)timeout\n{\n\t[_inputStream  setDelegate:self];\n\t[_outputStream setDelegate:self];\n\t[_inputStream  scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];\n\t[_outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];\n\t[_inputStream  open];\n\t[_outputStream open];\n\t\n  __weak id weakSelf = self;\n  double delayInSeconds = timeout;\n  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));\n  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){\n    // No connection after timeout, closing.\n    if (![weakSelf isOpen]) {\n    \t[weakSelf close];\n    }\n  });\n  \n\treturn YES;\n}\n\n- (BOOL)open\n{\n\treturn [self openWithTimeout:DTBonjourDataConnectionDefaultTimeout];\n}\n\n- (void)close\n{\n\tif (!_inputStream&&!_outputStream)\n\t{\n\t\treturn;\n\t}\n\t\n\t[_inputStream  setDelegate:nil];\n\t[_outputStream setDelegate:nil];\n\t[_inputStream  close];\n\t[_outputStream close];\n\t[_inputStream  removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];\n\t[_outputStream removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];\n\t_inputStream = nil;\n\t_outputStream = nil;\n\t\n\tif ([_delegate respondsToSelector:@selector(connectionDidClose:)])\n\t\t[_delegate connectionDidClose:self];\n}\n\n- (BOOL)isOpen\n{\n\tif (!_inputStream)\n\t\treturn NO;\n\t\n\tNSStreamStatus inputStatus = [_inputStream streamStatus];\n  NSStreamStatus outputStatus = [_outputStream streamStatus];\n  \n  if (NSStreamStatusOpen != inputStatus)\n  \treturn NO;\n  \n  if (NSStreamStatusOpen != outputStatus)\n  \treturn NO;\n  \n\treturn YES;\n}\n\n- (void)_startOutput\n{\n\tif (![_outputQueue count])\n\t{\n\t\treturn;\n\t}\n\t\n\tDTBonjourDataChunk *chunk = _outputQueue[0];\n\t\n\tif (0 == chunk.numberOfTransferredBytes)\n\t{\n\t\t// nothing sent yet\n\t\tif ([_delegate respondsToSelector:@selector(connection:willStartSendingChunk:)])\n\t\t{\n\t\t\t[_delegate connection:self willStartSendingChunk:chunk];\n\t\t}\n\t}\n\t\n\tNSInteger writtenBytes = [chunk writeToOutputStream:_outputStream];\n\t\n\tif (writtenBytes > 0)\n\t{\n\t\tif ([_delegate respondsToSelector:@selector(connection:didSendBytes:ofChunk:)])\n\t\t{\n\t\t\t[_delegate connection:self didSendBytes:writtenBytes ofChunk:chunk];\n\t\t}\n\t\t\n\t\t// If we didn't write all the bytes we'll continue writing them in response to the next\n\t\t// has-space-available event.\n\t\t\n\t\tif ([chunk isTransmissionComplete])\n\t\t{\n\t\t\t[_outputQueue removeObject:chunk];\n\t\t\t\n\t\t\tif ([_delegate respondsToSelector:@selector(connection:didFinishSendingChunk:)])\n\t\t\t{\n\t\t\t\t[_delegate connection:self didFinishSendingChunk:chunk];\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// A non-positive result from -write:maxLength: indicates a failure of some form; in this\n\t\t// simple app we respond by simply closing down our connection.\n\t\t[self close];\n\t}\n}\n\n#pragma mark - Public Interface\n\n- (BOOL)sendObject:(id)object error:(NSError **)error\n{\n\tif (![self isOpen])\n\t{\n\t\tif (error)\n\t\t{\n\t\t\tNSDictionary *userInfo = @{NSLocalizedDescriptionKey:@\"Connection is not open\"};\n\t\t\t*error = [NSError errorWithDomain:@\"DTBonjourDataConnection\" code:1 userInfo:userInfo];\n\t\t}\n\t\t\n\t\treturn NO;\n\t}\n\t\n\tDTBonjourDataChunk *newChunk = [[DTBonjourDataChunk alloc]\n  \tinitWithObject:object\n    encoding:self.sendingContentType\n    error:error];\n\t\n\tif (!newChunk)\n\t\treturn NO;\n\t\n\tnewChunk.sequenceNumber = _chunkSequenceNumber;\n\n\tBOOL queueWasEmpty = (![_outputQueue count]);\n\t\n\t[_outputQueue addObject:newChunk];\n\t\n\tif (queueWasEmpty && _outputStream.streamStatus == NSStreamStatusOpen)\n\t{\n  \tdispatch_async(dispatch_get_main_queue(), ^{\n      [self _startOutput];\n    });\n\t}\n\n\treturn YES;\n}\n\n#pragma mark - NSStream Delegate\n\n- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)streamEvent\n{\n\tswitch(streamEvent)\n\t{\n\t\tcase NSStreamEventOpenCompleted:\n\t\t{\n    \tif ([_delegate respondsToSelector:@selector(connectionDidOpen:)]) {\n      \tif ([self isOpen] && aStream == _outputStream) {\n          [_delegate connectionDidOpen:self];\n        }\n      }\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tcase NSStreamEventHasBytesAvailable:\n\t\t{\n\t\t\tif (!_receivingChunk)\n\t\t\t{\n\t\t\t\t// start reading a new chunk\n\t\t\t\t_receivingChunk = [[DTBonjourDataChunk alloc] initForReading];\n                \n                // nothing received yet\n                if ([_delegate respondsToSelector:@selector(connection:willStartReceivingChunk:)])\n                {\n                    [_delegate connection:self willStartReceivingChunk:_receivingChunk];\n                }\n\t\t\t}\n\t\t\t\n\t\t\t// continue reading\n\t\t\tNSInteger actuallyRead = [_receivingChunk readFromInputStream:_inputStream];\n\t\t\t\n\t\t\tif (actuallyRead<0)\n\t\t\t{\n\t\t\t\t[self close];\n\t\t\t\tbreak;\n\t\t\t}\n            \n            if ([_delegate respondsToSelector:@selector(connection:didReceiveBytes:ofChunk:)])\n            {\n                [_delegate connection:self didReceiveBytes:actuallyRead ofChunk:_receivingChunk];\n            }\n\t\t\t\n\t\t\tif ([_receivingChunk isTransmissionComplete])\n\t\t\t{\n                if ([_delegate respondsToSelector:@selector(connection:didFinishReceivingChunk:)])\n                {\n                    [_delegate connection:self didFinishReceivingChunk:_receivingChunk];\n                }\n                \n\t\t\t\tif ([_delegate respondsToSelector:@selector(connection:didReceiveObject:)])\n\t\t\t\t{\n\t\t\t\t\tid decodedObject = [_receivingChunk decodedObject];\n\t\t\t\t\t\n\t\t\t\t\t[_delegate connection:self didReceiveObject:decodedObject];\n\t\t\t\t}\n\n\t\t\t\t// we're done with this chunk\n\t\t\t\t_receivingChunk = nil;\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tcase NSStreamEventErrorOccurred:\n\t\t{\n\t\t\tNSLog(@\"Error occurred: %@\", [aStream.streamError localizedDescription]);\n  \n      // Intentional fall-through.\n\t\t}\n\t\t\t\n\t\tcase NSStreamEventEndEncountered:\n\t\t{\n\t\t\t[self close];\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tcase NSStreamEventHasSpaceAvailable:\n\t\t{\n\t\t\tif ([_outputQueue count])\n\t\t\t{\n\t\t\t\t[self _startOutput];\n\t\t\t}\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\t\n\t\tdefault:\n\t\t{\n\t\t\t// do nothing\n\t\t\tbreak;\n\t\t} \n\t}\n}\n\n\n#pragma mark - Properties\n\n@synthesize delegate = _delegate;\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourServer.h",
    "content": "//\n//  DTBonjourServer.h\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 01.11.12.\n//  Copyright (c) 2012 Oliver Drobnik. All rights reserved.\n//\n\n#import \"DTBonjourDataConnection.h\"\n\n@class DTBonjourServer;\n\n/**\n The delegate protocol by which the DTBonjourServer communicates about events\n */\n@protocol DTBonjourServerDelegate <NSObject>\n@optional\n\n/**\n Callend when a new incoming connection was accepted by the server.\n @param server The server\n @param connection The connection that was accepted\n */\n- (void)bonjourServer:(DTBonjourServer *)server didAcceptConnection:(DTBonjourDataConnection *)connection;\n\n/**\n Called when the server received a new object on a given connection\n @param server The server\n @param object The decoded object that was received\n @param connection The individual connection that it was received on\n */\n- (void)bonjourServer:(DTBonjourServer *)server didReceiveObject:(id)object onConnection:(DTBonjourDataConnection *)connection;\n@end\n\n/**\n This class represents a service that clients can connect to. It owns its inbound connections and thus you should never modify the delegate of the individual data connections.\n \n On iOS the server is automatically stopped if the app enters the background and restarted when the app comes back into the foreground.\n */\n@interface DTBonjourServer : NSObject <DTBonjourDataConnectionDelegate>\n\n/**\n @name Creating a Server\n */\n\n/**\n Creates a server instances with the given bonjour type, e.g. \"_servicename._tcp\"\n @param bonjourType The full service type string\n */\n- (id)initWithBonjourType:(NSString *)bonjourType;\n\n/**\n @name Server Lifetime\n */\n\n/**\n Starts up the server, prepares it to be connected to and publishes the service via Bonjour\n @returns `YES` if the startup was successful\n */\n- (BOOL)start;\n\n/**\n Stops the service\n */\n- (void)stop;\n\n/**\n @name Sending Objects\n */\n\n/**\n Sends the object to all currently connected clients.\n \n Note: any errors will be ignored. If you require finer-grained control then you should iterate over the individual connections.\n @param object The object that will be encoded and sent to all clients\n */\n- (void)broadcastObject:(id)object;\n\n/**\n @name Getting Information\n */\n\n/**\n The delegate that will be informed about activities happening on the server.\n */\n@property (nonatomic, weak) id <DTBonjourServerDelegate> delegate;\n\n/**\n The actual port bound to, valid after -start\n */\n@property (nonatomic, assign, readonly ) NSUInteger port;   \n\n/**\n The currently connected inbound DTBonjourDataConnection instances.\n */\n@property (nonatomic, readonly) NSSet *connections;\n\n/**\n The TXT Record attached to the Bonjour service.\n \n Updating this property while the server is running will update the broadcast TXTRecord. The server has its own instance of the TXTRecord so that it can be set even before calling start.\n */\n@property (nonatomic, strong) NSDictionary *TXTRecord;\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/DTBonjourServer.m",
    "content": "//\n//  DTBonjourServer.m\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 01.11.12.\n//  Copyright (c) 2012 Oliver Drobnik. All rights reserved.\n//\n\n#import \"DTBonjourServer.h\"\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#include <arpa/inet.h>\n\n#import <CoreFoundation/CoreFoundation.h>\n\n#import \"DTBonjourDataConnection.h\"\n#import \"DTBonjourDataChunk.h\"\n\n#if TARGET_OS_IPHONE\n#import <UIKit/UIKit.h>\n#endif\n\n@interface DTBonjourServer() <NSNetServiceDelegate, DTBonjourDataConnectionDelegate>\n\n- (void)_acceptConnection:(CFSocketNativeHandle)nativeSocketHandle originAddress:(NSString *)originAddress;\n\n@end\n\n// call-back function for incoming connections\nstatic void ListeningSocketCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)\n{\n\tDTBonjourServer *server = (__bridge DTBonjourServer *)info;\n\t\n\tconst struct sockaddr *sa = (const struct sockaddr *)CFDataGetBytePtr(address);\n\t\n\tsa_family_t family = sa->sa_family;\n\t\n\tNSString *ipString = nil;\n\tNSString *familyString = nil;\n\tNSUInteger port = 0;\n\t\n\tif (family == AF_INET)\n\t{\n\t\tfamilyString = @\"IPv4\";\n\t\t\n\t\tstruct sockaddr_in addr4;\n\t\tCFDataGetBytes(address, CFRangeMake(0, sizeof(addr4)), (void *)&addr4);\n\t\t\n\t\tchar str[INET_ADDRSTRLEN];\n\t\tinet_ntop(AF_INET, &(addr4.sin_addr), str, INET_ADDRSTRLEN);\n\t\tipString = [[NSString alloc] initWithBytes:str length:strlen(str) encoding:NSUTF8StringEncoding];\n\t\t\n\t\tport = ntohs(addr4.sin_port);\n\t}\n\telse if (family == AF_INET6)\n\t{\n\t\tfamilyString = @\"IPv6\";\n\t\t\n\t\tstruct sockaddr_in6 addr6;\n\t\tCFDataGetBytes(address, CFRangeMake(0, sizeof(addr6)), (void *)&addr6);\n\t\t\n\t\tchar str[INET6_ADDRSTRLEN];\n\t\tinet_ntop(AF_INET6, &(addr6.sin6_addr), str, INET6_ADDRSTRLEN);\n\t\tipString = [[NSString alloc] initWithBytes:str length:strlen(str) encoding:NSUTF8StringEncoding];\n\t\t\n\t\tport = ntohs(addr6.sin6_port);\n\t}\n\t\n\tNSLog(@\"Accepting %@ connection from %@ on port %d\", familyString, ipString, (int)port);\n\t\n\t// For an accept callback, the data parameter is a pointer to a CFSocketNativeHandle.\n    [server _acceptConnection:*(CFSocketNativeHandle *)data originAddress:ipString];\n}\n\n\n@implementation DTBonjourServer\n{\n\tNSNetService *_service;\n\tNSDictionary *_TXTRecord;\n\t\n\tCFSocketRef _ipv4socket;\n\tCFSocketRef _ipv6socket;\n\t\n\tNSUInteger _port; // used port, assigned during start\n\t\n\tNSMutableSet *_connections;\n\tNSString *_bonjourType;\n\t\n\t__weak id <DTBonjourServerDelegate> _delegate;\n}\n\n- (id)init\n{\n\tself = [super init];\n\t\n\tif (self)\n\t{\n\t\tif (![_bonjourType length])\n\t\t{\n\t\t\treturn nil;\n\t\t}\n\t\t\n\t\t_connections = [[NSMutableSet alloc] init];\n\t\t\n#if TARGET_OS_IPHONE\n\t\t[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];\n\t\t[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];\n#endif\n\t}\n\t\n\treturn self;\n}\n\n- (id)initWithBonjourType:(NSString *)bonjourType\n{\n\tif (!bonjourType)\n\t{\n\t\treturn nil;\n\t}\n\t\n\t_bonjourType = bonjourType;\n\t\n\tself = [self init];\n\t\n\tif (self)\n\t{\n\t\t\n\t}\n\t\n\treturn self;\n}\n\n- (void)dealloc\n{\n\t[[NSNotificationCenter defaultCenter] removeObserver:self];\n\t\n\t_delegate = nil;\n\n\t[self stop];\n}\n\n- (BOOL)start\n{\n    if(!(_ipv4socket == NULL && _ipv6socket == NULL))\n    {\n        return NO;\n    }\n\t\n\tCFSocketContext socketCtxt = {0, (__bridge void *) self, NULL, NULL, NULL};\n\t_ipv4socket = CFSocketCreate(kCFAllocatorDefault, AF_INET,  SOCK_STREAM, 0, kCFSocketAcceptCallBack, &ListeningSocketCallback, &socketCtxt);\n\t_ipv6socket = CFSocketCreate(kCFAllocatorDefault, AF_INET6, SOCK_STREAM, 0, kCFSocketAcceptCallBack, &ListeningSocketCallback, &socketCtxt);\n\t\n\tif (NULL == _ipv4socket || NULL == _ipv6socket)\n\t{\n\t\t[self stop];\n\t\treturn NO;\n\t}\n\t\n\tstatic const int yes = 1;\n\t(void) setsockopt(CFSocketGetNative(_ipv4socket), SOL_SOCKET, SO_REUSEADDR, (const void *) &yes, sizeof(yes));\n\t(void) setsockopt(CFSocketGetNative(_ipv6socket), SOL_SOCKET, SO_REUSEADDR, (const void *) &yes, sizeof(yes));\n\t\n\t// Set up the IPv4 listening socket; port is 0, which will cause the kernel to choose a port for us.\n\tstruct sockaddr_in addr4;\n\tmemset(&addr4, 0, sizeof(addr4));\n\taddr4.sin_len = sizeof(addr4);\n\taddr4.sin_family = AF_INET;\n\taddr4.sin_port = htons(0);\n\taddr4.sin_addr.s_addr = htonl(INADDR_ANY);\n\t\n\tif (kCFSocketSuccess != CFSocketSetAddress(_ipv4socket, (__bridge CFDataRef) [NSData dataWithBytes:&addr4 length:sizeof(addr4)]))\n\t{\n\t\t[self stop];\n\t\treturn NO;\n\t}\n\t\n\t// Now that the IPv4 binding was successful, we get the port number\n\t// -- we will need it for the IPv6 listening socket and for the NSNetService.\n\tNSData *addr = (__bridge_transfer NSData *)CFSocketCopyAddress(_ipv4socket);\n\tif(!([addr length] == sizeof(struct sockaddr_in)))\n    {\n        return NO;\n    }\n    _port = ntohs(((const struct sockaddr_in *)[addr bytes])->sin_port);\n\t\n\t// Set up the IPv6 listening socket.\n\tstruct sockaddr_in6 addr6;\n\tmemset(&addr6, 0, sizeof(addr6));\n\taddr6.sin6_len = sizeof(addr6);\n\taddr6.sin6_family = AF_INET6;\n\taddr6.sin6_port = htons(self.port);\n\tmemcpy(&(addr6.sin6_addr), &in6addr_any, sizeof(addr6.sin6_addr));\n\tif (kCFSocketSuccess != CFSocketSetAddress(_ipv6socket, (__bridge CFDataRef) [NSData dataWithBytes:&addr6 length:sizeof(addr6)]))\n\t{\n\t\t[self stop];\n\t\treturn NO;\n\t}\n\t\n\t// Set up the run loop sources for the sockets.\n\tCFRunLoopSourceRef source4 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _ipv4socket, 0);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), source4, kCFRunLoopCommonModes);\n\tCFRelease(source4);\n\t\n\tCFRunLoopSourceRef source6 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _ipv6socket, 0);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), source6, kCFRunLoopCommonModes);\n\tCFRelease(source6);\n\t\n\tif (_ipv6socket)\n\t{\n\t\tCFSocketInvalidate(_ipv6socket);\n\t\tCFRelease(_ipv6socket);\n\t\t_ipv6socket = NULL;\n\t}\n\t\n\tif(!(self.port > 0 && self.port < 65536))\n    {\n        return NO;\n    }\n\t_service = [[NSNetService alloc] initWithDomain:@\"\" type:_bonjourType name:@\"\" port:(int)_port];\n\t_service.delegate = self;\n\t\n\tif (_TXTRecord)\n\t{\n\t\t[_service setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:_TXTRecord]];\n\t}\n\t\n\t[_service publishWithOptions:0];\n\t\n\treturn YES;\n}\n\n/*\n // this is the way to create the sockets on the Posix-level\n- (BOOL)start\n{\n\tCFSocketContext context = {0, (__bridge void *)self, NULL, NULL, NULL};\n\t\n\t// create IPv4 socket\n\tint fd4 = socket(AF_INET, SOCK_STREAM, 0);\n\t\n\t// allow for reuse of local address\n\tstatic const int yes = 1;\n\tint err = setsockopt(fd4, SOL_SOCKET, SO_REUSEADDR, (const void *) &yes, sizeof(yes));\n\t\n\t// a structure for the socket address\n\tstruct sockaddr_in sin;\n\tmemset(&sin, 0, sizeof(sin));\n\tsin.sin_family = AF_INET;\n\tsin.sin_len = sizeof(sin);\n\tsin.sin_port = htons(0);  // asks kernel for arbitrary port number\n\t\n\terr = bind(fd4, (const struct sockaddr *) &sin, sin.sin_len);\n\t\n\tsocklen_t addrLen = sizeof(sin);\n\terr = getsockname(fd4, (struct sockaddr *)&sin, &addrLen);\n\terr = listen(fd4, 5);\n\t\n\t// should have a port number now\n\t_port = sin.sin_port;\n\t\n\tif (!_port)\n\t{\n\t\treturn NO;\n\t}\n\t\n\t// create a CFSocket for the file descriptor\n\t_ipv4socket = CFSocketCreateWithNative(NULL, fd4, kCFSocketAcceptCallBack, ListeningSocketCallback, &context);\n\t\n\t// create IPv6 socket\n\tint fd6 = socket(AF_INET6, SOCK_STREAM, 0);\n\t\n\tint one = 1;\n\terr = setsockopt(fd6, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(one));\n\terr = setsockopt(fd6, SOL_SOCKET, SO_REUSEADDR, (const void *) &yes, sizeof(yes));\n\t\n\tstruct sockaddr_in sin6;\n\tmemset(&sin6, 0, sizeof(sin6));\n\tsin6.sin_family = AF_INET6;\n\tsin6.sin_len = sizeof(sin6);\n\tsin6.sin_port = sin.sin_port;  // uses same port as IPv4\n\t\n\terr = bind(fd6, (const struct sockaddr *) &sin6, sin6.sin_len);\n\t\n\terr = listen(fd6, 5);\n\t\n\t// create a CFSocket for the file descriptor\n\t_ipv6socket = CFSocketCreateWithNative(NULL, fd6, kCFSocketAcceptCallBack, ListeningSocketCallback, &context);\n\t\n\t// Set up the run loop sources for the sockets.\n\tCFRunLoopSourceRef source4 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _ipv4socket, 0);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), source4, kCFRunLoopCommonModes);\n\tCFRelease(source4);\n\t\n\tCFRunLoopSourceRef source6 = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _ipv6socket, 0);\n\tCFRunLoopAddSource(CFRunLoopGetCurrent(), source6, kCFRunLoopCommonModes);\n\tCFRelease(source6);\n\t_service = [[NSNetService alloc] initWithDomain:@\"\" // use all available domains\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\ttype:_bonjourType\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tname:@\"\" // uses default name of system\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tport:ntohs(_port)];\n\t\n\t[_service scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];\n\t_service.delegate = self;\n\t\n\t[_service publish];\n\n#if TARGET_OS_IPHONE\n\t[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];\n\t[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];\n#endif\n\t\n\treturn YES;\n}\n */\n\n- (void)stop\n{\n\t// stop the bonjour advertising\n\t[_service stop];\n\t_service = nil;\n\t\n\t// Closes all the open connections.  The EchoConnectionDidCloseNotification notification will ensure\n\t// that the connection gets removed from the self.connections set.  To avoid mututation under iteration\n\t// problems, we make a copy of that set and iterate over the copy.\n\tfor (DTBonjourDataConnection *connection in [_connections copy])\n\t{\n\t\t[connection close];\n\t}\n\t\n\tif (_ipv4socket)\n\t{\n\t\tCFSocketInvalidate(_ipv4socket);\n\t\tCFRelease(_ipv4socket);\n\t\t_ipv4socket = NULL;\n\t}\n\t\n\tif (_ipv6socket)\n\t{\n\t\tCFSocketInvalidate(_ipv6socket);\n\t\tCFRelease(_ipv6socket);\n\t\t_ipv6socket = NULL;\n\t}\n}\n\n- (void)_acceptConnection:(CFSocketNativeHandle)nativeSocketHandle originAddress:(NSString *)originAddress\n{\n\tDTBonjourDataConnection *newConnection = [[DTBonjourDataConnection alloc] initWithNativeSocketHandle:nativeSocketHandle originAddress:originAddress];\n\t\n\t//DTBonjourDataConnection *newConnection = [[DTBonjourDataConnection alloc] initWithService:service];\n\t\n\tnewConnection.delegate = self;\n\t[newConnection open];\n\t[_connections addObject:newConnection];\n\t\n\tif ([_delegate respondsToSelector:@selector(bonjourServer:didAcceptConnection:)])\n\t{\n\t\t[_delegate bonjourServer:self didAcceptConnection:newConnection];\n\t}\n}\n\n- (void)broadcastObject:(id)object\n{\n\tfor (DTBonjourDataConnection *connection in _connections)\n\t{\n\t\tNSError *error;\n\t\t\n\t\tif (![connection sendObject:object error:&error])\n\t\t{\n\t\t\tNSLog(@\"%@\", [error localizedDescription]);\n\t\t}\n\t}\n}\n\n#pragma mark - NSNetService Delegate\n\n- (void)netService:(NSNetService *)sender didNotPublish:(NSDictionary *)errorDict\n{\n\tNSLog(@\"Error publishing: %@\", errorDict);\n}\n\n- (void)netServiceDidPublish:(NSNetService *)sender\n{\n\tNSLog(@\"My name: %@ port: %d\", [sender name], (int)sender.port);\n}\n\n- (void)netServiceDidStop:(NSNetService *)sender\n{\n\tNSLog(@\"Bonjour Service shut down\");\n}\n\n#pragma mark - DTBonjourDataConnection Delegate\n- (void)connection:(DTBonjourDataConnection *)connection didReceiveObject:(id)object\n{\n\tif ([_delegate respondsToSelector:@selector(bonjourServer:didReceiveObject:onConnection:)])\n\t{\n\t\t[_delegate bonjourServer:self didReceiveObject:object onConnection:connection];\n\t}\n}\n\n- (void)connectionDidClose:(DTBonjourDataConnection *)connection\n{\n    if([_delegate respondsToSelector:@selector(connectionDidClose:)])\n    {\n        [(id)_delegate connectionDidClose:connection];\n    }\n\t[_connections removeObject:connection];\n}\n\n#pragma mark - Notifications\n\n- (void)appDidEnterBackground:(NSNotification *)notification\n{\n\t[self stop];\n}\n\n- (void)appWillEnterForeground:(NSNotification *)notification\n{\n\t[self start];\n}\n\n#pragma mark - Properties\n\n- (NSSet *)connections\n{\n\t// make a copy to be non-mutable\n\treturn [_connections copy];\n}\n\n- (void)setTXTRecord:(NSDictionary *)TXTRecord\n{\n\t_TXTRecord = TXTRecord;\n\n\t// update service if it is running\n\tif (_service)\n\t{\n\t\t[_service setTXTRecordData:[NSNetService dataFromTXTRecordDictionary:_TXTRecord]];\n\t}\n}\n\n@synthesize TXTRecord = _TXTRecord;\n@synthesize delegate = _delegate;\n@synthesize port = _port;\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/NSScanner+DTBonjour.h",
    "content": "//\n//  NSScanner+DTBonjour.h\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 15.11.12.\n//  Copyright (c) 2012 Cocoanetics. All rights reserved.\n//\n\n/**\n Category extension for `NSScanner` to deal with scanning the headers used by DTBonjour\n */\n\n@interface NSScanner (DTBonjour)\n\n/**\n The receiver scans for DTBonjour headers.\n @param headers The output dictionary with the scanned headers\n @returns `YES` if successfully scanned the headers\n */\n- (BOOL)scanBonjourConnectionHeaders:(NSDictionary **)headers;\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Core/Source/NSScanner+DTBonjour.m",
    "content": "//\n//  NSScanner+DTBonjour.m\n//  DTBonjour\n//\n//  Created by Oliver Drobnik on 15.11.12.\n//  Copyright (c) 2012 Cocoanetics. All rights reserved.\n//\n\n#import \"NSScanner+DTBonjour.h\"\n\n@implementation NSScanner (DTBonjour)\n\n- (BOOL)scanBonjourConnectionHeaders:(NSDictionary **)headers\n{\n\tNSString *headerName;\n\t\n\tNSUInteger positionBeforeScanning = [self scanLocation];\n\t\n\tNSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];\n\t\n\twhile (!self.isAtEnd)\n\t{\n\t\tif (![self scanUpToString:@\":\" intoString:&headerName])\n\t\t{\n\t\t\tself.scanLocation = positionBeforeScanning;\n\t\t\treturn NO;\n\t\t}\n\t\t\n\t\t// skip colon\n\t\t[self scanString:@\":\" intoString:NULL];\n\t\t\n\t\tNSString *headerValue;\n\t\tif ([self scanUpToCharactersFromSet:[NSCharacterSet newlineCharacterSet] intoString:&headerValue])\n\t\t{\n\t\t\ttmpDict[headerName] = headerValue;\n\t\t}\n\t}\n\t\n\tif (headers)\n\t{\n\t\t*headers = [tmpDict copy];\n\t}\n\t\n\treturn YES;\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/DTBonjour/DTBonjour.podspec",
    "content": "Pod::Spec.new do |spec|\n  spec.name         = 'DTBonjour'\n  spec.version      = '1.1.1'\n  spec.summary      = \"Client/Server Communication of NSObjects over WiFi.\"\n  spec.homepage     = \"https://github.com/Cocoanetics/DTBonjour\"\n  spec.author       = { \"Oliver Drobnik\" => \"oliver@drobnik.com\" }\n  spec.source       = { :git => \"https://github.com/Cocoanetics/DTBonjour.git\", :tag => spec.version.to_s  }\n  spec.source_files = 'Core/Source/*.{h,m}'\n  spec.license      = 'BSD'\n  spec.ios.deployment_target = '5.0'\n  spec.osx.deployment_target = '10.7'\n  spec.ios.frameworks   =  [\"CoreFoundation\", \"Foundation\", \"UIKit\"] \n  spec.osx.frameworks   =  [\"CoreFoundation\", \"Foundation\"] \n  spec.requires_arc = true\nend\n"
  },
  {
    "path": "Modified Pods/DTBonjour/DTBonjour.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXAggregateTarget section */\n\t\tA70B24A116E1389D008C4BB8 /* Documentation */ = {\n\t\t\tisa = PBXAggregateTarget;\n\t\t\tbuildConfigurationList = A70B24A216E1389D008C4BB8 /* Build configuration list for PBXAggregateTarget \"Documentation\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA70B24A516E138A3008C4BB8 /* ShellScript */,\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Documentation;\n\t\t\tproductName = Documentation;\n\t\t};\n/* End PBXAggregateTarget section */\n\n/* Begin PBXBuildFile section */\n\t\tA719026C16A7F8B700C1EC52 /* DTBonjourDataChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026516A7F8B700C1EC52 /* DTBonjourDataChunk.m */; };\n\t\tA719026E16A7F8B700C1EC52 /* DTBonjourDataConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026716A7F8B700C1EC52 /* DTBonjourDataConnection.m */; };\n\t\tA719027016A7F8B700C1EC52 /* DTBonjourServer.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026916A7F8B700C1EC52 /* DTBonjourServer.m */; };\n\t\tA719027216A7F8B700C1EC52 /* NSScanner+DTBonjour.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026B16A7F8B700C1EC52 /* NSScanner+DTBonjour.m */; };\n\t\tA719029616A7F95100C1EC52 /* DTBonjourDataChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026516A7F8B700C1EC52 /* DTBonjourDataChunk.m */; };\n\t\tA719029716A7F95100C1EC52 /* DTBonjourDataConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026716A7F8B700C1EC52 /* DTBonjourDataConnection.m */; };\n\t\tA719029816A7F95100C1EC52 /* DTBonjourServer.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026916A7F8B700C1EC52 /* DTBonjourServer.m */; };\n\t\tA719029916A7F95100C1EC52 /* NSScanner+DTBonjour.m in Sources */ = {isa = PBXBuildFile; fileRef = A719026B16A7F8B700C1EC52 /* NSScanner+DTBonjour.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tA719021716A7F5E300C1EC52 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/${PRODUCT_NAME}\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\tA70B24A016E1385F008C4BB8 /* AppledocSettings.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = AppledocSettings.plist; sourceTree = \"<group>\"; };\n\t\tA719021916A7F5E300C1EC52 /* libDTBonjour_iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libDTBonjour_iOS.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA719021C16A7F5E300C1EC52 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };\n\t\tA719026216A7F8B700C1EC52 /* DTBonjour-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"DTBonjour-Prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tA719026416A7F8B700C1EC52 /* DTBonjourDataChunk.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTBonjourDataChunk.h; sourceTree = \"<group>\"; };\n\t\tA719026516A7F8B700C1EC52 /* DTBonjourDataChunk.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTBonjourDataChunk.m; sourceTree = \"<group>\"; };\n\t\tA719026616A7F8B700C1EC52 /* DTBonjourDataConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTBonjourDataConnection.h; sourceTree = \"<group>\"; };\n\t\tA719026716A7F8B700C1EC52 /* DTBonjourDataConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTBonjourDataConnection.m; sourceTree = \"<group>\"; };\n\t\tA719026816A7F8B700C1EC52 /* DTBonjourServer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DTBonjourServer.h; sourceTree = \"<group>\"; };\n\t\tA719026916A7F8B700C1EC52 /* DTBonjourServer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DTBonjourServer.m; sourceTree = \"<group>\"; };\n\t\tA719026A16A7F8B700C1EC52 /* NSScanner+DTBonjour.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSScanner+DTBonjour.h\"; sourceTree = \"<group>\"; };\n\t\tA719026B16A7F8B700C1EC52 /* NSScanner+DTBonjour.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSScanner+DTBonjour.m\"; sourceTree = \"<group>\"; };\n\t\tA719028B16A7F93000C1EC52 /* libDTBonjour_Mac.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libDTBonjour_Mac.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA719029B16A7FC7100C1EC52 /* DTBonjour.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = DTBonjour.podspec; sourceTree = \"<group>\"; };\n\t\tA719029C16A7FC7100C1EC52 /* readme.markdown */ = {isa = PBXFileReference; lastKnownFileType = text; path = readme.markdown; sourceTree = \"<group>\"; };\n\t\tA719029D16A7FC7100C1EC52 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tA719021616A7F5E300C1EC52 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA719028816A7F93000C1EC52 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tA719021016A7F5E300C1EC52 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA719029A16A7FC6100C1EC52 /* Documentation */,\n\t\t\t\tA719026116A7F8B700C1EC52 /* Core */,\n\t\t\t\tA719021B16A7F5E300C1EC52 /* Frameworks */,\n\t\t\t\tA719021A16A7F5E300C1EC52 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA719021A16A7F5E300C1EC52 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA719021916A7F5E300C1EC52 /* libDTBonjour_iOS.a */,\n\t\t\t\tA719028B16A7F93000C1EC52 /* libDTBonjour_Mac.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA719021B16A7F5E300C1EC52 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA719021C16A7F5E300C1EC52 /* Foundation.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA719026116A7F8B700C1EC52 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA719026216A7F8B700C1EC52 /* DTBonjour-Prefix.pch */,\n\t\t\t\tA719026316A7F8B700C1EC52 /* Source */,\n\t\t\t);\n\t\t\tpath = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA719026316A7F8B700C1EC52 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA719026416A7F8B700C1EC52 /* DTBonjourDataChunk.h */,\n\t\t\t\tA719026516A7F8B700C1EC52 /* DTBonjourDataChunk.m */,\n\t\t\t\tA719026616A7F8B700C1EC52 /* DTBonjourDataConnection.h */,\n\t\t\t\tA719026716A7F8B700C1EC52 /* DTBonjourDataConnection.m */,\n\t\t\t\tA719026816A7F8B700C1EC52 /* DTBonjourServer.h */,\n\t\t\t\tA719026916A7F8B700C1EC52 /* DTBonjourServer.m */,\n\t\t\t\tA719026A16A7F8B700C1EC52 /* NSScanner+DTBonjour.h */,\n\t\t\t\tA719026B16A7F8B700C1EC52 /* NSScanner+DTBonjour.m */,\n\t\t\t);\n\t\t\tpath = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA719029A16A7FC6100C1EC52 /* Documentation */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA70B24A016E1385F008C4BB8 /* AppledocSettings.plist */,\n\t\t\t\tA719029B16A7FC7100C1EC52 /* DTBonjour.podspec */,\n\t\t\t\tA719029D16A7FC7100C1EC52 /* LICENSE */,\n\t\t\t\tA719029C16A7FC7100C1EC52 /* readme.markdown */,\n\t\t\t);\n\t\t\tname = Documentation;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\tA719028916A7F93000C1EC52 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\tA719021816A7F5E300C1EC52 /* DTBonjour (iOS) */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A719022716A7F5E300C1EC52 /* Build configuration list for PBXNativeTarget \"DTBonjour (iOS)\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA719021516A7F5E300C1EC52 /* Sources */,\n\t\t\t\tA719021616A7F5E300C1EC52 /* Frameworks */,\n\t\t\t\tA719021716A7F5E300C1EC52 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"DTBonjour (iOS)\";\n\t\t\tproductName = DTBonjour;\n\t\t\tproductReference = A719021916A7F5E300C1EC52 /* libDTBonjour_iOS.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tA719028A16A7F93000C1EC52 /* DTBonjour (OS X) */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A719029316A7F93000C1EC52 /* Build configuration list for PBXNativeTarget \"DTBonjour (OS X)\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA719028716A7F93000C1EC52 /* Sources */,\n\t\t\t\tA719028816A7F93000C1EC52 /* Frameworks */,\n\t\t\t\tA719028916A7F93000C1EC52 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"DTBonjour (OS X)\";\n\t\t\tproductName = DTBonjour;\n\t\t\tproductReference = A719028B16A7F93000C1EC52 /* libDTBonjour_Mac.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\tA719021116A7F5E300C1EC52 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0510;\n\t\t\t\tORGANIZATIONNAME = \"Drobnik KG\";\n\t\t\t};\n\t\t\tbuildConfigurationList = A719021416A7F5E300C1EC52 /* Build configuration list for PBXProject \"DTBonjour\" */;\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 = A719021016A7F5E300C1EC52;\n\t\t\tproductRefGroup = A719021A16A7F5E300C1EC52 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tA719021816A7F5E300C1EC52 /* DTBonjour (iOS) */,\n\t\t\t\tA719028A16A7F93000C1EC52 /* DTBonjour (OS X) */,\n\t\t\t\tA70B24A116E1389D008C4BB8 /* Documentation */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tA70B24A516E138A3008C4BB8 /* ShellScript */ = {\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\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"/usr/local/bin/appledoc --print-settings --output \\\"${BUILD_DIR}/Documentation/\\\" \\\"${PROJECT_DIR}\\\"\\necho \\\"Documentation Output directory: ${BUILD_DIR}/Documentation/\\\"\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tA719021516A7F5E300C1EC52 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA719026C16A7F8B700C1EC52 /* DTBonjourDataChunk.m in Sources */,\n\t\t\t\tA719026E16A7F8B700C1EC52 /* DTBonjourDataConnection.m in Sources */,\n\t\t\t\tA719027016A7F8B700C1EC52 /* DTBonjourServer.m in Sources */,\n\t\t\t\tA719027216A7F8B700C1EC52 /* NSScanner+DTBonjour.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA719028716A7F93000C1EC52 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA719029616A7F95100C1EC52 /* DTBonjourDataChunk.m in Sources */,\n\t\t\t\tA719029716A7F95100C1EC52 /* DTBonjourDataConnection.m in Sources */,\n\t\t\t\tA719029816A7F95100C1EC52 /* DTBonjourServer.m in Sources */,\n\t\t\t\tA719029916A7F95100C1EC52 /* NSScanner+DTBonjour.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tA70B24A316E1389D008C4BB8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA70B24A416E1389D008C4BB8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA719022516A7F5E300C1EC52 /* 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\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\tONLY_ACTIVE_ARCH = YES;\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\tA719022616A7F5E300C1EC52 /* 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\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\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\tA719022816A7F5E300C1EC52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDSTROOT = /tmp/DTBonjour.dst;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Core/DTBonjour-Prefix.pch\";\n\t\t\t\tPRODUCT_NAME = DTBonjour_iOS;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA719022916A7F5E300C1EC52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDSTROOT = /tmp/DTBonjour.dst;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Core/DTBonjour-Prefix.pch\";\n\t\t\t\tPRODUCT_NAME = DTBonjour_iOS;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA719029416A7F93000C1EC52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Core/DTBonjour-Prefix.pch\";\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_NAME = DTBonjour_Mac;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA719029516A7F93000C1EC52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_ENABLE_OBJC_EXCEPTIONS = YES;\n\t\t\t\tGCC_PRECOMPILE_PREFIX_HEADER = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Core/DTBonjour-Prefix.pch\";\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.7;\n\t\t\t\tPRODUCT_NAME = DTBonjour_Mac;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tA70B24A216E1389D008C4BB8 /* Build configuration list for PBXAggregateTarget \"Documentation\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA70B24A316E1389D008C4BB8 /* Debug */,\n\t\t\t\tA70B24A416E1389D008C4BB8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA719021416A7F5E300C1EC52 /* Build configuration list for PBXProject \"DTBonjour\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA719022516A7F5E300C1EC52 /* Debug */,\n\t\t\t\tA719022616A7F5E300C1EC52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA719022716A7F5E300C1EC52 /* Build configuration list for PBXNativeTarget \"DTBonjour (iOS)\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA719022816A7F5E300C1EC52 /* Debug */,\n\t\t\t\tA719022916A7F5E300C1EC52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA719029316A7F93000C1EC52 /* Build configuration list for PBXNativeTarget \"DTBonjour (OS X)\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA719029416A7F93000C1EC52 /* Debug */,\n\t\t\t\tA719029516A7F93000C1EC52 /* 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 = A719021116A7F5E300C1EC52 /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/DTBonjour/DTBonjour.xcodeproj/xcshareddata/xcschemes/DTBonjour (OS X).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 = \"A719028A16A7F93000C1EC52\"\n               BuildableName = \"libDTBonjour_Mac.a\"\n               BlueprintName = \"DTBonjour (OS X)\"\n               ReferencedContainer = \"container:DTBonjour.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   </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      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/DTBonjour/DTBonjour.xcodeproj/xcshareddata/xcschemes/DTBonjour (iOS).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 = \"A719021816A7F5E300C1EC52\"\n               BuildableName = \"libDTBonjour_iOS.a\"\n               BlueprintName = \"DTBonjour (iOS)\"\n               ReferencedContainer = \"container:DTBonjour.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   </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      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      buildConfiguration = \"Release\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/DTBonjour/Documentation/Change Log-template.markdown",
    "content": "Change Log\n==========\n\nThis is the history of version updates.\n\n**Version 1.1.1**\n\n- FIXED: Various Xcode warnings\n- FIXED: Issue when initializing on older iOS (<7.0) or OSX (<10.9) version\n- CHANGED: run loop scheduling to common modes\n\n**Version 1.1.0**\n\n- FIXED: Various type warnings\n- ADDED: New method on DTBonjourDataConnection which allows specifying a timeout\n- ADDED: Delegate method for when connection was opened\n- ADDED: arm64 support\n- CHANGED: Updated for building with Xcode 5\n- CHANGED: Use original NSNetService method to get connection where workaround no longer necessary\n\n**Version 1.0.0**\n\nInitial release"
  },
  {
    "path": "Modified Pods/DTBonjour/LICENSE",
    "content": "Copyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Modified Pods/DTBonjour/build.gradle",
    "content": "buildscript {\n    repositories {\n\t\t\t\tmaven {\n\t\t\t\t\turl('http://openbakery.org/repository/')\n\t\t\t\t}\n\t\t\t\tmavenCentral()\n    }\n    dependencies {\n        classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.9.+'\n    }\n}\napply plugin: 'xcode'\n\nxcodebuild {\n  scheme = 'Static Library'\n  target = 'Static Library'\n  configuration = 'Debug'\n}\n\n\n// ---------- FTP Publish ----------\n\nrepositories {\n  mavenCentral()\n}\n\nconfigurations {\n  ftpAntTask\n}\n\ndependencies {\n  ftpAntTask(\"org.apache.ant:ant-commons-net:1.9.+\");\n}\n\n\nant.taskdef(\n  name: 'ftp',\n  classname: 'org.apache.tools.ant.taskdefs.optional.net.FTP',\n  classpath: configurations.ftpAntTask.asPath\n)\n\ntask documentationUpload << {\n  def uploadHost = 'docs.cocoanetics.com'\n  if (project.ext.properties.containsKey(\"uploadHost\")) {\n    uploadHost = project.ext.uploadHost\n  }\n\n  def uploadUser = null\n  if (project.ext.properties.containsKey(\"uploadUser\")) {\n    uploadUser = project.ext.uploadUser\n  } else {\n    uploadUser = System.console().readLine(\"\\nPlease enter the upload user: \")\n  }\n\n  def uploadPassword = null\n  if (project.ext.properties.containsKey(\"uploadPassword\")) {\n    uploadPassword = project.ext.uploadPassword\n  } else {\n    uploadPassword = \"\" + System.console().readPassword(\"\\nPlease enter the upload server password: \")\n  }\n\n\n  // -------------- UPLOAD DIRECTORY -------------\n\n  def uploadDirectory = 'DTBonjour'\n  if (project.ext.properties.containsKey(\"uploadDirectory\")) {\n    uploadDirectory = project.ext.uploadDirectory\n  }\n\n\n  ant.ftp(\n    server: uploadHost,\n    remotedir: uploadDirectory,\n    userid: uploadUser,\n    password: uploadPassword,\n    depends: true,\n    verbose: true,\n    passive: true) {\n\n      fileset(dir: 'build/documentation/html') {\n        include(name: '**/**')\n      }\n      fileset(dir: 'build/documentation/publish') {\n        include(name: '**/**')\n      }\n  }\n\n}\n\n\n// -------------- UNIT TESTS -------------\n\ntask continuous(dependsOn: 'test')\n\ngradle.taskGraph.whenReady { taskGraph ->\n\n\tif (taskGraph.hasTask(test)) {\n\t\tprintln \"CONFIGURE CONTINUOUS\"\n\t\txcodebuild {\n\n\t\t\tdestination {\n\t\t\t\tplatform = 'iOS Simulator'\n\t\t\t\tname = 'iPad'\n\t\t\t\tos='7.1'\n\t\t\t}\n\n\t\t\tdestination {\n\t\t\t\tplatform = 'iOS Simulator'\n\t\t\t\tname = 'iPhone Retina (3.5-inch)'\n\t\t\t\tos='7.1'\n\t\t\t}\n\n\t\t\tdestination {\n\t\t\t\tplatform = 'iOS Simulator'\n\t\t\t\tname = 'iPhone Retina (4-inch)'\n\t\t\t\tos='7.1'\n\t\t\t}\n\n\t\t\tdestination {\n\t\t\t\tplatform = 'iOS Simulator'\n\t\t\t\tname = 'iPad Retina'\n\t\t\t\tos='7.1'\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Modified Pods/DTBonjour/coveralls.rb",
    "content": "#!/usr/bin/env ruby\n\nrequire 'etc'\nrequire 'fileutils'\nrequire 'find'\nrequire 'optparse'\n\n# arraw of source subfolders to exclude\nexcludedFolders = []\nextensionsToProcess = []\ncoveralls_cmd = \"coveralls\"\n\nexcludeHeaders = false\n\n# create option parser\nopts = OptionParser.new\nopts.banner = \"Usage: coveralls.rb [options]\"\n\nopts.on('-e', '--exclude-folder FOLDER', 'Folder to exclude') do |v|\n   excludedFolders << v\n   coveralls_cmd.concat(\" -e #{v}\")\nend\n\nopts.on('-h', '--exclude-headers', 'Ignores headers') do |v|\n  excludeHeaders = true\nend\n  \nopts.on('-x', '--extension EXT', 'Source file extension to process') do |v|\n   extensionsToProcess << v\n   coveralls_cmd.concat(\" -x #{v}\")\nend\n\nopts.on_tail(\"-?\", \"--help\", \"Show this message\") do\n  puts opts\n  exit\nend\n  \n# parse the options\nbegin      \n  opts.parse!(ARGV)\nrescue OptionParser::InvalidOption => e\n  puts e\n  puts opts\n  exit(1)\nend\n\n# the folders\nworkingDir = Dir.getwd\nderivedDataDir = \"#{Etc.getpwuid.dir}/Library/Developer/Xcode/DerivedData/\"\noutputDir = workingDir + \"/gcov\"\n\n# create gcov output folder\nFileUtils.mkdir outputDir \n\n# pattern to get source file from first line of gcov file\nGCOV_SOURCE_PATTERN = Regexp.new(/Source:(.*)/)\n\n# enumerate all gcda files underneath derivedData\nFind.find(derivedDataDir) do |gcda_file|\n\n  if gcda_file.match(/\\.gcda\\Z/)\n    \n      #get just the folder name\n      gcov_dir = File.dirname(gcda_file)\n \n      # cut off absolute working dir to get relative source path\n      relative_input_path = gcda_file.slice(derivedDataDir.length, gcda_file.length)\n      puts \"\\nINPUT: #{relative_input_path}\"\n\n      #process the file\n      result = %x( gcov '#{gcda_file}' -o '#{gcov_dir}' )\n      \n      # filter the resulting output\n      Dir.glob(\"*.gcov\") do |gcov_file|\n        \n        firstLine = File.open(gcov_file).readline\n        match = GCOV_SOURCE_PATTERN.match(firstLine)\n        \n        if (match)\n          \n          source_path = match[1]\n\n          puts \"source: #{source_path} - #{workingDir}\"\n\n          if (source_path.start_with? workingDir)\n            \n            # cut off absolute working dir to get relative source path\n            relative_path = source_path.slice(workingDir.length+1, source_path.length)\n            \n            extension = File.extname(relative_path)\n      \t\t\textension = extension.slice(1, extension.length-1)\n            \n            puts \"#{extension}\"\n            \n            # get the path components\n            path_comps = relative_path.split(File::SEPARATOR)\n            \n            shouldProcess = false\n            exclusionMsg =\"\"\n            \n            if (excludedFolders.include?(path_comps[0]))\n              exclusionMsg = \"excluded via option\"\n            else\n              if (excludeHeaders == true && extension == 'h')\n                exclusionMsg = \"excluded header\"\n              else\n                if (extensionsToProcess.count == 0 || extensionsToProcess.include?(extension))\n                  shouldProcess = true\n                else\n                   exclusionMsg = \"excluded extension\"\n                   shouldProcess = false\n                end\n              end\n            end\n            \n            if (shouldProcess)\n              puts \"   - process: #{relative_path}\"\n              FileUtils.mv(gcov_file, outputDir)\n            else\n              puts \"   - ignore:  #{relative_path} (#{exclusionMsg})\"\n              FileUtils.rm gcov_file\n            end\n          else\n            puts \"   - ignore:  #{gcov_file} (outside source folder)\"\n            FileUtils.rm gcov_file\n          end\n        end\n      end\n   end\nend\n\n#call the coveralls, exclude some files\nsystem coveralls_cmd\n\n#clean up\nFileUtils.rm_rf outputDir\n"
  },
  {
    "path": "Modified Pods/DTBonjour/readme.markdown",
    "content": "About DTBonjour\n==================\n\n[![Build Status](https://travis-ci.org/Cocoanetics/DTBonjour.png?branch=develop)](https://travis-ci.org/Cocoanetics/DTFoundation) [![Coverage Status](https://coveralls.io/repos/Cocoanetics/DTFoundation/badge.png?branch=develop)](https://coveralls.io/r/Cocoanetics/DTBonjour?branch=develop)\n\nDTBonjour had its origin when I wanted communicate between a Mac app and an iOS app. It greatly simplifies networking over WiFi by giving you an easy method to transmit any NSObject that conforms to NSCoding.\n\nDocumentation\n-------------\n\nDocumentation can be [browsed online](https://docs.cocoanetics.com/DTBonjour) or installed in your Xcode Organizer via the [Atom Feed URL](https://docs.cocoanetics.com/DTBonjour/DTBonjour).\n\nHere is a [tutorial](http://www.cocoanetics.com/2012/11/and-bonjour-to-you-too/) on how to build a simple chat app with DTBonjour.\n\nUsage\n-----\n\nYou have these options of including DTBonjour in your project\n\n- DTBonjour on CocoaPods\n- include the git repo as a submodule\n- clone a copy of it into an Externals folder in your project tree\n\nWhen not using CocoaPods these are the steps for setup:\n\n- include the xcodeproj as a sub-project\n- Add the ObjC and all_load linker flags\n- add a dependency to the static library for your platform\n- add the static library also to the linking phase\n- add a User Header Search Path into the location where you have the code\n\nLicense\n-------\n\nIt is open source and covered by a standard 2-clause BSD license. That means you have to mention *Cocoanetics* as the original author of this code and reproduce the LICENSE text inside your app. \n\nYou can purchase a [Non-Attribution-License](https://www.cocoanetics.com/order/?product_id=DTBonjour) for 75 Euros for not having to include the LICENSE text.\n\nWe also accept sponsorship for specific enhancements which you might need. Please [contact us via email](mailto:oliver@cocoanetics.com?subject=DTBonjour) for inquiries.\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/.gitignore",
    "content": "# OS X\n.DS_Store\n\n# Xcode\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\nprofile\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n\n# Bundler\n.bundle\n\nCarthage\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control\n# \n# Note: if you ignore the Pods directory, make sure to uncomment\n# `pod install` in .travis.yml\n#\nPods/\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/.hgignore",
    "content": "syntax: glob\n\n*.pbxuser\n*.mode1v3\n*.xcuserdatad\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/.travis.yml",
    "content": "language: objective-c\nosx_image: xcode7.3\n\nscript:\n  - pod install --project-directory=./Tests/Mac --no-repo-update\n  - pod install --project-directory=./Tests/iOS --no-repo-update\n  - pod install --project-directory=./Tests/iOS-static --no-repo-update\n  - pod install --project-directory=./Tests/Swift --no-repo-update\n  - pod install --project-directory=./Tests/Swift-iOS --no-repo-update\n  - xctool -workspace ./Tests/Mac/KissXML.xcworkspace -scheme KissXMLTests -sdk macosx -arch x86_64 test\n  - xctool -workspace ./Tests/iOS/KissXML.xcworkspace -scheme KissXMLTests -sdk iphonesimulator -arch x86_64 test\n  - xctool -workspace ./Tests/iOS-static/KissXML.xcworkspace -scheme KissXMLTests -sdk iphonesimulator -arch x86_64 test\n  - xctool -workspace ./Tests/Swift/KissXML.xcworkspace -scheme KissXMLSwiftTests -sdk macosx -arch x86_64 test\n  - xctool -workspace ./Tests/Swift-iOS/KissXML.xcworkspace -scheme KissXMLSwiftTests -sdk iphonesimulator -arch x86_64 test\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/Additions/DDXMLElementAdditions.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDXML.h\"\n\n// These methods are not part of the standard NSXML API.\n// But any developer working extensively with XML will likely appreciate them.\n\nNS_ASSUME_NONNULL_BEGIN\n@interface DDXMLElement (DDAdditions)\n\n+ (nullable DDXMLElement *)elementWithName:(NSString *)name xmlns:(NSString *)ns;\n\n- (nullable DDXMLElement *)elementForName:(NSString *)name;\n- (nullable DDXMLElement *)elementForName:(NSString *)name xmlns:(NSString *)xmlns;\n\n- (nullable NSString *)xmlns;\n- (void)setXmlns:(NSString *)ns;\n\n- (NSString *)prettyXMLString;\n- (NSString *)compactXMLString;\n\n- (void)addAttributeWithName:(NSString *)name stringValue:(NSString *)string;\n\n- (NSDictionary<NSString*,NSString*> *)attributesAsDictionary;\n\n@end\nNS_ASSUME_NONNULL_END"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/Additions/DDXMLElementAdditions.m",
    "content": "#import \"DDXMLElementAdditions.h\"\n\n@implementation DDXMLElement (DDAdditions)\n\n/**\n * Quick method to create an element\n**/\n+ (DDXMLElement *)elementWithName:(NSString *)name xmlns:(NSString *)ns\n{\n\tDDXMLElement *element = [DDXMLElement elementWithName:name];\n\t[element setXmlns:ns];\n\treturn element;\n}\n\n/**\n * This method returns the first child element for the given name.\n * If no child element exists for the given name, returns nil.\n**/\n- (DDXMLElement *)elementForName:(NSString *)name\n{\n\tNSArray *elements = [self elementsForName:name];\n\tif([elements count] > 0)\n\t{\n\t\treturn [elements objectAtIndex:0];\n\t}\n\telse\n\t{\n\t\t// Note: If you port this code to work with Apple's NSXML, beware of the following:\n\t\t// \n\t\t// There is a bug in the NSXMLElement elementsForName: method.\n\t\t// Consider the following XML fragment:\n\t\t// \n\t\t// <query xmlns=\"jabber:iq:private\">\n\t\t//   <x xmlns=\"some:other:namespace\"></x>\n\t\t// </query>\n\t\t// \n\t\t// Calling [query elementsForName:@\"x\"] results in an empty array!\n\t\t// \n\t\t// However, it will work properly if you use the following:\n\t\t// [query elementsForLocalName:@\"x\" URI:@\"some:other:namespace\"]\n\t\t// \n\t\t// The trouble with this is that we may not always know the xmlns in advance,\n\t\t// so in this particular case there is no way to access the element without looping through the children.\n\t\t// \n\t\t// This bug was submitted to apple on June 1st, 2007 and was classified as \"serious\".\n\t\t// \n\t\t// --!!-- This bug does NOT exist in DDXML --!!--\n\t\t\n\t\treturn nil;\n\t}\n}\n\n/**\n * This method returns the first child element for the given name and given xmlns.\n * If no child elements exist for the given name and given xmlns, returns nil.\n**/\n- (DDXMLElement *)elementForName:(NSString *)name xmlns:(NSString *)xmlns\n{\n\tNSArray *elements = [self elementsForLocalName:name URI:xmlns];\n\tif([elements count] > 0)\n\t{\n\t\treturn [elements objectAtIndex:0];\n\t}\n\telse\n\t{\n\t\treturn nil;\n\t}\n}\n\n/**\n * Returns the common xmlns \"attribute\", which is only accessible via the namespace methods.\n * The xmlns value is often used in jabber elements.\n**/\n- (NSString *)xmlns\n{\n\treturn [[self namespaceForPrefix:@\"\"] stringValue];\n}\n\n- (void)setXmlns:(NSString *)ns\n{\n\t// If you use setURI: then the xmlns won't be displayed in the XMLString.\n\t// Adding the namespace this way works properly.\n\t// \n\t// This applies to both Apple's NSXML and DDXML.\n\t\n\t[self addNamespace:[DDXMLNode namespaceWithName:@\"\" stringValue:ns]];\n}\n\n/**\n * Shortcut to get a pretty (formatted) string representation of the element.\n**/\n- (NSString *)prettyXMLString\n{\n\treturn [self XMLStringWithOptions:(DDXMLNodePrettyPrint | DDXMLNodeCompactEmptyElement)];\n}\n\n/**\n * Shortcut to get a compact string representation of the element.\n**/\n- (NSString *)compactXMLString\n{\n    return [self XMLStringWithOptions:DDXMLNodeCompactEmptyElement];\n}\n\n/**\n *\tShortcut to avoid having to manually create a DDXMLNode everytime.\n**/\n- (void)addAttributeWithName:(NSString *)name stringValue:(NSString *)string\n{\n\t[self addAttribute:[DDXMLNode attributeWithName:name stringValue:string]];\n}\n\n/**\n * Returns all the attributes as a dictionary.\n**/\n- (NSDictionary *)attributesAsDictionary\n{\n\tNSArray *attributes = [self attributes];\n\tNSMutableDictionary *result = [NSMutableDictionary dictionaryWithCapacity:[attributes count]];\n\t\n\tuint i;\n\tfor(i = 0; i < [attributes count]; i++)\n\t{\n\t\tDDXMLNode *node = [attributes objectAtIndex:i];\n\t\t\n\t\t[result setObject:[node stringValue] forKey:[node name]];\n\t}\n\treturn result;\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/Categories/NSString+DDXML.h",
    "content": "#import <Foundation/Foundation.h>\n\n// We redefine xmlChar to avoid a non-modular include\ntypedef unsigned char xmlChar;\n\nNS_ASSUME_NONNULL_BEGIN\n@interface NSString (DDXML)\n\n/**\n * xmlChar - A basic replacement for char, a byte in a UTF-8 encoded string.\n**/\n- (const xmlChar *)xmlChar;\n\n- (NSString *)stringByTrimming;\n\n@end\nNS_ASSUME_NONNULL_END"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/Categories/NSString+DDXML.m",
    "content": "#import \"NSString+DDXML.h\"\n\n#if ! __has_feature(objc_arc)\n#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).\n#endif\n\n@implementation NSString (DDXML)\n\n- (const xmlChar *)xmlChar\n{\n\treturn (const xmlChar *)[self UTF8String];\n}\n\n#ifdef GNUSTEP\n- (NSString *)stringByTrimming\n{\n\treturn [self stringByTrimmingSpaces];\n}\n#else\n- (NSString *)stringByTrimming\n{\n\tNSMutableString *mStr = [self mutableCopy];\n\tCFStringTrimWhitespace((__bridge CFMutableStringRef)mStr);\n\t\n\tNSString *result = [mStr copy];\n\t\n\treturn result;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXML.h",
    "content": "/**\n * Welcome to KissXML.\n *\n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n *\n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n *\n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n *\n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n *\n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\n#import \"DDXMLNode.h\"\n#import \"DDXMLElement.h\"\n#import \"DDXMLDocument.h\"\n\n#if TARGET_OS_IPHONE\n\n// Since KissXML is a drop in replacement for NSXML,\n// it may be desireable (when writing cross-platform code to be used on both Mac OS X and iOS)\n// to use the NSXML prefixes instead of the DDXML prefix.\n//\n// This way, on Mac OS X it uses NSXML, and on iOS it uses KissXML.\n\n#ifndef NSXMLNode\n  #define NSXMLNode DDXMLNode\n#endif\n#ifndef NSXMLElement\n  #define NSXMLElement DDXMLElement\n#endif\n#ifndef NSXMLDocument\n  #define NSXMLDocument DDXMLDocument\n#endif\n\n#ifndef NSXMLInvalidKind\n  #define NSXMLInvalidKind DDXMLInvalidKind\n#endif\n#ifndef NSXMLDocumentKind\n  #define NSXMLDocumentKind DDXMLDocumentKind\n#endif\n#ifndef NSXMLElementKind\n  #define NSXMLElementKind DDXMLElementKind\n#endif\n#ifndef NSXMLAttributeKind\n  #define NSXMLAttributeKind DDXMLAttributeKind\n#endif\n#ifndef NSXMLNamespaceKind\n  #define NSXMLNamespaceKind DDXMLNamespaceKind\n#endif\n#ifndef NSXMLProcessingInstructionKind\n  #define NSXMLProcessingInstructionKind DDXMLProcessingInstructionKind\n#endif\n#ifndef NSXMLCommentKind\n  #define NSXMLCommentKind DDXMLCommentKind\n#endif\n#ifndef NSXMLTextKind\n  #define NSXMLTextKind DDXMLTextKind\n#endif\n#ifndef NSXMLDTDKind\n  #define NSXMLDTDKind DDXMLDTDKind\n#endif\n#ifndef NSXMLEntityDeclarationKind\n  #define NSXMLEntityDeclarationKind DDXMLEntityDeclarationKind\n#endif\n#ifndef NSXMLAttributeDeclarationKind\n  #define NSXMLAttributeDeclarationKind DDXMLAttributeDeclarationKind\n#endif\n#ifndef NSXMLElementDeclarationKind\n  #define NSXMLElementDeclarationKind DDXMLElementDeclarationKind\n#endif\n#ifndef NSXMLNotationDeclarationKind\n  #define NSXMLNotationDeclarationKind DDXMLNotationDeclarationKind\n#endif\n\n#ifndef NSXMLNodeOptionsNone\n  #define NSXMLNodeOptionsNone DDXMLNodeOptionsNone\n#endif\n#ifndef NSXMLNodeExpandEmptyElement\n  #define NSXMLNodeExpandEmptyElement DDXMLNodeExpandEmptyElement\n#endif\n#ifndef NSXMLNodeCompactEmptyElement\n  #define NSXMLNodeCompactEmptyElement DDXMLNodeCompactEmptyElement\n#endif\n#ifndef NSXMLNodePrettyPrint\n  #define NSXMLNodePrettyPrint DDXMLNodePrettyPrint\n#endif\n\n#endif // #if TARGET_OS_IPHONE\n\n\n\n// KissXML has rather straight-forward memory management:\n// https://github.com/robbiehanson/KissXML/wiki/MemoryManagementThreadSafety\n//\n// There are 3 important concepts to keep in mind when working with KissXML:\n//\n//\n// 1.) KissXML provides a light-weight wrapper around libxml.\n//\n// The parsing, creation, storage, etc of the xml tree is all done via libxml.\n// This is a fast low-level C library that's been around for ages, and comes pre-installed on Mac OS X and iOS.\n// KissXML provides an easy-to-use Objective-C library atop libxml.\n// So a DDXMLNode, DDXMLElement, or DDXMLDocument are simply objective-c objects\n// with pointers to the underlying libxml C structure.\n// Then only time you need to be aware of any of this is when it comes to equality.\n// In order to maximize speed and provide read-access thread-safety,\n// the library may create multiple DDXML wrapper objects that point to the same underlying xml node.\n// So don't assume you can test for equality with \"==\".\n// Instead use the isEqual method (as you should generally do with objects anyway).\n//\n//\n// 2.) XML is implicitly a tree heirarchy, and the XML API's are designed to allow traversal up & down the tree.\n//\n// The tree heirarchy and API contract have an implicit impact concerning memory management.\n//\n// <starbucks>\n//   <latte/>\n// </starbucks>\n//\n// Imagine you have a DDXMLNode corresponding to the starbucks node,\n// and you have a DDXMLNode corresponding to the latte node.\n// Now imagine you release the starbucks node, but you retain a reference to the latte node.\n// What happens?\n// Well the latte node is a part of the xml tree heirarchy.\n// So if the latte node is still around, the xml tree heirarchy must stick around as well.\n// So even though the DDXMLNode corresponding to the starbucks node may get deallocated,\n// the underlying xml tree structure won't be freed until the latte node gets dealloacated.\n//\n// In general, this means that KissXML remains thread-safe when reading and processing a tree.\n// If you traverse a tree and fork off asynchronous tasks to process subnodes,\n// the tree will remain properly in place until all your asynchronous tasks have completed.\n// In other words, it just works.\n//\n// However, if you parse a huge document into memory, and retain a single node from the giant xml tree...\n// Well you should see the problem this creates.\n// Instead, in this situation, copy or detach the node if you want to keep it around.\n// Or just extract the info you need from it.\n//\n//\n// 3.) KissXML is read-access thread-safe, but write-access thread-unsafe (designed for speed).\n//\n// <starbucks>\n//   <latte/>\n// </starbucks>\n//\n// Imagine you have a DDXMLNode corresponding to the starbucks node,\n// and you have a DDXMLNode corresponding to the latte node.\n// What happens if you invoke [starbucks removeChildAtIndex:0]?\n// Well the undelying xml tree will remove the latte node, and release the associated memory.\n// And what if you still have a reference to the DDXMLNode that corresponds to the latte node?\n// Well the short answer is that you shouldn't use it. At all.\n// This is pretty obvious when you think about it from the context of this simple example.\n// But in the real world, you might have multiple threads running in parallel,\n// and you might accidently modify a node while another thread is processing it.\n//\n// To completely fix this problem, and provide write-access thread-safety, would require extensive overhead.\n// This overhead is completely unwanted in the majority of cases.\n// Most XML usage patterns are heavily read-only.\n// And in the case of xml creation or modification, it is generally done on the same thread.\n// Thus the KissXML library is write-access thread-unsafe, but provides speedier performance.\n//\n// However, when such a bug does creep up, it produces horrible side-effects.\n// Essentially the pointer to the underlying xml structure becomes a dangling pointer,\n// which means that accessing the dangling pointer might give you the correct results, or completely random results.\n// And attempting to make modifications to non-existant xml nodes via the dangling pointer might do nothing,\n// or completely corrupt your heap and cause un-explainable crashes in random parts of your library.\n// Heap corruption is one of the worst problems to track down.\n// So to help out, the library provides a debugging macro to track down these problems.\n// That is, if you invalidate the write-access thread-unsafe rule,\n// this macro will tell you when you're trying to access a now-dangling pointer.\n//\n// How does it work?\n// Well everytime a DDXML wrapper object is created atop a libxml structure,\n// it marks the linkage in a table.\n// And everytime a libxml structure is freed, it destorys all corresponding linkages in the table.\n// So everytime a DDXML wrapper objects is about to dereference it's pointer,\n// it first ensures the linkage still exists in the table.\n//\n// Set to 1 to enable\n// Set to 0 to disable (this is the default)\n//\n// The debugging macro adds a significant amount of overhead, and should NOT be enabled on production builds.\n\n#if DEBUG\n  #define DDXML_DEBUG_MEMORY_ISSUES 0\n#else\n  #define DDXML_DEBUG_MEMORY_ISSUES 0 // Don't change me!\n#endif\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXML.swift",
    "content": "//\n//  File.swift\n//  KissXML\n//\n//  Created by David Chiles on 1/29/16.\n//\n//\n\nimport Foundation\n\n#if os(iOS) || os(watchOS) || os(tvOS)\n    public typealias  NSXMLNode = DDXMLNode\n    public typealias  NSXMLElement = DDXMLElement\n    public typealias  NSXMLDocument = DDXMLDocument\n    public let  NSXMLInvalidKind = DDXMLInvalidKind\n    public let  NSXMLDocumentKind = DDXMLDocumentKind\n    public let  NSXMLElementKind = DDXMLElementKind\n    public let  NSXMLAttributeKind = DDXMLAttributeKind\n    public let  NSXMLNamespaceKind = DDXMLNamespaceKind\n    public let  NSXMLProcessingInstructionKind = DDXMLProcessingInstructionKind\n    public let  NSXMLCommentKind = DDXMLCommentKind\n    public let  NSXMLTextKind = DDXMLTextKind\n    public let  NSXMLDTDKind = DDXMLDTDKind\n    public let  NSXMLEntityDeclarationKind = DDXMLEntityDeclarationKind\n    public let  NSXMLAttributeDeclarationKind = DDXMLAttributeDeclarationKind\n    public let  NSXMLElementDeclarationKind = DDXMLElementDeclarationKind\n    public let  NSXMLNotationDeclarationKind = DDXMLNotationDeclarationKind\n    public let  NSXMLNodeOptionsNone = DDXMLNodeOptionsNone\n    public let  NSXMLNodeExpandEmptyElement = DDXMLNodeExpandEmptyElement\n    public let  NSXMLNodeCompactEmptyElement = DDXMLNodeCompactEmptyElement\n    public let  NSXMLNodePrettyPrint = DDXMLNodePrettyPrint\n#endif\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLDocument.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDXMLElement.h\"\n#import \"DDXMLNode.h\"\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\nenum {\n\tDDXMLDocumentXMLKind = 0,\n\tDDXMLDocumentXHTMLKind,\n\tDDXMLDocumentHTMLKind,\n\tDDXMLDocumentTextKind\n};\ntypedef NSUInteger DDXMLDocumentContentKind;\n\nNS_ASSUME_NONNULL_BEGIN\n@interface DDXMLDocument : DDXMLNode\n{\n}\n\n- (nullable instancetype)initWithXMLString:(NSString *)string options:(NSUInteger)mask error:(NSError **)error;\n//- (instancetype)initWithContentsOfURL:(NSURL *)url options:(NSUInteger)mask error:(NSError **)error;\n- (nullable instancetype)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)error;\n//- (instancetype)initWithRootElement:(DDXMLElement *)element;\n\n//+ (Class)replacementClassForClass:(Class)cls;\n\n//- (void)setCharacterEncoding:(NSString *)encoding; //primitive\n//- (NSString *)characterEncoding; //primitive\n\n//- (void)setVersion:(NSString *)version;\n//- (NSString *)version;\n\n//- (void)setStandalone:(BOOL)standalone;\n//- (BOOL)isStandalone;\n\n//- (void)setDocumentContentKind:(DDXMLDocumentContentKind)kind;\n//- (DDXMLDocumentContentKind)documentContentKind;\n\n//- (void)setMIMEType:(NSString *)MIMEType;\n//- (NSString *)MIMEType;\n\n//- (void)setDTD:(DDXMLDTD *)documentTypeDeclaration;\n//- (DDXMLDTD *)DTD;\n\n//- (void)setRootElement:(DDXMLNode *)root;\n- (nullable DDXMLElement *)rootElement;\n\n//- (void)insertChild:(DDXMLNode *)child atIndex:(NSUInteger)index;\n\n//- (void)insertChildren:(NSArray *)children atIndex:(NSUInteger)index;\n\n//- (void)removeChildAtIndex:(NSUInteger)index;\n\n//- (void)setChildren:(NSArray *)children;\n\n//- (void)addChild:(DDXMLNode *)child;\n\n//- (void)replaceChildAtIndex:(NSUInteger)index withNode:(DDXMLNode *)node;\n\n@property (readonly, copy) NSData *XMLData;\n- (NSData *)XMLDataWithOptions:(NSUInteger)options;\n\n//- (instancetype)objectByApplyingXSLT:(NSData *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error;\n//- (instancetype)objectByApplyingXSLTString:(NSString *)xslt arguments:(NSDictionary *)arguments error:(NSError **)error;\n//- (instancetype)objectByApplyingXSLTAtURL:(NSURL *)xsltURL arguments:(NSDictionary *)argument error:(NSError **)error;\n\n//- (BOOL)validateAndReturnError:(NSError **)error;\n\n@end\nNS_ASSUME_NONNULL_END"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLDocument.m",
    "content": "#import <libxml/parser.h>\n#import \"DDXMLPrivate.h\"\n#import \"NSString+DDXML.h\"\n\n#if ! __has_feature(objc_arc)\n#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).\n#endif\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\n@implementation DDXMLDocument\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n+ (instancetype)nodeWithDocPrimitive:(xmlDocPtr)doc owner:(DDXMLNode *)owner\n{\n\treturn [[DDXMLDocument alloc] initWithDocPrimitive:doc owner:owner];\n}\n\n- (instancetype)initWithDocPrimitive:(xmlDocPtr)doc owner:(DDXMLNode *)inOwner\n{\n\tself = [super initWithPrimitive:(xmlKindPtr)doc owner:inOwner];\n\treturn self;\n}\n\n+ (instancetype)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes\n\tNSAssert(NO, @\"Use nodeWithDocPrimitive:owner:\");\n\t\n\treturn nil;\n}\n\n- (instancetype)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)inOwner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use initWithDocPrimitive:owner:\");\n\t\n\treturn nil;\n}\n\n/**\n * Initializes and returns a DDXMLDocument object created from an NSData object.\n * \n * Returns an initialized DDXMLDocument object, or nil if initialization fails\n * because of parsing errors or other reasons.\n**/\n- (instancetype)initWithXMLString:(NSString *)string options:(NSUInteger)mask error:(NSError **)error\n{\n\treturn [self initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]\n\t                  options:mask\n\t                    error:error];\n}\n\n/**\n * Initializes and returns a DDXMLDocument object created from an NSData object.\n * \n * Returns an initialized DDXMLDocument object, or nil if initialization fails\n * because of parsing errors or other reasons.\n**/\n- (instancetype)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)error\n{\n\tif (data == nil || [data length] == 0)\n\t{\n\t\tif (error) *error = [NSError errorWithDomain:@\"DDXMLErrorDomain\" code:0 userInfo:nil];\n\t\t\n\t\treturn nil;\n\t}\n\t\n\t// Even though xmlKeepBlanksDefault(0) is called in DDXMLNode's initialize method,\n\t// it has been documented that this call seems to get reset on the iPhone:\n\t// http://code.google.com/p/kissxml/issues/detail?id=8\n\t// \n\t// Therefore, we call it again here just to be safe.\n\txmlKeepBlanksDefault(0);\n\t\n\txmlDocPtr doc = xmlParseMemory([data bytes], (int)[data length]);\n\tif (doc == NULL)\n\t{\n\t\tif (error) *error = [NSError errorWithDomain:@\"DDXMLErrorDomain\" code:1 userInfo:nil];\n\t\t\n\t\treturn nil;\n\t}\n\t\n\treturn [self initWithDocPrimitive:doc owner:nil];\n}\n\n/**\n * Returns the root element of the receiver.\n**/\n- (DDXMLElement *)rootElement\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlDocPtr doc = (xmlDocPtr)self->genericPtr;\n\t\n\t// doc->children is a list containing possibly comments, DTDs, etc...\n\t\n\txmlNodePtr rootNode = xmlDocGetRootElement(doc);\n\t\n\tif (rootNode != NULL)\n\t\treturn [DDXMLElement nodeWithElementPrimitive:rootNode owner:self];\n\telse\n\t\treturn nil;\n}\n\n- (NSData *)XMLData\n{\n\t// Zombie test occurs in XMLString\n\t\n\treturn [[self XMLString] dataUsingEncoding:NSUTF8StringEncoding];\n}\n\n- (NSData *)XMLDataWithOptions:(NSUInteger)options\n{\n\t// Zombie test occurs in XMLString\n\t\n\treturn [[self XMLStringWithOptions:options] dataUsingEncoding:NSUTF8StringEncoding];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLElement.h",
    "content": "#import <Foundation/Foundation.h>\n#import \"DDXMLNode.h\"\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\nNS_ASSUME_NONNULL_BEGIN\n@interface DDXMLElement : DDXMLNode\n{\n}\n\n- (instancetype)initWithName:(NSString *)name;\n- (instancetype)initWithName:(NSString *)name URI:(nullable NSString *)URI;\n- (instancetype)initWithName:(NSString *)name stringValue:(nullable NSString *)string;\n- (nullable instancetype)initWithXMLString:(NSString *)string error:(NSError **)error;\n\n#pragma mark --- Elements by name ---\n\n- (NSArray<DDXMLElement *> *)elementsForName:(NSString *)name;\n- (NSArray<DDXMLElement *> *)elementsForLocalName:(NSString *)localName URI:(nullable NSString *)URI;\n\n#pragma mark --- Attributes ---\n\n- (void)addAttribute:(DDXMLNode *)attribute;\n- (void)removeAttributeForName:(NSString *)name;\n@property (nullable, copy) NSArray<DDXMLNode *> *attributes;\n//- (void)setAttributesAsDictionary:(NSDictionary *)attributes;\n- (nullable DDXMLNode *)attributeForName:(NSString *)name;\n//- (DDXMLNode *)attributeForLocalName:(NSString *)localName URI:(NSString *)URI;\n\n#pragma mark --- Namespaces ---\n\n- (void)addNamespace:(DDXMLNode *)aNamespace;\n- (void)removeNamespaceForPrefix:(NSString *)name;\n@property (nullable, copy) NSArray<DDXMLNode *> *namespaces; //primitive\n- (nullable DDXMLNode *)namespaceForPrefix:(NSString *)prefix;\n- (nullable DDXMLNode *)resolveNamespaceForName:(NSString *)name;\n- (nullable NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI;\n\n#pragma mark --- Children ---\n\n- (void)insertChild:(DDXMLNode *)child atIndex:(NSUInteger)index;\n//- (void)insertChildren:(NSArray *)children atIndex:(NSUInteger)index;\n- (void)removeChildAtIndex:(NSUInteger)index;\n- (void)setChildren:(nullable NSArray<DDXMLNode *> *)children;\n- (void)addChild:(DDXMLNode *)child;\n//- (void)replaceChildAtIndex:(NSUInteger)index withNode:(DDXMLNode *)node;\n//- (void)normalizeAdjacentTextNodesPreservingCDATA:(BOOL)preserve;\n\n@end\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLElement.m",
    "content": "#import \"DDXMLPrivate.h\"\n#import \"NSString+DDXML.h\"\n\n#if ! __has_feature(objc_arc)\n#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).\n#endif\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\n@implementation DDXMLElement\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n+ (instancetype)nodeWithElementPrimitive:(xmlNodePtr)node owner:(DDXMLNode *)owner\n{\n\treturn [[DDXMLElement alloc] initWithElementPrimitive:node owner:owner];\n}\n\n- (instancetype)initWithElementPrimitive:(xmlNodePtr)node owner:(DDXMLNode *)inOwner\n{\n\tself = [super initWithPrimitive:(xmlKindPtr)node owner:inOwner];\n\treturn self;\n}\n\n+ (instancetype)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes\n\tNSAssert(NO, @\"Use nodeWithElementPrimitive:owner:\");\n\t\n\treturn nil;\n}\n\n- (instancetype)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)inOwner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use initWithElementPrimitive:owner:\");\n\t\n\treturn nil;\n}\n\n- (instancetype)initWithName:(NSString *)name\n{\n\t// Note: Make every guarantee that genericPtr is not null\n\t\n\txmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);\n\tif (node == NULL)\n\t{\n\t\treturn nil;\n\t}\n\t\n\treturn [self initWithElementPrimitive:node owner:nil];\n}\n\n- (instancetype)initWithName:(NSString *)name URI:(NSString *)URI\n{\n\t// Note: Make every guarantee that genericPtr is not null\n\t\n\txmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);\n\tif (node == NULL)\n\t{\n\t\treturn nil;\n\t}\n\t\n\tDDXMLElement *result = [self initWithElementPrimitive:node owner:nil];\n\t[result setURI:URI];\n\t\n\treturn result;\n}\n\n- (instancetype)initWithName:(NSString *)name stringValue:(NSString *)string\n{\n\t// Note: Make every guarantee that genericPtr is not null\n\t\n\txmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);\n\tif (node == NULL)\n\t{\n\t\treturn nil;\n\t}\n\t\n\tDDXMLElement *result = [self initWithElementPrimitive:node owner:nil];\n\t[result setStringValue:string];\n\t\n\treturn result;\n}\n\n- (instancetype)initWithXMLString:(NSString *)string error:(NSError **)error\n{\n\tDDXMLDocument *doc = [[DDXMLDocument alloc] initWithXMLString:string options:0 error:error];\n\tif (doc == nil)\n\t{\n\t\treturn nil;\n\t}\n\t\n\tDDXMLElement *result = [doc rootElement];\n\t[result detach];\n\t\n\treturn result;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Elements by name\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Helper method elementsForName and elementsForLocalName:URI: so work isn't duplicated.\n * The name parameter is required, all others are optional.\n**/\n- (NSArray *)_elementsForName:(NSString *)name\n                    localName:(NSString *)localName\n                       prefix:(NSString *)prefix\n                          uri:(NSString *)uri\n{\n\t// This is a private/internal method\n\t\n\t// Rule : !uri             => match: name\n\t// Rule : uri && hasPrefix => match: name || (localName && uri)\n\t// Rule : uri && !hasPefix => match: name && uri\n\t\n\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\n\tNSMutableArray *result = [NSMutableArray array];\n\t\n\tBOOL hasPrefix = [prefix length] > 0;\n\t\n\tconst xmlChar *xmlName      = [name xmlChar];\n\tconst xmlChar *xmlLocalName = [localName xmlChar];\n\tconst xmlChar *xmlUri       = [uri xmlChar];\n\t\n\txmlNodePtr child = node->children;\n\twhile (child)\n\t{\n\t\tif (IsXmlNodePtr(child))\n\t\t{\n\t\t\tBOOL match = NO;\n\t\t\t\n\t\t\tif (uri == nil)\n\t\t\t{\n\t\t\t\tmatch = xmlStrEqual(child->name, xmlName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tBOOL nameMatch      = xmlStrEqual(child->name, xmlName);\n\t\t\t\tBOOL localNameMatch = xmlStrEqual(child->name, xmlLocalName);\n\t\t\t\t\n\t\t\t\tBOOL uriMatch = NO;\n\t\t\t\tif (child->ns)\n\t\t\t\t{\n\t\t\t\t\turiMatch = xmlStrEqual(child->ns->href, xmlUri);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (hasPrefix)\n\t\t\t\t\tmatch = nameMatch || (localNameMatch && uriMatch);\n\t\t\t\telse\n\t\t\t\t\tmatch = nameMatch && uriMatch;\n\t\t\t}\n\t\t\t\n\t\t\tif (match)\n\t\t\t{\n\t\t\t\t[result addObject:[DDXMLElement nodeWithElementPrimitive:child owner:self]];\n\t\t\t}\n\t\t}\n\t\t\n\t\tchild = child->next;\n\t}\n\t\n\treturn result;\n}\n\n/**\n * Returns the child element nodes (as DDXMLElement objects) of the receiver that have a specified name.\n * \n * If name is a qualified name, then this method invokes elementsForLocalName:URI: with the URI parameter set to\n * the URI associated with the prefix. Otherwise comparison is based on string equality of the qualified or\n * non-qualified name.\n**/\n- (NSArray *)elementsForName:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (name == nil) return [NSArray array];\n\t\n\t// We need to check to see if name has a prefix.\n\t// If it does have a prefix, we need to figure out what the corresponding URI is for that prefix,\n\t// and then search for any elements that have the same name (including prefix) OR have the same URI.\n\t// Otherwise we loop through the children as usual and do a string compare on the name\n\t\n\tNSString *prefix;\n\tNSString *localName;\n\t\n\t[DDXMLNode getPrefix:&prefix localName:&localName forName:name];\n\t\n\tif ([prefix length] > 0)\n\t{\n\t\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\t\n\t\t// Note: We use xmlSearchNs instead of resolveNamespaceForName: because\n\t\t// we want to avoid creating wrapper objects when possible.\n\t\t\n\t\txmlNsPtr ns = xmlSearchNs(node->doc, node, [prefix xmlChar]);\n\t\tif (ns)\n\t\t{\n\t\t\tNSString *uri = [NSString stringWithUTF8String:((const char *)ns->href)];\n\t\t\treturn [self _elementsForName:name localName:localName prefix:prefix uri:uri];\n\t\t}\n\t}\n\t\n\treturn [self _elementsForName:name localName:localName prefix:prefix uri:nil];\n}\n\n- (NSArray *)elementsForLocalName:(NSString *)localName URI:(NSString *)uri\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (localName == nil) return [NSArray array];\n\t\n\t// We need to figure out what the prefix is for this URI.\n\t// Then we search for elements that are named prefix:localName OR (named localName AND have the given URI).\n\t\n\tNSString *prefix = [self _recursiveResolvePrefixForURI:uri atNode:(xmlNodePtr)genericPtr];\n\tif (prefix)\n\t{\n\t\tNSString *name = [NSString stringWithFormat:@\"%@:%@\", prefix, localName];\n\t\t\n\t\treturn [self _elementsForName:name localName:localName prefix:prefix uri:uri];\n\t}\n\telse\n\t{\n\t\tNSString *prefix;\n\t\tNSString *realLocalName;\n\t\t\n\t\t[DDXMLNode getPrefix:&prefix localName:&realLocalName forName:localName];\n\t\t\n\t\treturn [self _elementsForName:localName localName:realLocalName prefix:prefix uri:uri];\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Attributes\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (BOOL)_hasAttributeWithName:(NSString *)name\n{\n\t// This is a private/internal method\n\t\n\txmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;\n\tif (attr)\n\t{\n\t\tconst xmlChar *xmlName = [name xmlChar];\n\t\tdo\n\t\t{\n\t\t\tif (xmlStrEqual(attr->name, xmlName))\n\t\t\t{\n\t\t\t\treturn YES;\n\t\t\t}\n\t\t\tattr = attr->next;\n\t\t\t\n\t\t} while (attr);\n\t}\n\t\n\treturn NO;\n}\n\n- (void)_removeAttributeForName:(NSString *)name\n{\n\t// This is a private/internal method\n\t\n\txmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;\n\tif (attr)\n\t{\n\t\tconst xmlChar *xmlName = [name xmlChar];\n\t\tdo\n\t\t{\n\t\t\tif (xmlStrEqual(attr->name, xmlName))\n\t\t\t{\n\t\t\t\t[DDXMLNode removeAttribute:attr];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tattr = attr->next;\n\t\t\t\n\t\t} while(attr);\n\t}\n}\n\n- (void)addAttribute:(DDXMLNode *)attribute\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// NSXML version uses this same assertion\n\tDDXMLAssert([attribute _hasParent] == NO, @\"Cannot add an attribute with a parent; detach or copy first\");\n\tDDXMLAssert(IsXmlAttrPtr(attribute->genericPtr), @\"Not an attribute\");\n\t\n\t[self _removeAttributeForName:[attribute name]];\n\t\n\t// xmlNodePtr xmlAddChild(xmlNodePtr parent, xmlNodePtr cur)\n\t// Add a new node to @parent, at the end of the child (or property) list merging\n\t// adjacent TEXT nodes (in which case @cur is freed). If the new node is ATTRIBUTE, it is added\n\t// into properties instead of children. If there is an attribute with equal name, it is first destroyed.\n\t\n\txmlAddChild((xmlNodePtr)genericPtr, (xmlNodePtr)attribute->genericPtr);\n\t\n\t// The attribute is now part of the xml tree heirarchy\n\tattribute->owner = self;\n}\n\n- (void)removeAttributeForName:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[self _removeAttributeForName:name];\n}\n\n- (NSArray *)attributes\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSMutableArray *result = [NSMutableArray array];\n\t\n\txmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;\n\twhile (attr != NULL)\n\t{\n\t\t[result addObject:[DDXMLAttributeNode nodeWithAttrPrimitive:attr owner:self]];\n\t\t\n\t\tattr = attr->next;\n\t}\n\t\n\treturn result;\n}\n\n- (DDXMLNode *)attributeForName:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;\n\tif (attr)\n\t{\n\t\tconst xmlChar *xmlName = [name xmlChar];\n\t\tdo\n\t\t{\n\t\t\tif (attr->ns && attr->ns->prefix)\n\t\t\t{\n\t\t\t\t// If the attribute name was originally something like \"xml:quack\",\n\t\t\t\t// then attr->name is \"quack\" and attr->ns->prefix is \"xml\".\n\t\t\t\t// \n\t\t\t\t// So if the user is searching for \"xml:quack\" we need to take the prefix into account.\n\t\t\t\t// Note that \"xml:quack\" is what would be printed if we output the attribute.\n\t\t\t\t\n\t\t\t\tif (xmlStrQEqual(attr->ns->prefix, attr->name, xmlName))\n\t\t\t\t{\n\t\t\t\t\treturn [DDXMLAttributeNode nodeWithAttrPrimitive:attr owner:self];\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (xmlStrEqual(attr->name, xmlName))\n\t\t\t\t{\n\t\t\t\t\treturn [DDXMLAttributeNode nodeWithAttrPrimitive:attr owner:self];\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tattr = attr->next;\n\t\t\t\n\t\t} while (attr);\n\t}\n\treturn nil;\n}\n\n/**\n * Sets the list of attributes for the element.\n * Any previously set attributes are removed.\n**/\n- (void)setAttributes:(NSArray *)attributes\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[DDXMLNode removeAllAttributesFromNode:(xmlNodePtr)genericPtr];\n\t\n\tNSUInteger i;\n\tfor (i = 0; i < [attributes count]; i++)\n\t{\n\t\tDDXMLNode *attribute = [attributes objectAtIndex:i];\n\t\t[self addAttribute:attribute];\n\t\t\n\t\t// Note: The addAttributes method properly sets the freeOnDealloc ivar.\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Namespaces\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (void)_removeNamespaceForPrefix:(NSString *)name\n{\n\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\n\t// If name is nil or the empty string, the user is wishing to remove the default namespace\n\tconst xmlChar *xmlName = [name length] > 0 ? [name xmlChar] : NULL;\n\t\n\txmlNsPtr ns = node->nsDef;\n\twhile (ns != NULL)\n\t{\n\t\tif (xmlStrEqual(ns->prefix, xmlName))\n\t\t{\n\t\t\t[DDXMLNode removeNamespace:ns fromNode:node];\n\t\t\tbreak;\n\t\t}\n\t\tns = ns->next;\n\t}\n\t\n\t// Note: The removeNamespace method properly handles the situation where the namespace is the default namespace\n}\n\n- (void)_addNamespace:(DDXMLNode *)namespace\n{\n\t// NSXML version uses this same assertion\n\tDDXMLAssert([namespace _hasParent] == NO, @\"Cannot add a namespace with a parent; detach or copy first\");\n\tDDXMLAssert(IsXmlNsPtr(namespace->genericPtr), @\"Not a namespace\");\n\t\n\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\txmlNsPtr ns = (xmlNsPtr)namespace->genericPtr;\n\t\n\t// Beware: [namespace prefix] does NOT return what you might expect.  Use [namespace name] instead.\n\t\n\tNSString *namespaceName = [namespace name];\n\t\n\t[self _removeNamespaceForPrefix:namespaceName];\n\t\n\txmlNsPtr currentNs = node->nsDef;\n\tif (currentNs == NULL)\n\t{\n\t\tnode->nsDef = ns;\n\t}\n\telse\n\t{\n\t\twhile (currentNs->next != NULL)\n\t\t{\n\t\t\tcurrentNs = currentNs->next;\n\t\t}\n\t\t\n\t\tcurrentNs->next = ns;\n\t}\n\t\n\t// The namespace is now part of the xml tree heirarchy\n\tnamespace->owner = self;\n\t\n\tif ([namespace isKindOfClass:[DDXMLNamespaceNode class]])\n\t{\n\t\tDDXMLNamespaceNode *ddNamespace = (DDXMLNamespaceNode *)namespace;\n\t\t\n\t\t// The xmlNs structure doesn't contain a reference to the parent, so we manage our own reference\n\t\t[ddNamespace _setNsParentPtr:node];\n\t}\n\t\n\t// Did we just add a default namespace\n\tif ([namespaceName isEqualToString:@\"\"])\n\t{\n\t\tnode->ns = ns;\n\t\t\n\t\t// Note: The removeNamespaceForPrefix method above properly handled removing any previous default namespace\n\t}\n}\n\n- (void)addNamespace:(DDXMLNode *)namespace\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[self _addNamespace:namespace];\n}\n\n- (void)removeNamespaceForPrefix:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[self _removeNamespaceForPrefix:name];\n}\n\n- (NSArray *)namespaces\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSMutableArray *result = [NSMutableArray array];\n\t\n\txmlNsPtr ns = ((xmlNodePtr)genericPtr)->nsDef;\n\twhile (ns != NULL)\n\t{\n\t\t[result addObject:[DDXMLNamespaceNode nodeWithNsPrimitive:ns nsParent:(xmlNodePtr)genericPtr owner:self]];\n\t\t\n\t\tns = ns->next;\n\t}\n\t\n\treturn result;\n}\n\n- (DDXMLNode *)namespaceForPrefix:(NSString *)prefix\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// If the prefix is nil or the empty string, the user is requesting the default namespace\n\t\n\tif ([prefix length] == 0)\n\t{\n\t\t// Requesting the default namespace\n\t\txmlNsPtr ns = ((xmlNodePtr)genericPtr)->ns;\n\t\tif (ns != NULL)\n\t\t{\n\t\t\treturn [DDXMLNamespaceNode nodeWithNsPrimitive:ns nsParent:(xmlNodePtr)genericPtr owner:self];\n\t\t}\n\t}\n\telse\n\t{\n\t\txmlNsPtr ns = ((xmlNodePtr)genericPtr)->nsDef;\n\t\tif (ns)\n\t\t{\n\t\t\tconst xmlChar *xmlPrefix = [prefix xmlChar];\n\t\t\tdo\n\t\t\t{\n\t\t\t\tif (xmlStrEqual(ns->prefix, xmlPrefix))\n\t\t\t\t{\n\t\t\t\t\treturn [DDXMLNamespaceNode nodeWithNsPrimitive:ns nsParent:(xmlNodePtr)genericPtr owner:self];\n\t\t\t\t}\n\t\t\t\tns = ns->next;\n\t\t\t\t\n\t\t\t} while (ns);\n\t\t}\n\t}\n\t\n\treturn nil;\n}\n\n- (void)setNamespaces:(NSArray *)namespaces\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[DDXMLNode removeAllNamespacesFromNode:(xmlNodePtr)genericPtr];\n\t\n\tNSUInteger i;\n\tfor (i = 0; i < [namespaces count]; i++)\n\t{\n\t\tDDXMLNode *namespace = [namespaces objectAtIndex:i];\n\t\t[self _addNamespace:namespace];\n\t\t\n\t\t// Note: The addNamespace method properly sets the freeOnDealloc ivar.\n\t}\n}\n\n/**\n * Recursively searches the given node for the given namespace\n**/\n- (DDXMLNode *)_recursiveResolveNamespaceForPrefix:(NSString *)prefix atNode:(xmlNodePtr)nodePtr\n{\n\t// This is a private/internal method\n\t\n\tif (nodePtr == NULL) return nil;\n\t\n\txmlNsPtr ns = nodePtr->nsDef;\n\tif (ns)\n\t{\n\t\tconst xmlChar *xmlPrefix = [prefix xmlChar];\n\t\tdo\n\t\t{\n\t\t\tif (xmlStrEqual(ns->prefix, xmlPrefix))\n\t\t\t{\n\t\t\t\treturn [DDXMLNamespaceNode nodeWithNsPrimitive:ns nsParent:nodePtr owner:self];\n\t\t\t}\n\t\t\tns = ns->next;\n\t\t\t\n\t\t} while(ns);\n\t}\n\t\n\treturn [self _recursiveResolveNamespaceForPrefix:prefix atNode:nodePtr->parent];\n}\n\n/**\n * Returns the namespace node with the prefix matching the given qualified name.\n * Eg: You pass it \"a:dog\", it returns the namespace (defined in this node or parent nodes) that has the \"a\" prefix.\n**/\n- (DDXMLNode *)resolveNamespaceForName:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// If the user passes nil or an empty string for name, they're looking for the default namespace.\n\tif ([name length] == 0)\n\t{\n\t\treturn [self _recursiveResolveNamespaceForPrefix:nil atNode:(xmlNodePtr)genericPtr];\n\t}\n\t\n\tNSString *prefix = [[self class] prefixForName:name];\n\t\n\tif ([prefix length] > 0)\n\t{\n\t\t// Unfortunately we can't use xmlSearchNs because it returns an xmlNsPtr.\n\t\t// This gives us mostly what we want, except we also need to know the nsParent.\n\t\t// So we do the recursive search ourselves.\n\t\t\n\t\treturn [self _recursiveResolveNamespaceForPrefix:prefix atNode:(xmlNodePtr)genericPtr];\n\t}\n\t\n\treturn nil;\n}\n\n/**\n * Recursively searches the given node for a namespace with the given URI, and a set prefix.\n**/\n- (NSString *)_recursiveResolvePrefixForURI:(NSString *)uri atNode:(xmlNodePtr)nodePtr\n{\n\t// This is a private/internal method\n\t\n\tif (nodePtr == NULL) return nil;\n\t\n\txmlNsPtr ns = nodePtr->nsDef;\n\tif (ns)\n\t{\n\t\tconst xmlChar *xmlUri = [uri xmlChar];\n\t\tdo\n\t\t{\n\t\t\tif (xmlStrEqual(ns->href, xmlUri))\n\t\t\t{\n\t\t\t\tif (ns->prefix != NULL)\n\t\t\t\t{\n\t\t\t\t\treturn [NSString stringWithUTF8String:((const char *)ns->prefix)];\n\t\t\t\t}\n\t\t\t}\n\t\t\tns = ns->next;\n\t\t\t\n\t\t} while (ns);\n\t}\n\t\n\treturn [self _recursiveResolvePrefixForURI:uri atNode:nodePtr->parent];\n}\n\n/**\n * Returns the prefix associated with the specified URI.\n * Returns a string that is the matching prefix or nil if it finds no matching prefix.\n**/\n- (NSString *)resolvePrefixForNamespaceURI:(NSString *)namespaceURI\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// We can't use xmlSearchNsByHref because it will return xmlNsPtr's with NULL prefixes.\n\t// We're looking for a definitive prefix for the given URI.\n\t\n\treturn [self _recursiveResolvePrefixForURI:namespaceURI atNode:(xmlNodePtr)genericPtr];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Children\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (void)addChild:(DDXMLNode *)child\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n    if([child _hasParent])\n    {\n        [child detach];\n    }\n\t// NSXML version uses these same assertions\n\tDDXMLAssert([child _hasParent] == NO, @\"Cannot add a child that has a parent; detach or copy first\");\n\tDDXMLAssert(IsXmlNodePtr(child->genericPtr),\n\t            @\"Elements can only have text, elements, processing instructions, and comments as children\");\n\t\n\txmlAddChild((xmlNodePtr)genericPtr, (xmlNodePtr)child->genericPtr);\n\t\n\t// The node is now part of the xml tree heirarchy\n\tchild->owner = self;\n}\n\n- (void)insertChild:(DDXMLNode *)child atIndex:(NSUInteger)index\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// NSXML version uses these same assertions\n\tDDXMLAssert([child _hasParent] == NO, @\"Cannot add a child that has a parent; detach or copy first\");\n\tDDXMLAssert(IsXmlNodePtr(child->genericPtr),\n\t            @\"Elements can only have text, elements, processing instructions, and comments as children\");\n\t\n\tNSUInteger i = 0;\n\t\n\txmlNodePtr childNodePtr = ((xmlNodePtr)genericPtr)->children;\n\twhile (childNodePtr != NULL)\n\t{\n\t\t// Ignore all but element, comment, text, or processing instruction nodes\n\t\tif (IsXmlNodePtr(childNodePtr))\n\t\t{\n\t\t\tif (i == index)\n\t\t\t{\n\t\t\t\txmlAddPrevSibling(childNodePtr, (xmlNodePtr)child->genericPtr);\n\t\t\t\t\n\t\t\t\tchild->owner = self;\n\t\t\t\t\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\ti++;\n\t\t}\n\t\tchildNodePtr = childNodePtr->next;\n\t}\n\t\n\tif (i == index)\n\t{\n\t\txmlAddChild((xmlNodePtr)genericPtr, (xmlNodePtr)child->genericPtr);\n\t\t\n\t\tchild->owner = self;\n\t\t\n\t\treturn;\n\t}\n\t\n\t// NSXML version uses this same assertion\n\tDDXMLAssert(NO, @\"index (%u) beyond bounds (%u)\", (unsigned)index, (unsigned)++i);\n}\n\n- (void)removeChildAtIndex:(NSUInteger)index\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSUInteger i = 0;\n\t\n\txmlNodePtr child = ((xmlNodePtr)genericPtr)->children;\n\twhile (child != NULL)\n\t{\n\t\t// Ignore all but element, comment, text, or processing instruction nodes\n\t\tif (IsXmlNodePtr(child))\n\t\t{\n\t\t\tif (i == index)\n\t\t\t{\n\t\t\t\t[DDXMLNode removeChild:child];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\ti++;\n\t\t}\n\t\tchild = child->next;\n\t}\n}\n\n- (void)setChildren:(NSArray *)children\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t[DDXMLNode removeAllChildrenFromNode:(xmlNodePtr)genericPtr];\n\t\n\tNSUInteger i;\n\tfor (i = 0; i < [children count]; i++)\n\t{\n\t\tDDXMLNode *child = [children objectAtIndex:i];\n\t\t[self addChild:child];\n\t\t\n\t\t// Note: The addChild method properly sets the freeOnDealloc ivar.\n\t}\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLNode.h",
    "content": "#import <Foundation/Foundation.h>\n\n@class DDXMLDocument;\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\nenum {\n\tDDXMLInvalidKind                = 0,\n\tDDXMLDocumentKind,\n\tDDXMLElementKind,\n\tDDXMLAttributeKind,\n\tDDXMLNamespaceKind,\n\tDDXMLProcessingInstructionKind,\n\tDDXMLCommentKind,\n\tDDXMLTextKind,\n\tDDXMLDTDKind,\n\tDDXMLEntityDeclarationKind,\n\tDDXMLAttributeDeclarationKind,\n\tDDXMLElementDeclarationKind,\n\tDDXMLNotationDeclarationKind\n};\ntypedef NSUInteger DDXMLNodeKind;\n\nenum {\n\tDDXMLNodeOptionsNone            = 0,\n\tDDXMLNodeExpandEmptyElement     = 1 << 1,\n\tDDXMLNodeCompactEmptyElement    = 1 << 2,\n\tDDXMLNodePrettyPrint            = 1 << 17,\n};\n\n\nNS_ASSUME_NONNULL_BEGIN\n@interface DDXMLNode : NSObject <NSCopying>\n\n//- (instancetype)initWithKind:(DDXMLNodeKind)kind;\n\n//- (instancetype)initWithKind:(DDXMLNodeKind)kind options:(NSUInteger)options;\n\n//+ (instancetype)document;\n\n//+ (instancetype)documentWithRootElement:(DDXMLElement *)element;\n\n+ (id)elementWithName:(NSString *)name;\n\n+ (id)elementWithName:(NSString *)name URI:(NSString *)URI;\n\n+ (id)elementWithName:(NSString *)name stringValue:(NSString *)string;\n\n+ (id)elementWithName:(NSString *)name children:(nullable NSArray<DDXMLNode *> *)children attributes:(nullable NSArray<DDXMLNode *> *)attributes;\n\n+ (id)attributeWithName:(NSString *)name stringValue:(NSString *)stringValue;\n\n+ (id)attributeWithName:(NSString *)name URI:(NSString *)URI stringValue:(NSString *)stringValue;\n\n+ (id)namespaceWithName:(NSString *)name stringValue:(NSString *)stringValue;\n\n+ (id)processingInstructionWithName:(NSString *)name stringValue:(NSString *)stringValue;\n\n+ (id)commentWithStringValue:(NSString *)stringValue;\n\n+ (id)textWithStringValue:(NSString *)stringValue;\n\n//+ (instancetype)DTDNodeWithXMLString:(NSString *)string;\n\n#pragma mark --- Properties ---\n\n@property (readonly) DDXMLNodeKind kind;\n\n@property (nullable, copy) NSString *name;\n\n//- (void)setObjectValue:(id)value;\n//- (instancetype)objectValue;\n\n@property (nullable, copy) NSString *stringValue;\n\n//- (void)setStringValue:(NSString *)string resolvingEntities:(BOOL)resolve;\n\n#pragma mark --- Tree Navigation ---\n\n@property (readonly) NSUInteger index;\n@property (readonly) NSUInteger level;\n\n@property (nullable, readonly, retain) DDXMLDocument *rootDocument;\n\n@property (nullable, readonly, copy) DDXMLNode *parent;\n@property (readonly) NSUInteger childCount;\n@property (nullable, readonly, copy) NSArray<DDXMLNode *> *children;\n- (nullable DDXMLNode *)childAtIndex:(NSUInteger)index;\n\n@property (nullable, readonly, copy) DDXMLNode *previousSibling;\n@property (nullable, readonly, copy) DDXMLNode *nextSibling;\n\n@property (nullable, readonly, copy) DDXMLNode *previousNode;\n@property (nullable, readonly, copy) DDXMLNode *nextNode;\n\n- (void)detach;\n\n@property (nullable, readonly, copy) NSString *XPath;\n\n#pragma mark --- QNames ---\n\n@property (nullable, readonly, copy) NSString *localName;\n@property (nullable, readonly, copy) NSString *prefix;\n\n@property (nullable, copy) NSString *URI; //primitive\n\n+ (NSString *)localNameForName:(NSString *)name;\n+ (nullable NSString *)prefixForName:(NSString *)name;\n//+ (DDXMLNode *)predefinedNamespaceForPrefix:(NSString *)name;\n\n#pragma mark --- Output ---\n\n@property (readonly, copy) NSString *description;\n@property (readonly, copy) NSString *XMLString;\n- (nonnull NSString *)XMLStringWithOptions:(NSUInteger)options;\n//- (NSString *)canonicalXMLStringPreservingComments:(BOOL)comments;\n\n#pragma mark --- XPath/XQuery ---\n\n- (nullable NSArray<__kindof DDXMLNode *> *)nodesForXPath:(NSString *)xpath error:(NSError **)error;\n//- (NSArray *)objectsForXQuery:(NSString *)xquery constants:(NSDictionary *)constants error:(NSError **)error;\n//- (NSArray *)objectsForXQuery:(NSString *)xquery error:(NSError **)error;\n\n@end\nNS_ASSUME_NONNULL_END"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/DDXMLNode.m",
    "content": "#import \"DDXMLPrivate.h\"\n#import \"NSString+DDXML.h\"\n\n#import <libxml/xpath.h>\n#import <libxml/xpathInternals.h>\n\n\n#if ! __has_feature(objc_arc)\n#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).\n#endif\n\n/**\n * Welcome to KissXML.\n * \n * The project page has documentation if you have questions.\n * https://github.com/robbiehanson/KissXML\n * \n * If you're new to the project you may wish to read the \"Getting Started\" wiki.\n * https://github.com/robbiehanson/KissXML/wiki/GettingStarted\n * \n * KissXML provides a drop-in replacement for Apple's NSXML class cluster.\n * The goal is to get the exact same behavior as the NSXML classes.\n * \n * For API Reference, see Apple's excellent documentation,\n * either via Xcode's Mac OS X documentation, or via the web:\n * \n * https://github.com/robbiehanson/KissXML/wiki/Reference\n**/\n\n@implementation DDXMLNode\n\nstatic void MyErrorHandler(void * userData, xmlErrorPtr error);\nstatic DDXMLNodeKind DDXMLNodeKindForXmlKind(xmlElementType type);\n\n#if DDXML_DEBUG_MEMORY_ISSUES\n\nstatic CFMutableDictionaryRef zombieTracker;\nstatic dispatch_queue_t zombieQueue;\n\nstatic void RecursiveMarkZombiesFromNode(xmlNodePtr node);\nstatic void RecursiveMarkZombiesFromDoc(xmlDocPtr doc);\n\nstatic void MarkZombies(void *xmlPtr);\nstatic void MarkBirth(void *xmlPtr, DDXMLNode *wrapper);\nstatic void MarkDeath(void *xmlPtr, DDXMLNode *wrapper);\n\n#endif\n\n/**\n * From Apple's Documentation:\n * \n * The runtime sends initialize to each class in a program exactly one time just before the class,\n * or any class that inherits from it, is sent its first message from within the program. (Thus the method may\n * never be invoked if the class is not used.) The runtime sends the initialize message to classes\n * in a thread-safe manner. Superclasses receive this message before their subclasses.\n * \n * The method may also be called directly (assumably by accident), hence the safety mechanism.\n**/\n+ (void)initialize\n{\n\tstatic dispatch_once_t onceToken;\n\tdispatch_once(&onceToken, ^{\n\t\t\n\t\t// Redirect error output to our own function (don't clog up the console)\n\t\tinitGenericErrorDefaultFunc(NULL);\n\t\txmlSetStructuredErrorFunc(NULL, MyErrorHandler);\n\t\t\n\t\t// Tell libxml not to keep ignorable whitespace (such as node indentation, formatting, etc).\n\t\t// NSXML ignores such whitespace.\n\t\t// This also has the added benefit of taking up less RAM when parsing formatted XML documents.\n\t\txmlKeepBlanksDefault(0);\n\t\t\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t{\n\t\t\tzombieTracker = CFDictionaryCreateMutable(NULL, 0, NULL, &kCFTypeDictionaryValueCallBacks);\n\t\t\tzombieQueue = dispatch_queue_create(\"DDXMLZombieQueue\", NULL);\n\t\t}\n\t\t#endif\n\t\t\n\t});\n}\n\n+ (id)elementWithName:(NSString *)name\n{\n\treturn [[DDXMLElement alloc] initWithName:name];\n}\n\n+ (id)elementWithName:(NSString *)name stringValue:(NSString *)string\n{\n\treturn [[DDXMLElement alloc] initWithName:name stringValue:string];\n}\n\n+ (id)elementWithName:(NSString *)name children:(NSArray *)children attributes:(NSArray *)attributes\n{\n\tDDXMLElement *result = [[DDXMLElement alloc] initWithName:name];\n\t[result setChildren:children];\n\t[result setAttributes:attributes];\n\t\n\treturn result;\n}\n\n+ (id)elementWithName:(NSString *)name URI:(NSString *)URI\n{\n\treturn [[DDXMLElement alloc] initWithName:name URI:URI];\n}\n\n+ (id)attributeWithName:(NSString *)name stringValue:(NSString *)stringValue\n{\n\txmlAttrPtr attr = xmlNewProp(NULL, [name xmlChar], [stringValue xmlChar]);\n\t\n\tif (attr == NULL) return nil;\n\t\n\treturn [[DDXMLAttributeNode alloc] initWithAttrPrimitive:attr owner:nil];\n}\n\n+ (id)attributeWithName:(NSString *)name URI:(NSString *)URI stringValue:(NSString *)stringValue\n{\n\txmlAttrPtr attr = xmlNewProp(NULL, [name xmlChar], [stringValue xmlChar]);\n\t\n\tif (attr == NULL) return nil;\n\t\n\tDDXMLAttributeNode *result = [[DDXMLAttributeNode alloc] initWithAttrPrimitive:attr owner:nil];\n\t[result setURI:URI];\n\t\n\treturn result;\n}\n\n+ (id)namespaceWithName:(NSString *)name stringValue:(NSString *)stringValue\n{\n\t// If the user passes a nil or empty string name, they are trying to create a default namespace\n\tconst xmlChar *xmlName = [name length] > 0 ? [name xmlChar] : NULL;\n\t\n\txmlNsPtr ns = xmlNewNs(NULL, [stringValue xmlChar], xmlName);\n\t\n\tif (ns == NULL) return nil;\n\t\n\treturn [[DDXMLNamespaceNode alloc] initWithNsPrimitive:ns nsParent:NULL owner:nil];\n}\n\n+ (id)processingInstructionWithName:(NSString *)name stringValue:(NSString *)stringValue\n{\n\txmlNodePtr procInst = xmlNewPI([name xmlChar], [stringValue xmlChar]);\n\t\n\tif (procInst == NULL) return nil;\n\t\n\treturn [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)procInst owner:nil];\n}\n\n+ (id)commentWithStringValue:(NSString *)stringValue\n{\n\txmlNodePtr comment = xmlNewComment([stringValue xmlChar]);\n\t\n\tif (comment == NULL) return nil;\n\t\n\treturn [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)comment owner:nil];\n}\n\n+ (id)textWithStringValue:(NSString *)stringValue\n{\n\txmlNodePtr text = xmlNewText([stringValue xmlChar]);\n\t\n\tif (text == NULL) return nil;\n\t\n\treturn [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)text owner:nil];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Init, Dealloc\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n+ (id)nodeWithUnknownPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\tif (kindPtr->type == XML_DOCUMENT_NODE)\n\t{\n\t\treturn [DDXMLDocument nodeWithDocPrimitive:(xmlDocPtr)kindPtr owner:owner];\n\t}\n\telse if (kindPtr->type == XML_ELEMENT_NODE)\n\t{\n\t\treturn [DDXMLElement nodeWithElementPrimitive:(xmlNodePtr)kindPtr owner:owner];\n\t}\n\telse if (kindPtr->type == XML_NAMESPACE_DECL)\n\t{\n\t\t// Todo: This may be a problem...\n\t\t\n\t\treturn [DDXMLNamespaceNode nodeWithNsPrimitive:(xmlNsPtr)kindPtr nsParent:NULL owner:owner];\n\t}\n\telse if (kindPtr->type == XML_ATTRIBUTE_NODE)\n\t{\n\t\treturn [DDXMLAttributeNode nodeWithAttrPrimitive:(xmlAttrPtr)kindPtr owner:owner];\n\t}\n\telse\n\t{\n\t\treturn [DDXMLNode nodeWithPrimitive:kindPtr owner:owner];\n\t}\n}\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n+ (id)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\treturn [[DDXMLNode alloc] initWithPrimitive:kindPtr owner:owner];\n}\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n- (id)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)inOwner\n{\n\tif ((self = [super init]))\n\t{\n\t\tgenericPtr = kindPtr;\n\t\towner = inOwner;\n\t\t\n\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\tMarkBirth(genericPtr, self);\n\t#endif\n\t}\n\treturn self;\n}\n\n/**\n * This method shouldn't be used.\n * To maintain compatibility with Apple, we return an invalid node.\n**/\n- (id)init\n{\n\tself = [super init];\n\t\n\tif ([self isKindOfClass:[DDXMLInvalidNode class]])\n\t{\n\t\treturn self;\n\t}\n\telse\n\t{\n\t\treturn [[DDXMLInvalidNode alloc] init];\n\t}\n}\n\n- (void)dealloc\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tMarkDeath(genericPtr, self);\n#endif\n\t\n\t// We also check if genericPtr is NULL.\n\t// This may be the case if, e.g., DDXMLElement calls [self release] from it's init method.\n\t\n\tif ((owner == nil) && (genericPtr != NULL))\n\t{\n\t\tif (IsXmlNsPtr(genericPtr))\n\t\t{\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t\tMarkZombies(genericPtr);\n\t\t#endif\n\t\t\txmlFreeNs((xmlNsPtr)genericPtr);\n\t\t}\n\t\telse if (IsXmlAttrPtr(genericPtr))\n\t\t{\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t\tMarkZombies(genericPtr);\n\t\t#endif\n\t\t\txmlFreeProp((xmlAttrPtr)genericPtr);\n\t\t}\n\t\telse if (IsXmlDtdPtr(genericPtr))\n\t\t{\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t\tMarkZombies(genericPtr);\n\t\t#endif\n\t\t\txmlFreeDtd((xmlDtdPtr)genericPtr);\n\t\t}\n\t\telse if (IsXmlDocPtr(genericPtr))\n\t\t{\n\t\t\txmlDocPtr doc = (xmlDocPtr)genericPtr;\n\t\t\t\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t\tRecursiveMarkZombiesFromDoc(doc);\n\t\t#endif\n\t\t\txmlFreeDoc(doc);\n\t\t}\n\t\telse if (IsXmlNodePtr(genericPtr))\n\t\t{\n\t\t\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\t\t\n\t\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\t\tRecursiveMarkZombiesFromNode(node);\n\t\t#endif\n\t\t\txmlFreeNode(node);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNSAssert1(NO, @\"Cannot free unknown node type: %i\", genericPtr->type);\n\t\t}\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Copying\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (id)copyWithZone:(NSZone *)zone\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (IsXmlDocPtr(genericPtr))\n\t{\n\t\txmlDocPtr copyDocPtr = xmlCopyDoc((xmlDocPtr)genericPtr, 1);\n\t\t\n\t\tif (copyDocPtr == NULL) return nil;\n\t\t\n\t\treturn [[DDXMLDocument alloc] initWithDocPrimitive:copyDocPtr owner:nil];\n\t}\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlNodePtr copyNodePtr = xmlCopyNode((xmlNodePtr)genericPtr, 1);\n\t\t\n\t\tif (copyNodePtr == NULL) return nil;\n\t\t\n\t\tif ([self isKindOfClass:[DDXMLElement class]])\n\t\t\treturn [[DDXMLElement alloc] initWithElementPrimitive:copyNodePtr owner:nil];\n\t\telse\n\t\t\treturn [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)copyNodePtr owner:nil];\n\t}\n\t\n\tif (IsXmlAttrPtr(genericPtr))\n\t{\n\t\txmlAttrPtr copyAttrPtr = xmlCopyProp(NULL, (xmlAttrPtr)genericPtr);\n\t\t\n\t\tif (copyAttrPtr == NULL) return nil;\n\t\t\n\t\treturn [[DDXMLAttributeNode alloc] initWithAttrPrimitive:copyAttrPtr owner:nil];\n\t}\n\t\n\tif (IsXmlNsPtr(genericPtr))\n\t{\n\t\txmlNsPtr copyNsPtr = xmlCopyNamespace((xmlNsPtr)genericPtr);\n\t\t\n\t\tif (copyNsPtr == NULL) return nil;\n\t\t\n\t\treturn [[DDXMLNamespaceNode alloc] initWithNsPrimitive:copyNsPtr nsParent:NULL owner:nil];\n\t}\n\t\n\tif (IsXmlDtdPtr(genericPtr))\n\t{\n\t\txmlDtdPtr copyDtdPtr = xmlCopyDtd((xmlDtdPtr)genericPtr);\n\t\t\n\t\tif (copyDtdPtr == NULL) return nil;\n\t\t\n\t\treturn [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)copyDtdPtr owner:nil];\n\t}\n\t\n\treturn nil;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Equality\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (BOOL)isEqual:(id)anObject\n{\n\t// DDXMLNode, DDXMLElement, and DDXMLDocument are simply light-weight wrappers atop a libxml structure.\n\t// \n\t// To provide maximum speed and thread-safety,\n\t// multiple DDXML wrapper objects may be created that wrap the same underlying libxml node.\n\t// \n\t// Thus equality is simply a matter of what underlying libxml node DDXML is wrapping.\n\t\n\tif ([anObject class] == [self class])\n\t{\n\t\tDDXMLNode *aNode = (DDXMLNode *)anObject;\n\t\t\n\t\treturn (genericPtr == aNode->genericPtr);\n\t}\n\t\n\treturn NO;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Properties\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (DDXMLNodeKind)kind\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (genericPtr != NULL)\n\t\treturn DDXMLNodeKindForXmlKind(genericPtr->type);\n\telse\n\t\treturn DDXMLInvalidKind;\n}\n\n- (void)setName:(NSString *)name\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// The xmlNodeSetName function works for both nodes and attributes\n\txmlNodeSetName((xmlNodePtr)genericPtr, [name xmlChar]);\n}\n\n- (NSString *)name\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tconst xmlChar *xmlName = ((xmlStdPtr)genericPtr)->name;\n\tif (xmlName == NULL)\n\t{\n\t\treturn nil;\n\t}\n\t\n\tNSString *name = [NSString stringWithUTF8String:(const char *)xmlName];\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\t\n\t\tNSRange range = [name rangeOfString:@\":\"];\n\t\tif (range.length == 0)\n\t\t{\n\t\t\tif (node->ns && node->ns->prefix)\n\t\t\t{\n\t\t\t\treturn [NSString stringWithFormat:@\"%s:%@\", node->ns->prefix, name];\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn name;\n}\n\n- (void)setStringValue:(NSString *)string\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\t\n\t\t// Setting the content of a node erases any existing child nodes.\n\t\t// Therefore, we need to remove them properly first.\n\t\t[[self class] removeAllChildrenFromNode:(xmlNodePtr)node];\n\t\t\n\t\txmlChar *escapedString = xmlEncodeSpecialChars(node->doc, [string xmlChar]);\n\t\txmlNodeSetContent((xmlNodePtr)node, escapedString);\n\t\txmlFree(escapedString);\n\t}\n}\n\n/**\n * Returns the content of the receiver as a string value.\n * \n * If the receiver is a node object of element kind, the content is that of any text-node children.\n * This method recursively visits elements nodes and concatenates their text nodes in document order with\n * no intervening spaces.\n**/\n- (NSString *)stringValue\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlChar *content = xmlNodeGetContent((xmlNodePtr)genericPtr);\n\t\t\n\t\tNSString *result = [NSString stringWithUTF8String:(const char *)content];\n\t\t\n\t\txmlFree(content);\n\t\treturn result;\n\t}\n\t\n\treturn nil;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Tree Navigation\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Returns the index of the receiver identifying its position relative to its sibling nodes.\n * The first child node of a parent has an index of zero.\n**/\n- (NSUInteger)index\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSUInteger result = 0;\n\t\n\txmlStdPtr node = ((xmlStdPtr)genericPtr)->prev;\n\twhile (node != NULL)\n\t{\n\t\tresult++;\n\t\tnode = node->prev;\n\t}\n\t\n\treturn result;\n}\n\n/**\n * Returns the nesting level of the receiver within the tree hierarchy.\n * The root element of a document has a nesting level of one.\n**/\n- (NSUInteger)level\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSUInteger result = 0;\n\t\n\txmlNodePtr currentNode = ((xmlStdPtr)genericPtr)->parent;\n\twhile (currentNode != NULL)\n\t{\n\t\tresult++;\n\t\tcurrentNode = currentNode->parent;\n\t}\n\t\n\treturn result;\n}\n\n/**\n * Returns the DDXMLDocument object containing the root element and representing the XML document as a whole.\n * If the receiver is a standalone node (that is, a node at the head of a detached branch of the tree), this\n * method returns nil.\n**/\n- (DDXMLDocument *)rootDocument\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\tif (node == NULL || node->doc == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLDocument nodeWithDocPrimitive:node->doc owner:self];\n}\n\n/**\n * Returns the parent node of the receiver.\n * \n * Document nodes and standalone nodes (that is, the root of a detached branch of a tree) have no parent, and\n * sending this message to them returns nil. A one-to-one relationship does not always exists between a parent and\n * its children; although a namespace or attribute node cannot be a child, it still has a parent element.\n**/\n- (DDXMLNode *)parent\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\tif (node->parent == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)node->parent owner:self];\n}\n\n/**\n * Returns the number of child nodes the receiver has.\n * For performance reasons, use this method instead of getting the count from the array returned by children.\n**/\n- (NSUInteger)childCount\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (!IsXmlDocPtr(genericPtr) && !IsXmlNodePtr(genericPtr) && !IsXmlDtdPtr(genericPtr))\n\t{\n\t\treturn 0;\n\t}\n\t\n\tNSUInteger result = 0;\n\t\n\txmlNodePtr child = ((xmlStdPtr)genericPtr)->children;\n\twhile (child != NULL)\n\t{\n\t\tresult++;\n\t\tchild = child->next;\n\t}\n\t\n\treturn result;\n}\n\n/**\n * Returns an immutable array containing the child nodes of the receiver (as DDXMLNode objects).\n**/\n- (NSArray *)children\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (!IsXmlDocPtr(genericPtr) && !IsXmlNodePtr(genericPtr) && !IsXmlDtdPtr(genericPtr))\n\t{\n\t\treturn nil;\n\t}\n\t\n\tNSMutableArray *result = [NSMutableArray array];\n\t\n\txmlNodePtr child = ((xmlStdPtr)genericPtr)->children;\n\twhile (child != NULL)\n\t{\n\t\t[result addObject:[DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)child owner:self]];\n\t\t\n\t\tchild = child->next;\n\t}\n\t\n\treturn [result copy];\n}\n\n/**\n * Returns the child node of the receiver at the specified location.\n * Returns a DDXMLNode object or nil if the receiver has no children.\n * \n * If the receive has children and index is out of bounds, an exception is raised.\n * \n * The receiver should be a DDXMLNode object representing a document, element, or document type declaration.\n * The returned node object can represent an element, comment, text, or processing instruction.\n**/\n- (DDXMLNode *)childAtIndex:(NSUInteger)index\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (!IsXmlDocPtr(genericPtr) && !IsXmlNodePtr(genericPtr) && !IsXmlDtdPtr(genericPtr))\n\t{\n\t\treturn nil;\n\t}\n\t\n\tNSUInteger i = 0;\n\t\n\txmlNodePtr child = ((xmlStdPtr)genericPtr)->children;\n\t\n\tif (child == NULL)\n\t{\n\t\t// NSXML doesn't raise an exception if there are no children\n\t\treturn nil;\n\t}\n\t\n\twhile (child != NULL)\n\t{\n\t\tif (i == index)\n\t\t{\n\t\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)child owner:self];\n\t\t}\n\t\t\n\t\ti++;\n\t\tchild = child->next;\n\t}\n\t\n\t// NSXML version uses this same assertion\n\tDDXMLAssert(NO, @\"index (%u) beyond bounds (%u)\", (unsigned)index, (unsigned)i);\n\t\n\treturn nil;\n}\n\n/**\n * Returns the previous DDXMLNode object that is a sibling node to the receiver.\n * \n * This object will have an index value that is one less than the receivers.\n * If there are no more previous siblings (that is, other child nodes of the receivers parent) the method returns nil.\n**/\n- (DDXMLNode *)previousSibling\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\tif (node->prev == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)node->prev owner:self];\n}\n\n/**\n * Returns the next DDXMLNode object that is a sibling node to the receiver.\n * \n * This object will have an index value that is one more than the receivers.\n * If there are no more subsequent siblings (that is, other child nodes of the receivers parent) the\n * method returns nil.\n**/\n- (DDXMLNode *)nextSibling\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\tif (node->next == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)node->next owner:self];\n}\n\n/**\n * Returns the previous DDXMLNode object in document order.\n * \n * You use this method to walk backward through the tree structure representing an XML document or document section.\n * (Use nextNode to traverse the tree in the opposite direction.) Document order is the natural order that XML\n * constructs appear in markup text. If you send this message to the first node in the tree (that is, the root element),\n * nil is returned. DDXMLNode bypasses namespace and attribute nodes when it traverses a tree in document order.\n**/\n- (DDXMLNode *)previousNode\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// If the node has a previous sibling,\n\t// then we need the last child of the last child of the last child etc\n\t\n\t// Note: Try to accomplish this task without creating dozens of intermediate wrapper objects\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\txmlStdPtr previousSibling = node->prev;\n\t\n\tif (previousSibling != NULL)\n\t{\n\t\tif (previousSibling->last != NULL)\n\t\t{\n\t\t\txmlNodePtr lastChild = previousSibling->last;\n\t\t\twhile (lastChild->last != NULL)\n\t\t\t{\n\t\t\t\tlastChild = lastChild->last;\n\t\t\t}\n\t\t\t\n\t\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)lastChild owner:self];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// The previous sibling has no children, so the previous node is simply the previous sibling\n\t\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)previousSibling owner:self];\n\t\t}\n\t}\n\t\n\t// If there are no previous siblings, then the previous node is simply the parent\n\t\n\t// Note: rootNode.parent == docNode\n\t\n\tif (node->parent == NULL || node->parent->type == XML_DOCUMENT_NODE)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)node->parent owner:self];\n}\n\n/**\n * Returns the next DDXMLNode object in document order.\n * \n * You use this method to walk forward through the tree structure representing an XML document or document section.\n * (Use previousNode to traverse the tree in the opposite direction.) Document order is the natural order that XML\n * constructs appear in markup text. If you send this message to the last node in the tree, nil is returned.\n * DDXMLNode bypasses namespace and attribute nodes when it traverses a tree in document order.\n**/\n- (DDXMLNode *)nextNode\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// If the node has children, then next node is the first child\n\tDDXMLNode *firstChild = [self childAtIndex:0];\n\tif (firstChild)\n\t\treturn firstChild;\n\t\n\t// If the node has a next sibling, then next node is the same as next sibling\n\t\n\tDDXMLNode *nextSibling = [self nextSibling];\n\tif (nextSibling)\n\t\treturn nextSibling;\n\t\n\t// There are no children, and no more siblings, so we need to get the next sibling of the parent.\n\t// If that is nil, we need to get the next sibling of the grandparent, etc.\n\t\n\t// Note: Try to accomplish this task without creating dozens of intermediate wrapper objects\n\t\n\txmlNodePtr parent = ((xmlStdPtr)genericPtr)->parent;\n\twhile (parent != NULL)\n\t{\n\t\txmlNodePtr parentNextSibling = parent->next;\n\t\tif (parentNextSibling != NULL)\n\t\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)parentNextSibling owner:self];\n\t\telse\n\t\t\tparent = parent->parent;\n\t}\n\t\n\treturn nil;\n}\n\n/**\n * Detaches the receiver from its parent node.\n *\n * This method is applicable to DDXMLNode objects representing elements, text, comments, processing instructions,\n * attributes, and namespaces. Once the node object is detached, you can add it as a child node of another parent.\n**/\n- (void)detach\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\tif (node->parent != NULL)\n\t{\n\t\tif (IsXmlNodePtr(genericPtr))\n\t\t{\n\t\t\t[[self class] detachChild:(xmlNodePtr)node];\n\t\t\t\n\t\t\towner = nil;\n\t\t}\n\t}\n}\n\n- (xmlStdPtr)_XPathPreProcess:(NSMutableString *)result\n{\n\t// This is a private/internal method\n\t\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n\treturn (xmlStdPtr)genericPtr;\n}\n\n- (NSString *)XPath\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSMutableString *result = [NSMutableString stringWithCapacity:25];\n\t\n\t// Examples:\n\t// /rootElement[1]/subElement[4]/thisNode[2]\n\t// topElement/thisNode[2]\n\t\n\txmlStdPtr node = [self _XPathPreProcess:result];\n\t\n\t// Note: rootNode.parent == docNode\n\t\t\n\twhile ((node != NULL) && (node->type != XML_DOCUMENT_NODE))\n\t{\n\t\tif ((node->parent == NULL) && (node->doc == NULL))\n\t\t{\n\t\t\t// We're at the top of the heirarchy, and there is no xml document.\n\t\t\t// Thus we don't use a leading '/', and we don't need an index.\n\t\t\t\n\t\t\t[result insertString:[NSString stringWithFormat:@\"%s\", node->name] atIndex:0];\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// Find out what index this node is.\n\t\t\t// If it's the first node with this name, the index is 1.\n\t\t\t// If there are previous siblings with the same name, the index is greater than 1.\n\t\t\t\n\t\t\tint index = 1;\n\t\t\txmlStdPtr prevNode = node->prev;\n\t\t\t\n\t\t\twhile (prevNode != NULL)\n\t\t\t{\n\t\t\t\tif (xmlStrEqual(node->name, prevNode->name))\n\t\t\t\t{\n\t\t\t\t\tindex++;\n\t\t\t\t}\n\t\t\t\tprevNode = prevNode->prev;\n\t\t\t}\n\t\t\t\n\t\t\t[result insertString:[NSString stringWithFormat:@\"/%s[%i]\", node->name, index] atIndex:0];\n\t\t}\n\t\t\n\t\tnode = (xmlStdPtr)node->parent;\n\t}\n\t\n\treturn [result copy];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark QNames\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Returns the local name of the receiver.\n * \n * The local name is the part of a node name that follows a namespace-qualifying colon or the full name if\n * there is no colon. For example, chapter is the local name in the qualified name acme:chapter.\n**/\n- (NSString *)localName\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n\t// Zombie test occurs in [self name]\n\t\n\treturn [[self class] localNameForName:[self name]];\n}\n\n/**\n * Returns the prefix of the receivers name.\n * \n * The prefix is the part of a namespace-qualified name that precedes the colon.\n * For example, acme is the local name in the qualified name acme:chapter.\n * This method returns an empty string if the receivers name is not qualified by a namespace.\n**/\n- (NSString *)prefix\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n\t// Zombie test occurs in [self name]\n\t\n\treturn [[self class] prefixForName:[self name]];\n}\n\n/**\n * Sets the URI identifying the source of this document.\n * Pass nil to remove the current URI.\n**/\n- (void)setURI:(NSString *)URI\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\tif (node->ns != NULL)\n\t\t{\n\t\t\t[[self class] removeNamespace:node->ns fromNode:node];\n\t\t}\n\t\t\n\t\tif (URI)\n\t\t{\n\t\t\t// Create a new xmlNsPtr, add it to the nsDef list, and make ns point to it\n\t\t\txmlNsPtr ns = xmlNewNs(NULL, [URI xmlChar], NULL);\n\t\t\tns->next = node->nsDef;\n\t\t\tnode->nsDef = ns;\n\t\t\tnode->ns = ns;\n\t\t}\n\t}\n}\n\n/**\n * Returns the URI associated with the receiver.\n * \n * A nodes URI is derived from its namespace or a documents URI; for documents, the URI comes either from the\n * parsed XML or is explicitly set. You cannot change the URI for a particular node other for than a namespace\n * or document node.\n**/\n- (NSString *)URI\n{\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (IsXmlNodePtr(genericPtr))\n\t{\n\t\txmlNodePtr node = (xmlNodePtr)genericPtr;\n\t\tif (node->ns != NULL)\n\t\t{\n\t\t\treturn [NSString stringWithUTF8String:((const char *)node->ns->href)];\n\t\t}\n\t}\n\t\n\treturn nil;\n}\n\n+ (void)getHasPrefix:(BOOL *)hasPrefixPtr localName:(NSString **)localNamePtr forName:(NSString *)name\n{\n\t// This is a private/internal method\n\t\n\tif (name)\n\t{\n\t\tNSRange range = [name rangeOfString:@\":\"];\n\t\t\n\t\tif (range.length != 0)\n\t\t{\n\t\t\tif (hasPrefixPtr) *hasPrefixPtr = range.location > 0;\n\t\t\tif (localNamePtr) *localNamePtr = [name substringFromIndex:(range.location + range.length)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (hasPrefixPtr) *hasPrefixPtr = NO;\n\t\t\tif (localNamePtr) *localNamePtr = name;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (hasPrefixPtr) *hasPrefixPtr = NO;\n\t\tif (localNamePtr) *localNamePtr = nil;\n\t}\n}\n\n+ (void)getPrefix:(NSString **)prefixPtr localName:(NSString **)localNamePtr forName:(NSString *)name\n{\n\t// This is a private/internal method\n\t\n\tif (name)\n\t{\n\t\tNSRange range = [name rangeOfString:@\":\"];\n\t\t\n\t\tif (range.length != 0)\n\t\t{\n\t\t\tif (prefixPtr)    *prefixPtr    = [name substringToIndex:range.location];\n\t\t\tif (localNamePtr) *localNamePtr = [name substringFromIndex:(range.location + range.length)];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (prefixPtr)    *prefixPtr    = @\"\";\n\t\t\tif (localNamePtr) *localNamePtr = name;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (prefixPtr)    *prefixPtr    = @\"\";\n\t\tif (localNamePtr) *localNamePtr = nil;\n\t}\n}\n\n/**\n * Returns the local name from the specified qualified name.\n * \n * Examples:\n * \"a:node\" -> \"node\"\n * \"a:a:node\" -> \"a:node\"\n * \"node\" -> \"node\"\n * nil - > nil\n**/\n+ (NSString *)localNameForName:(NSString *)name\n{\n\t// This is a public/API method\n\t\n\tNSString *localName;\n\t[self getPrefix:NULL localName:&localName forName:name];\n\t\n\treturn localName;\n}\n\n/**\n * Extracts the prefix from the given name.\n * If name is nil, or has no prefix, an empty string is returned.\n * \n * Examples:\n * \"a:deusty.com\" -> \"a\"\n * \"a:a:deusty.com\" -> \"a\"\n * \"node\" -> \"\"\n * nil -> \"\"\n**/\n+ (NSString *)prefixForName:(NSString *)name\n{\n\t// This is a public/API method\n\t\n\tNSString *prefix;\n\t[self getPrefix:&prefix localName:NULL forName:name];\n\t\n\treturn prefix;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Output\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (NSString *)description\n{\n\t// Zombie test occurs in XMLStringWithOptions:\n\t\n\treturn [self XMLStringWithOptions:0];\n}\n\n- (NSString *)XMLString\n{\n\t// Zombie test occurs in XMLStringWithOptions:\n\t\n\treturn [self XMLStringWithOptions:0];\n}\n\n- (NSString *)XMLStringWithOptions:(NSUInteger)options\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// xmlSaveNoEmptyTags:\n\t// Global setting, asking the serializer to not output empty tags\n\t// as <empty/> but <empty></empty>. those two forms are undistinguishable\n\t// once parsed.\n\t// Disabled by default\n\t\n\tif (options & DDXMLNodeCompactEmptyElement)\n\t\txmlSaveNoEmptyTags = 0;\n\telse\n\t\txmlSaveNoEmptyTags = 1;\n\t\n\tint format = 0;\n\tif (options & DDXMLNodePrettyPrint)\n\t{\n\t\tformat = 1;\n\t\txmlIndentTreeOutput = 1;\n\t}\n\t\n\tint dumpCnt;\n\t\n\txmlBufferPtr bufferPtr = xmlBufferCreate();\n\tif (IsXmlNsPtr(genericPtr))\n\t\tdumpCnt = xmlNodeDump(bufferPtr, NULL, (xmlNodePtr)genericPtr, 0, format);\n\telse\n\t\tdumpCnt = xmlNodeDump(bufferPtr, ((xmlStdPtr)genericPtr)->doc, (xmlNodePtr)genericPtr, 0, format);\n\t\n\tif (dumpCnt < 0)\n\t{\n\t\treturn @\"\";\n\t}\n\t\n\tif ([self kind] == DDXMLTextKind)\n\t{\n\t\tNSString *result = [NSString stringWithUTF8String:(const char *)bufferPtr->content];\n\t\t\n\t\txmlBufferFree(bufferPtr);\n\t\t\n\t\treturn result;\n\t}\n\telse\n\t{\n\t\tNSMutableString *resTmp = [NSMutableString stringWithUTF8String:(const char *)bufferPtr->content];\n\t\tCFStringTrimWhitespace((__bridge CFMutableStringRef)resTmp);\n\t\t\n\t\txmlBufferFree(bufferPtr);\n\t\t\n\t\treturn [resTmp copy];\n\t}\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark XPath/XQuery\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlXPathContextPtr xpathCtx;\n\txmlXPathObjectPtr xpathObj;\n\t\n\tBOOL isTempDoc = NO;\n\txmlDocPtr doc;\n\t\n\tif (IsXmlDocPtr(genericPtr))\n\t{\n\t\tdoc = (xmlDocPtr)genericPtr;\n\t}\n\telse if (IsXmlNodePtr(genericPtr))\n\t{\n\t\tdoc = ((xmlNodePtr)genericPtr)->doc;\n\t\t\n\t\tif(doc == NULL)\n\t\t{\n\t\t\tisTempDoc = YES;\n\t\t\t\n\t\t\tdoc = xmlNewDoc(NULL);\n\t\t\txmlDocSetRootElement(doc, (xmlNodePtr)genericPtr);\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn nil;\n\t}\n\t\n\txpathCtx = xmlXPathNewContext(doc);\n\txpathCtx->node = (xmlNodePtr)genericPtr;\n\t\t\n\txmlNodePtr rootNode = (doc)->children;\n\tif(rootNode != NULL)\n\t{\n\t\txmlNsPtr ns = rootNode->nsDef;\n\t\twhile(ns != NULL)\n\t\t{\n\t\t\txmlXPathRegisterNs(xpathCtx, ns->prefix, ns->href);\n\t\t\t\n\t\t\tns = ns->next;\n\t\t}\n\t}\n\t\n\txpathObj = xmlXPathEvalExpression([xpath xmlChar], xpathCtx);\n\t\n\tNSArray *result;\n\t\n\tif(xpathObj == NULL)\n\t{\n\t\tif(error) *error = [[self class] lastError];\n\t\tresult = nil;\n\t}\n\telse\n\t{\n\t\tif(error) *error = nil;\n\t\t\n\t\tint count = xmlXPathNodeSetGetLength(xpathObj->nodesetval);\n\t\t\n\t\tif(count == 0)\n\t\t{\n\t\t\tresult = [NSArray array];\n\t\t}\n\t\telse\n\t\t{\n\t\t\tNSMutableArray *mResult = [NSMutableArray arrayWithCapacity:count];\n\t\t\t\n\t\t\tint i;\n\t\t\tfor (i = 0; i < count; i++)\n\t\t\t{\n\t\t\t\txmlNodePtr node = xpathObj->nodesetval->nodeTab[i];\n\t\t\t\t\n\t\t\t\t[mResult addObject:[DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)node owner:self]];\n\t\t\t}\n\t\t\t\n\t\t\tresult = mResult;\n\t\t}\n\t}\n\t\n\tif(xpathObj) xmlXPathFreeObject(xpathObj);\n\tif(xpathCtx) xmlXPathFreeContext(xpathCtx);\n\t\n\tif (isTempDoc)\n\t{\n\t\txmlUnlinkNode((xmlNodePtr)genericPtr);\n\t\txmlFreeDoc(doc);\n\t\t\n\t\t// xmlUnlinkNode doesn't remove the doc ptr\n\t\t[[self class] recursiveStripDocPointersFromNode:(xmlNodePtr)genericPtr];\n\t}\n\t\n\treturn result;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Private API\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n// ---------- MEMORY MANAGEMENT ARCHITECTURE ----------\n// \n// KissXML is designed to be read-access thread-safe.\n// It is not write-access thread-safe as this would require significant overhead.\n// \n// What exactly does read-access thread-safe mean?\n// It means that multiple threads can safely read from the same xml structure,\n// so long as none of them attempt to alter the xml structure (add/remove nodes, change attributes, etc).\n// \n// This read-access thread-safety includes parsed xml structures as well as xml structures created by you.\n// Let's walk through a few examples to get a deeper understanding.\n// \n// \n// \n// Example #1 - Parallel processing of children\n// \n// DDXMLElement *root = [[DDXMLElement alloc] initWithXMLString:str error:nil];\n// NSArray *children = [root children];\n// \n// dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);\n// dispatch_apply([children count], q, ^(size_t i) {\n//     DDXMLElement *child = [children objectAtIndex:i];\n//     <process child>\n// });\n// \n// \n// \n// Example #2 - Asynchronous child processing\n// \n// DDXMLElement *root = [[DDXMLElement alloc] initWithXMLString:str error:nil];\n// DDXMLElement *child = [root elementForName:@\"starbucks\"];\n// \n// dispatch_async(queue, ^{\n//     <process child>\n// });\n// \n// [root release];\n// \n// You may have noticed that we possibly released the root node before the child was processed.\n// Is this safe?\n// \n// The answer is YES.\n// The child node retains a reference to the root node,\n// so the xml tree heirarchy won't be freed until you're done using all associated nodes.\n// \n// \n// \n\n\n/**\n * Returns whether or not the node has a parent.\n * Use this method instead of parent when you only need to ensure parent is nil.\n * This prevents the unnecessary creation of a parent node wrapper.\n**/\n- (BOOL)_hasParent\n{\n\t// This is a private/internal method\n\t\n\t// Note: DDXMLNamespaceNode overrides this method\n\t\n\txmlStdPtr node = (xmlStdPtr)genericPtr;\n\t\n\treturn (node->parent != NULL);\n}\n\n+ (void)stripDocPointersFromAttr:(xmlAttrPtr)attr\n{\n\txmlNodePtr child = attr->children;\n\twhile (child != NULL)\n\t{\n\t\tchild->doc = NULL;\n\t\tchild = child->next;\n\t}\n\t\n\tattr->doc = NULL;\n}\n\n+ (void)recursiveStripDocPointersFromNode:(xmlNodePtr)node\n{\n\txmlAttrPtr attr = node->properties;\n\twhile (attr != NULL)\n\t{\n\t\t[self stripDocPointersFromAttr:attr];\n\t\tattr = attr->next;\n\t}\n\t\n\txmlNodePtr child = node->children;\n\twhile (child != NULL)\n\t{\n\t\t[self recursiveStripDocPointersFromNode:child];\n\t\tchild = child->next;\n\t}\n\t\n\tnode->doc = NULL;\n}\n\n/**\n * If node->ns is pointing to the given ns, the pointer is nullified.\n * The same goes for any attributes and childrend of node.\n**/\n+ (void)recursiveStripNamespace:(xmlNsPtr)ns fromNode:(xmlNodePtr)node\n{\n\tif (node->ns == ns)\n\t{\n\t\tnode->ns = NULL;\n\t}\n\t\n\txmlAttrPtr attr = node->properties;\n\twhile (attr)\n\t{\n\t\tif (attr->ns == ns)\n\t\t{\n\t\t\tattr->ns = NULL;\n\t\t}\n\t\tattr = attr->next;\n\t}\n\t\n\txmlNodePtr child = node->children;\n\twhile (child)\n\t{\n\t\t[self recursiveStripNamespace:ns fromNode:child];\n\t\tchild = child->next;\n\t}\n}\n\n/**\n * If node or any of its attributes or children are referencing the the given old namespace,\n * they are migrated to reference the new namespace instead.\n * \n * If newNs is NULL, and a reference to oldNs is found, then oldNs is copied,\n * and the copy is used for the remainder of the recursion.\n * \n * This method makes copies of oldNs as needed so that oldNs can be cleanly detached from the tree.\n**/\n+ (void)recursiveMigrateNamespace:(xmlNsPtr)oldNs to:(xmlNsPtr)newNs node:(xmlNodePtr)node\n{\n\t// Do we need to copy old namespace?\n\t\n\tif (newNs == NULL)\n\t{\n\t\t// A copy needs to be made if:\n\t\t//  * node->ns == oldNs\n\t\t//  * attr->ns == oldNs\n\t\t// \n\t\t// Remember: The namespaces in node->nsDef are owned by node.\n\t\t//           That's not what we're migrating.\n\t\t\n\t\tBOOL needsCopy = (node->ns == oldNs);\n\t\t\n\t\tif (!needsCopy)\n\t\t{\n\t\t\txmlAttrPtr attr = node->properties;\n\t\t\twhile (attr)\n\t\t\t{\n\t\t\t\tif (attr->ns == oldNs)\n\t\t\t\t{\n\t\t\t\t\tneedsCopy = YES;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tattr = attr->next;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (needsCopy)\n\t\t{\n\t\t\t// Copy oldNs, and place at the end of the node's namspace list\n\t\t\tnewNs = xmlNewNs(NULL, oldNs->href, oldNs->prefix);\n\t\t\t\n\t\t\tif (node->nsDef == NULL)\n\t\t\t{\n\t\t\t\tnode->nsDef = newNs;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\txmlNsPtr lastNs = node->nsDef;\n\t\t\t\twhile (lastNs->next)\n\t\t\t\t{\n\t\t\t\t\tlastNs = lastNs->next;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlastNs->next = newNs;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Migrate node & attributes\n\t\n\tif (newNs)\n\t{\n\t\tif (node->ns == oldNs)\n\t\t{\n\t\t\tnode->ns = newNs;\n\t\t}\n\t\t\n\t\txmlAttrPtr attr = node->properties;\n\t\twhile (attr)\n\t\t{\n\t\t\tif (attr->ns == oldNs)\n\t\t\t{\n\t\t\t\tattr->ns = newNs;\n\t\t\t}\n\t\t\tattr = attr->next;\n\t\t}\n\t}\n\t\n\t// Migrate children\n\t\n\txmlNodePtr child = node->children;\n\twhile (child)\n\t{\n\t\t[self recursiveMigrateNamespace:oldNs to:newNs node:child];\n\t\tchild = child->next;\n\t}\n}\n\n/**\n * If node has a default namespace allocated outside the given root,\n * this method copies the namespace so that the given root can be cleanly detached from its tree.\n**/\n+ (void)recursiveFixDefaultNamespacesInNode:(xmlNodePtr)node withNewRoot:(xmlNodePtr)rootNode\n{\n\tNSAssert(rootNode != NULL, @\"Must specify rootNode.\");\n\t\n\t// Step 1 of 3\n\t// \n\t// Copy our namespace.\n\t// It's important to do this first (before the other steps).\n\t// This way attributes and children can reference our copy. (prevents multiple copies throughout tree)\n\t\n\txmlNsPtr nodeNs = node->ns;\n\tif (nodeNs)\n\t{\n\t\t// Does the namespace reside within the new root somewhere?\n\t\t// We can find out by searching for it in nsDef lists up to the given root.\n\t\t\n\t\tBOOL nsResidesWithinNewRoot = NO;\n\t\t\n\t\txmlNodePtr treeNode = node;\n\t\twhile (treeNode)\n\t\t{\n\t\t\txmlNsPtr treeNs = treeNode->nsDef;\n\t\t\twhile (treeNs)\n\t\t\t{\n\t\t\t\tif (treeNs == nodeNs)\n\t\t\t\t{\n\t\t\t\t\tnsResidesWithinNewRoot = YES;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\ttreeNs = treeNs->next;\n\t\t\t}\n\t\t\t\n\t\t\tif (nsResidesWithinNewRoot || treeNode == rootNode)\n\t\t\t\ttreeNode = NULL;\n\t\t\telse\n\t\t\t\ttreeNode = treeNode->parent;\n\t\t}\n\t\t\n\t\tif (!nsResidesWithinNewRoot)\n\t\t{\n\t\t\t// Create a copy of the namespace, add to nsDef list, and then set as ns\n\t\t\txmlNsPtr nodeNsCopy = xmlNewNs(NULL, nodeNs->href, nodeNs->prefix);\n\t\t\t\n\t\t\tnodeNsCopy->next = node->nsDef;\n\t\t\tnode->nsDef = nodeNsCopy;\n\t\t\t\n\t\t\tnode->ns = nodeNsCopy;\n\t\t}\n\t}\n\t\n\t// Step 2 of 3\n\t// \n\t// If any attributes are referencing namespaces outside the new root,\n\t// copy the namespaces into node, and have the attributes reference the copy.\n\t\n\txmlAttrPtr attr = node->properties;\n\twhile (attr)\n\t{\n\t\txmlNsPtr attrNs = attr->ns;\n\t\twhile (attrNs)\n\t\t{\n\t\t\tBOOL nsResidesWithinNewRoot = NO;\n\t\t\t\n\t\t\txmlNodePtr treeNode = node;\n\t\t\twhile (treeNode)\n\t\t\t{\n\t\t\t\txmlNsPtr treeNs = treeNode->nsDef;\n\t\t\t\twhile (treeNs)\n\t\t\t\t{\n\t\t\t\t\tif (treeNs == attrNs)\n\t\t\t\t\t{\n\t\t\t\t\t\tnsResidesWithinNewRoot = YES;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\ttreeNs = treeNs->next;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (nsResidesWithinNewRoot || treeNode == rootNode)\n\t\t\t\t\ttreeNode = NULL;\n\t\t\t\telse\n\t\t\t\t\ttreeNode = treeNode->parent;\n\t\t\t}\n\t\t\t\n\t\t\tif (!nsResidesWithinNewRoot)\n\t\t\t{\n\t\t\t\t// Create a copy of the namespace, add to node's nsDef list, and then set as attribute's ns\n\t\t\t\txmlNsPtr attrNsCopy = xmlNewNs(NULL, attrNs->href, attrNs->prefix);\n\t\t\t\t\n\t\t\t\tattrNsCopy->next = node->nsDef;\n\t\t\t\tnode->nsDef = attrNsCopy;\n\t\t\t\t\n\t\t\t\tattr->ns = attrNsCopy;\n\t\t\t}\n\t\t\t\n\t\t\tattrNs = attrNs->next;\n\t\t}\n\t\t\n\t\tattr = attr->next;\n\t}\n\t\n\t// Step 3 of 3\n\t// \n\t// Copy namespaces into children\n\t\n\txmlNodePtr childNode = node->children;\n\twhile (childNode)\n\t{\n\t\t[self recursiveFixDefaultNamespacesInNode:childNode withNewRoot:rootNode];\n\t\t\n\t\tchildNode = childNode->next;\n\t}\n}\n\n/**\n * Detaches the given namespace from the given node.\n * The namespace's surrounding next pointers are properly updated to remove the namespace from the node's nsDef list.\n * Then the namespace's parent and next pointers are destroyed.\n**/\n+ (void)detachNamespace:(xmlNsPtr)ns fromNode:(xmlNodePtr)node\n{\n\t// If node, or any of node's attributes are referring to this namespace,\n\t// then we need to nullify those references.\n\t// \n\t// However, if any children are referring to this namespace,\n\t// then we instruct those children to make copies.\n\t\n\tif (node->ns == ns)\n\t{\n\t\tnode->ns = NULL;\n\t}\n\t\n\txmlAttrPtr attr = node->properties;\n\twhile (attr)\n\t{\n\t\tif (attr->ns == ns)\n\t\t{\n\t\t\tattr->ns = NULL;\n\t\t}\n\t\tattr = attr->next;\n\t}\n\t\n\txmlNodePtr child = node->children;\n\twhile (child)\n\t{\n\t\t[self recursiveMigrateNamespace:ns to:NULL node:child];\n\t\tchild = child->next;\n\t}\n\t\n\t// Now detach namespace from the namespace list.\n\t// \n\t// Namespace nodes have no previous pointer, so we have to search for the node\n\t\n\txmlNsPtr previousNs = NULL;\n\txmlNsPtr currentNs = node->nsDef;\n\t\n\twhile (currentNs != NULL)\n\t{\n\t\tif (currentNs == ns)\n\t\t{\n\t\t\tif (previousNs == NULL)\n\t\t\t\tnode->nsDef = currentNs->next;\n\t\t\telse\n\t\t\t\tpreviousNs->next = currentNs->next;\n\t\t\t\n\t\t\tbreak;\n\t\t}\n\t\t\n\t\tpreviousNs = currentNs;\n\t\tcurrentNs = currentNs->next;\n\t}\n\t\n\t// Nullify pointers\n\tns->next = NULL;\n}\n\n/**\n * Removes the given namespace from the given node.\n * The namespace's surrounding next pointers are properly updated to remove the namespace from the nsDef list.\n * Then the namespace is freed if it's no longer being referenced.\n * Otherwise, it's nsParent and next pointers are destroyed.\n**/\n+ (void)removeNamespace:(xmlNsPtr)ns fromNode:(xmlNodePtr)node\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tMarkZombies(ns);\n#endif\n\t\n\t[self detachNamespace:ns fromNode:node];\n\t\n\txmlFreeNs(ns);\n}\n\n/**\n * Removes all namespaces from the given node.\n * All namespaces are either freed, or their nsParent and next pointers are properly destroyed.\n * Upon return, the given node's nsDef pointer is NULL.\n**/\n+ (void)removeAllNamespacesFromNode:(xmlNodePtr)node\n{\n\txmlNsPtr ns = node->nsDef;\n\twhile (ns != NULL)\n\t{\n\t\txmlNsPtr nextNs = ns->next;\n\t\t\n\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\tMarkZombies(ns);\n\t#endif\n\t\t\n\t\txmlFreeNs(ns);\n\t\tns = nextNs;\n\t}\n\t\n\tnode->nsDef = NULL;\n\tnode->ns = NULL;\n}\n\n/**\n * Detaches the given attribute from its parent node.\n * The attribute's surrounding prev/next pointers are properly updated to remove the attribute from the attr list.\n * Then, if the clean flag is YES, the attribute's parent, prev, next and doc pointers are set to null.\n**/\n+ (void)detachAttribute:(xmlAttrPtr)attr andClean:(BOOL)clean\n{\n\txmlNodePtr parent = attr->parent;\n\t\n\t// Update the surrounding prev/next pointers\n\tif (attr->prev == NULL)\n\t{\n\t\tif (attr->next == NULL)\n\t\t{\n\t\t\tparent->properties = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tparent->properties = attr->next;\n\t\t\tattr->next->prev = NULL;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (attr->next == NULL)\n\t\t{\n\t\t\tattr->prev->next = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tattr->prev->next = attr->next;\n\t\t\tattr->next->prev = attr->prev;\n\t\t}\n\t}\n\t\n\tif (clean)\n\t{\n\t\t// Nullify pointers\n\t\tattr->parent = NULL;\n\t\tattr->prev   = NULL;\n\t\tattr->next   = NULL;\n\t\tattr->ns     = NULL;\n\t\tif (attr->doc != NULL) [self stripDocPointersFromAttr:attr];\n\t}\n}\n\n/**\n * Detaches the given attribute from its parent node.\n * The attribute's surrounding prev/next pointers are properly updated to remove the attribute from the attr list.\n * Then the attribute's parent, prev, next and doc pointers are destroyed.\n**/\n+ (void)detachAttribute:(xmlAttrPtr)attr\n{\n\t[self detachAttribute:attr andClean:YES];\n}\n\n/**\n * Removes and free's the given attribute from its parent node.\n * The attribute's surrounding prev/next pointers are properly updated to remove the attribute from the attr list.\n**/\n+ (void)removeAttribute:(xmlAttrPtr)attr\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tMarkZombies(attr);\n#endif\n\t\n\t// We perform a bit of optimization here.\n\t// No need to bother nullifying pointers since we're about to free the node anyway.\n\t[self detachAttribute:attr andClean:NO];\n\t\n\txmlFreeProp(attr);\n}\n\n/**\n * Removes and frees all attributes from the given node.\n * Upon return, the given node's properties pointer is NULL.\n**/\n+ (void)removeAllAttributesFromNode:(xmlNodePtr)node\n{\n\txmlAttrPtr attr = node->properties;\n\twhile (attr != NULL)\n\t{\n\t\txmlAttrPtr nextAttr = attr->next;\n\t\t\n\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\tMarkZombies(attr);\n\t#endif\n\t\t\n\t\txmlFreeProp(attr);\n\t\tattr = nextAttr;\n\t}\n\t\n\tnode->properties = NULL;\n}\n\n/**\n * Detaches the given child from its parent.\n * The child's surrounding prev/next pointers are properly updated to remove the child from the node's children list.\n * Then, if the clean flag is YES, the child's parent, prev, next and doc pointers are set to null.\n**/\n+ (void)detachChild:(xmlNodePtr)child andClean:(BOOL)clean andFixNamespaces:(BOOL)fixNamespaces\n{\n\txmlNodePtr parent = child->parent;\n\t\n\t// Update the surrounding prev/next pointers\n\tif (child->prev == NULL)\n\t{\n\t\tif (child->next == NULL)\n\t\t{\n\t\t\tparent->children = NULL;\n\t\t\tparent->last = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tparent->children = child->next;\n\t\t\tchild->next->prev = NULL;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (child->next == NULL)\n\t\t{\n\t\t\tparent->last = child->prev;\n\t\t\tchild->prev->next = NULL;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tchild->prev->next = child->next;\n\t\t\tchild->next->prev = child->prev;\n\t\t}\n\t}\n\t\n\tif (fixNamespaces)\n\t{\n\t\t// Fix namesapces (namespace references that now point outside tree)\n\t\t// Note: This must be done before we nullify pointers so we can search up the tree.\n\t\t[self recursiveFixDefaultNamespacesInNode:child withNewRoot:child];\n\t}\n\tif (clean)\n\t{\n\t\t// Nullify pointers\n\t\tchild->parent = NULL;\n\t\tchild->prev   = NULL;\n\t\tchild->next   = NULL;\n\t\tif (child->doc != NULL) [self recursiveStripDocPointersFromNode:child];\n\t}\n}\n\n/**\n * Detaches the given child from its parent.\n * The child's surrounding prev/next pointers are properly updated to remove the child from the node's children list.\n * Then the child's parent, prev, next and doc pointers are set to null.\n**/\n+ (void)detachChild:(xmlNodePtr)child\n{\n\t[self detachChild:child andClean:YES andFixNamespaces:YES];\n}\n\n/**\n * Removes the given child from its parent node.\n * The child's surrounding prev/next pointers are properly updated to remove the child from the node's children list.\n * Then the child is recursively freed if it's no longer being referenced.\n * Otherwise, it's parent, prev, next and doc pointers are destroyed.\n * \n * During the recursive free, subnodes still being referenced are properly handled.\n**/\n+ (void)removeChild:(xmlNodePtr)child\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tRecursiveMarkZombiesFromNode(child);\n#endif\n\t\n\t// We perform a bit of optimization here.\n\t// No need to bother nullifying pointers since we're about to free the node anyway.\n\t[self detachChild:child andClean:NO andFixNamespaces:NO];\n\t\n\txmlFreeNode(child);\n}\n\n/**\n * Removes all children from the given node.\n * All children are either recursively freed, or their parent, prev, next and doc pointers are properly destroyed.\n * Upon return, the given node's children pointer is NULL.\n * \n * During the recursive free, subnodes still being referenced are properly handled.\n**/\n+ (void)removeAllChildrenFromNode:(xmlNodePtr)node\n{\n\txmlNodePtr child = node->children;\n\twhile (child != NULL)\n\t{\n\t\txmlNodePtr nextChild = child->next;\n\t\t\n\t#if DDXML_DEBUG_MEMORY_ISSUES\n\t\tRecursiveMarkZombiesFromNode(child);\n\t#endif\n\t\t\n\t\txmlFreeNode(child);\n\t\tchild = nextChild;\n\t}\n\t\n\tnode->children = NULL;\n\tnode->last = NULL;\n}\n\n/**\n * Returns the last error encountered by libxml.\n * Errors are caught in the MyErrorHandler method within DDXMLDocument.\n**/\n+ (NSError *)lastError\n{\n\tNSValue *lastErrorValue = [[[NSThread currentThread] threadDictionary] objectForKey:DDLastErrorKey];\n\tif(lastErrorValue)\n\t{\n\t\txmlError lastError;\n\t\t[lastErrorValue getValue:&lastError];\n\t\t\n\t\tint errCode = lastError.code;\n\t\tNSString *errMsg = [[NSString stringWithFormat:@\"%s\", lastError.message] stringByTrimming];\n\t\t\n\t\tNSDictionary *info = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey];\n\t\t\t\n\t\treturn [NSError errorWithDomain:@\"DDXMLErrorDomain\" code:errCode userInfo:info];\n\t}\n\telse\n\t{\n\t\treturn nil;\n\t}\n}\n\nstatic void MyErrorHandler(void * userData, xmlErrorPtr error)\n{\n\t// This method is called by libxml when an error occurs.\n\t// We register for this error in the initialize method below.\n\t\n\t// Extract error message and store in the current thread's dictionary.\n\t// This ensure's thread safey, and easy access for all other DDXML classes.\n\t\n\tif (error == NULL)\n\t{\n\t\t[[[NSThread currentThread] threadDictionary] removeObjectForKey:DDLastErrorKey];\n\t}\n\telse\n\t{\n\t\tNSValue *errorValue = [NSValue valueWithBytes:error objCType:@encode(xmlError)];\n\t\t\n\t\t[[[NSThread currentThread] threadDictionary] setObject:errorValue forKey:DDLastErrorKey];\n\t}\n}\n\nstatic DDXMLNodeKind DDXMLNodeKindForXmlKind(xmlElementType type) {\n    switch (type) {\n        case XML_DOCUMENT_NODE:\n            return DDXMLDocumentKind;\n        case XML_ELEMENT_NODE:\n            return DDXMLElementKind;\n        case XML_ATTRIBUTE_NODE:\n            return DDXMLAttributeKind;\n        case XML_NAMESPACE_DECL:\n            return DDXMLNamespaceKind;\n        case XML_PI_NODE:\n            return DDXMLProcessingInstructionKind;\n        case XML_COMMENT_NODE:\n            return DDXMLCommentKind;\n        case XML_TEXT_NODE:\n            return DDXMLTextKind;\n        case XML_DTD_NODE:\n            return DDXMLDTDKind;\n        case XML_ENTITY_DECL:\n            return DDXMLEntityDeclarationKind;\n        case XML_ATTRIBUTE_DECL:\n            return DDXMLAttributeDeclarationKind;\n        case XML_ELEMENT_DECL:\n            return DDXMLElementDeclarationKind;\n        case XML_NOTATION_NODE:\n            return DDXMLNotationDeclarationKind;\n        default:\n            return DDXMLInvalidKind;\n    }\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Zombie Tracking\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n#if DDXML_DEBUG_MEMORY_ISSUES\n\n// What is zombie tracking and how does it work?\n// \n// It is all explained in full detail here:\n// https://github.com/robbiehanson/KissXML/wiki/MemoryManagementThreadSafety\n// \n// But here's a quick overview in case you're on a plane right now\n// (and the plane doesn't have internet access, or charges some ridiculous amount and you don't want to pay for it.)\n// \n// <starbucks>\n//   <latte/>\n//   <cappuchino/>\n// </starbucks>\n// \n// You have a reference to the latte node, and you release/dealloc the starbucks node. Uh oh!\n// The latte node is now a zombie, since the xmlNode it was pointing to (wrapping) is now gone.\n// If you attempt to read info from the latte node, you might get a crash.\n// Or you might get junk results.\n// And if you attempt to write info to the latte node, you might just wind up with some ugly heap corruption.\n// And if this happens, well.. it's a huge P.I.T.A to track down.\n// \n// But I've been there before. And I feel your pain. That's where this debug option comes in.\n// \n// The debugging option keeps a dictionary where the keys are the xml pointers (xmlNodePtr, xmlAttrPtr, etc),\n// and the values are mutable arrays. Any wrapper objects (DDXMLElement, DDXMLNode, etc) get added to the\n// mutable array for which the wrapper is pointing.\n// \n// If the xml (xmlNodePtr, xmlAttrPtr, etc) is to be freed, it first removes its key from the dictionary,\n// and in doing so destroys any associated mutable array.\n// \n// So a zombie check ensures that the xml structure the wrapper is referring to hasn't been freed.\n// If it has an exception is thrown to help track down the problem.\n// \n// In other words, if you try to read info from the latte node, or attempt to alter the latte node\n// (after you release/dealloc starbucks), you'll immediately get a helpful exception.\n// (Goodbye junk values and heap corruption.)\n// \n// This is helpful in debugging, as it is sometimes easy to forget about the memory rules of the xml heirarchy.\n// Or simply due to combinations of passing subelements around and using asynchronous operations.\n\n\nstatic void RecursiveMarkZombiesFromNode(xmlNodePtr node)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\t// Mark attributes\n\txmlAttrPtr attr = node->properties;\n\twhile (attr != NULL)\n\t{\n\t\tMarkZombies(attr);\n\t\tattr = attr->next;\n\t}\n\t\n\t// Mark namespaces\n\txmlNsPtr ns = node->nsDef;\n\twhile (ns != NULL)\n\t{\n\t\tMarkZombies(ns);\n\t\tns = ns->next;\n\t}\n\tif (node->ns)\n\t{\n\t\tMarkZombies(node->ns);\n\t}\n\t\n\t// Recursively mark children\n\txmlNodePtr child = node->children;\n\twhile (child != NULL)\n\t{\n\t\tRecursiveMarkZombiesFromNode(child);\n\t\tchild = child->next;\n\t}\n\t\n\tMarkZombies(node);\n}\n\nstatic void RecursiveMarkZombiesFromDoc(xmlDocPtr doc)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\txmlNodePtr child = doc->children;\n\twhile (child != NULL)\n\t{\n\t\tRecursiveMarkZombiesFromNode(child);\n\t\t\n\t\tchild = child->next;\n\t}\n\t\n\tMarkZombies(doc);\n}\n\nstatic void MarkZombies(void *xmlPtr)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\tdispatch_async(zombieQueue, ^{\n\t\t\n\t//\tNSLog(@\"MarkZombies: %p\", xmlPtr);\n\t\t\n\t\tCFDictionaryRemoveValue(zombieTracker, xmlPtr);\n\t});\n}\n\nstatic void MarkBirth(void *xmlPtr, DDXMLNode *wrapper)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\tconst void *value = (void *)wrapper;\n\t\n\tdispatch_async(zombieQueue, ^{\n\t\t\n\t//\tNSLog(@\"MarkBirth: %p, %p\", xmlPtr, value);\n\t\t\n\t\tCFMutableArrayRef values = (CFMutableArrayRef)CFDictionaryGetValue(zombieTracker, xmlPtr);\n\t\tif (values == NULL)\n\t\t{\n\t\t\tvalues = CFArrayCreateMutable(NULL, /*MaxCapacity:*/0, /*ValueCallbacks:*/NULL);\n\t\t\tCFArrayAppendValue(values, value);\n\t\t\t\n\t\t\tCFDictionarySetValue(zombieTracker, xmlPtr, values);\n\t\t\tCFRelease(values);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCFArrayAppendValue(values, value);\n\t\t}\n\t});\n}\n\nstatic void MarkDeath(void *xmlPtr, DDXMLNode *wrapper)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\tconst void *value = (void *)wrapper;\n\t\n\tdispatch_async(zombieQueue, ^{\n\t\t\n\t//\tNSLog(@\"MarkDeath: %p, %p\", xmlPtr, value);\n\t\t\n\t\tCFMutableArrayRef values = (CFMutableArrayRef)CFDictionaryGetValue(zombieTracker, xmlPtr);\n\t\tif (values)\n\t\t{\n\t\t\tCFRange range = CFRangeMake(0, CFArrayGetCount(values));\n\t\t\tCFIndex index = CFArrayGetFirstIndexOfValue(values, range, value);\n\t\t\tif (index >= 0)\n\t\t\t{\n\t\t\t\tCFArrayRemoveValueAtIndex(values, index);\n\t\t\t}\n\t\t}\n\t});\n}\n\nBOOL DDXMLIsZombie(void *xmlPtr, DDXMLNode *wrapper)\n{\n\t// This method only exists if DDXML_DEBUG_MEMORY_ISSUES is enabled.\n\t\n\t__block BOOL result;\n\t\n\tconst void *value = (void *)wrapper;\n\t\n\tdispatch_sync(zombieQueue, ^{\n\t\t\n\t\tCFMutableArrayRef values = (CFMutableArrayRef)CFDictionaryGetValue(zombieTracker, xmlPtr);\n\t\tif (values)\n\t\t{\n\t\t\tCFRange range = CFRangeMake(0, CFArrayGetCount(values));\n\t\t\tCFIndex index = CFArrayGetFirstIndexOfValue(values, range, value);\n\t\t\t\n\t\t\tresult = (index < 0);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tresult = YES;\n\t\t}\n\t});\n\t\n\treturn result;\n}\n\n#endif\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@implementation DDXMLNamespaceNode\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n+ (instancetype)nodeWithNsPrimitive:(xmlNsPtr)ns nsParent:(xmlNodePtr)parent owner:(DDXMLNode *)owner\n{\n\treturn [[DDXMLNamespaceNode alloc] initWithNsPrimitive:ns nsParent:parent owner:owner];\n}\n\n/**\n * Returns a DDXML wrapper object for the given primitive node.\n * The given node MUST be non-NULL and of the proper type.\n**/\n- (instancetype)initWithNsPrimitive:(xmlNsPtr)ns nsParent:(xmlNodePtr)parent owner:(DDXMLNode *)inOwner\n{\n\tif ((self = [super initWithPrimitive:(xmlKindPtr)ns owner:inOwner]))\n\t{\n\t\tnsParentPtr = parent;\n\t}\n\treturn self;\n}\n\n+ (instancetype)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use nodeWithNsPrimitive:nsParent:owner:\");\n\t\n\treturn nil;\n}\n\n- (instancetype)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)inOwner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use initWithNsPrimitive:nsParent:owner:\");\n\t\n\treturn nil;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Properties\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (void)setName:(NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlNsPtr ns = (xmlNsPtr)genericPtr;\n\t\n\txmlFree((xmlChar *)ns->prefix);\n\tns->prefix = xmlStrdup([name xmlChar]);\n}\n\n- (NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlNsPtr ns = (xmlNsPtr)genericPtr;\n\tif (ns->prefix != NULL)\n\t\treturn [NSString stringWithUTF8String:((const char*)ns->prefix)];\n\telse\n\t\treturn @\"\";\n}\n\n- (void)setStringValue:(NSString *)string\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlNsPtr ns = (xmlNsPtr)genericPtr;\n\t\n\txmlFree((xmlChar *)ns->href);\n\tns->href = xmlEncodeSpecialChars(NULL, [string xmlChar]);\n}\n\n- (NSString *)stringValue\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn [NSString stringWithUTF8String:((const char *)((xmlNsPtr)genericPtr)->href)];\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Tree Navigation\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (NSUInteger)index\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlNsPtr ns = (xmlNsPtr)genericPtr;\n\t\n\t// The xmlNsPtr has no prev pointer, so we have to search from the parent\n\t\n\tif (nsParentPtr == NULL)\n\t{\n\t\treturn 0;\n\t}\n\t\n\tNSUInteger result = 0;\n\t\n\txmlNsPtr currentNs = nsParentPtr->nsDef;\n\twhile (currentNs != NULL)\n\t{\n\t\tif (currentNs == ns)\n\t\t{\n\t\t\treturn result;\n\t\t}\n\t\tresult++;\n\t\tcurrentNs = currentNs->next;\n\t}\n\t\n\treturn 0; // Yes 0, not result, because ns wasn't found in list\n}\n\n- (NSUInteger)level\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tNSUInteger result = 0;\n\t\n\txmlNodePtr currentNode = nsParentPtr;\n\twhile (currentNode != NULL)\n\t{\n\t\tresult++;\n\t\tcurrentNode = currentNode->parent;\n\t}\n\t\n\treturn result;\n}\n\n- (DDXMLDocument *)rootDocument\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlStdPtr node = (xmlStdPtr)nsParentPtr;\n\t\n\tif (node == NULL || node->doc == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLDocument nodeWithDocPrimitive:node->doc owner:self];\n}\n\n- (DDXMLNode *)parent\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (nsParentPtr == NULL)\n\t\treturn nil;\n\telse\n\t\treturn [DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)nsParentPtr owner:self];\n}\n\n- (NSUInteger)childCount\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn 0;\n}\n\n- (NSArray *)children\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)childAtIndex:(NSUInteger)index\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)previousSibling\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)nextSibling\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)previousNode\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)nextNode\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (void)detach\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\tif (nsParentPtr != NULL)\n\t{\n\t\t[DDXMLNode detachNamespace:(xmlNsPtr)genericPtr fromNode:nsParentPtr];\n\t\t\n\t\towner = nil;\n\t\tnsParentPtr = NULL;\n\t}\n}\n\n- (xmlStdPtr)_XPathPreProcess:(NSMutableString *)result\n{\n\t// This is a private/internal method\n\t\n\txmlStdPtr parent = (xmlStdPtr)nsParentPtr;\n\t\t\n\tif (parent == NULL)\n\t\t[result appendFormat:@\"namespace::%@\", [self name]];\n\telse\n\t\t[result appendFormat:@\"/namespace::%@\", [self name]];\n\t\n\treturn parent;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark QNames\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (NSString *)localName\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// Strangely enough, the localName of a namespace is the prefix, and the prefix is an empty string\n\txmlNsPtr ns = (xmlNsPtr)genericPtr;\n\tif (ns->prefix != NULL)\n\t\treturn [NSString stringWithUTF8String:((const char *)ns->prefix)];\n\telse\n\t\treturn @\"\";\n}\n\n- (NSString *)prefix\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// Strangely enough, the localName of a namespace is the prefix, and the prefix is an empty string\n\treturn @\"\";\n}\n\n- (void)setURI:(NSString *)URI\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// Do nothing\n}\n\n- (NSString *)URI\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Private API\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (BOOL)_hasParent\n{\n\t// This is a private/internal method\n\t\n\treturn (nsParentPtr != NULL);\n}\n\n- (xmlNodePtr)_nsParentPtr\n{\n\t// This is a private/internal method\n\t\n\treturn nsParentPtr;\n}\n\n- (void)_setNsParentPtr:(xmlNodePtr)parentPtr\n{\n\t// This is a private/internal method\n\t\n\tnsParentPtr = parentPtr;\n}\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@implementation DDXMLAttributeNode\n\n+ (instancetype)nodeWithAttrPrimitive:(xmlAttrPtr)attr owner:(DDXMLNode *)owner\n{\n\treturn [[DDXMLAttributeNode alloc] initWithAttrPrimitive:attr owner:owner];\n}\n\n- (instancetype)initWithAttrPrimitive:(xmlAttrPtr)attr owner:(DDXMLNode *)inOwner\n{\n\tself = [super initWithPrimitive:(xmlKindPtr)attr owner:inOwner];\n\treturn self;\n}\n\n+ (instancetype)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use nodeWithAttrPrimitive:nsParent:owner:\");\n\t\n\treturn nil;\n}\n\n- (instancetype)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)inOwner\n{\n\t// Promote initializers which use proper parameter types to enable compiler to catch more mistakes.\n\tNSAssert(NO, @\"Use initWithAttrPrimitive:nsParent:owner:\");\n\t\n\treturn nil;\n}\n\n- (void)dealloc\n{\n\tif (attrNsPtr) xmlFreeNs(attrNsPtr);\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Properties\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (NSString *)name\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\t\n\tconst xmlChar *xmlName = attr->name;\n\tif (xmlName == NULL)\n\t{\n\t\treturn nil;\n\t}\n\t\n\tNSString *name = [NSString stringWithUTF8String:(const char *)xmlName];\n\t\n\tNSRange range = [name rangeOfString:@\":\"];\n\tif (range.length == 0)\n\t{\n\t\tif (attr->ns && attr->ns->prefix)\n\t\t{\n\t\t\treturn [NSString stringWithFormat:@\"%s:%@\", attr->ns->prefix, name];\n\t\t}\n\t}\n\t\n\treturn name;\n}\n\n- (void)setStringValue:(NSString *)string\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\t\n\tif (attr->children != NULL)\n\t{\n\t\txmlChar *escapedString = xmlEncodeSpecialChars(attr->doc, [string xmlChar]);\n\t\txmlNodeSetContent((xmlNodePtr)attr, escapedString);\n\t\txmlFree(escapedString);\n\t}\n\telse\n\t{\n\t\txmlNodePtr text = xmlNewText([string xmlChar]);\n\t\tattr->children = text;\n\t}\n}\n\n- (NSString *)stringValue\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\t\n\tif (attr->children != NULL)\n\t{\n\t\treturn [NSString stringWithUTF8String:(const char *)attr->children->content];\n\t}\n\t\n\treturn nil;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark Tree Navigation\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (DDXMLNode *)previousNode\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (DDXMLNode *)nextNode\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\treturn nil;\n}\n\n- (void)detach\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\t\n\tif (attr->parent != NULL)\n\t{\n\t\t// If this attribute is associated with a namespace,\n\t\t// then we need to copy the namespace in order to maintain the association.\n\t\t// \n\t\t// Remember: attr->ns cannot be an owner of an allocated namespaces,\n\t\t//           so we need to use DDXMLAttributeNode's attrNsPtr.\n\t\t\n\t\tif (attr->ns && (attr->ns != attrNsPtr))\n\t\t{\n\t\t\tattrNsPtr = xmlNewNs(NULL, attr->ns->href, attr->ns->prefix);\n\t\t}\n\t\t\n\t\t[[self class] detachAttribute:attr];\n\t\t\n\t\tif (attrNsPtr)\n\t\t{\n\t\t\tattr->ns = attrNsPtr;\n\t\t}\n\t\t\n\t\towner = nil;\n\t}\n}\n\n- (xmlStdPtr)_XPathPreProcess:(NSMutableString *)result\n{\n\t// This is a private/internal method\n\t\n\t// Note: DDXMLNamespaceNode overrides this method\n\t// Note: DDXMLAttributeNode overrides this method\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\txmlStdPtr parent = (xmlStdPtr)attr->parent;\n\t\n\tif (parent == NULL)\n\t\t[result appendFormat:@\"@%@\", [self name]];\n\telse\n\t\t[result appendFormat:@\"/@%@\", [self name]];\n\t\n\treturn parent;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark QNames\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n- (void)setURI:(NSString *)URI\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\t// An attribute can only have a single namespace attached to it.\n\t// In addition, this namespace can only be accessed via the URI method.\n\t// There is no way, within the API, to get a DDXMLNode wrapper for the attribute's namespace.\n\t\n\t// Remember: attr->ns is simply a pointer to a namespace owned by somebody else.\n\t//           Unless that points to our attrNsPtr (defined in DDXMLAttributeNode) we cannot free it.\n\t\n\tif (attrNsPtr != NULL)\n\t{\n\t\txmlFreeNs(attrNsPtr);\n\t\tattrNsPtr = NULL;\n\t}\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\tattr->ns = NULL;\n\t\n\tif (URI)\n\t{\n\t\t// If there's a namespace defined further up the tree with this URI,\n\t\t// then we want attr->ns to point to it.\n\t\t\n\t\tconst xmlChar *uri = [URI xmlChar];\n\t\t\n\t\txmlNodePtr parent = attr->parent;\n\t\twhile (parent)\n\t\t{\n\t\t\txmlNsPtr ns = parent->nsDef;\n\t\t\twhile (ns)\n\t\t\t{\n\t\t\t\tif (xmlStrEqual(ns->href, uri))\n\t\t\t\t{\n\t\t\t\t\tattr->ns = ns;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tns = ns->next;\n\t\t\t}\n\t\t\t\n\t\t\tparent = parent->parent;\n\t\t}\n\t\t\n\t\t// There is no namespace further up the tree with this URI.\n\t\t// We'll have to create it ourself...\n\t\t// \n\t\t// Remember: The attr->ns pointer is not allowed to have direct ownership.\n\t\t\n\t\tattrNsPtr = xmlNewNs(NULL, uri, NULL);\n\t\tattr->ns = attrNsPtr;\n\t}\n}\n\n- (NSString *)URI\n{\n#if DDXML_DEBUG_MEMORY_ISSUES\n\tDDXMLNotZombieAssert();\n#endif\n\t\n\txmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n\tif (attr->ns != NULL)\n\t{\n\t\tif (attr->ns->href != NULL)\n\t\t{\n\t\t\treturn [NSString stringWithUTF8String:((const char *)attr->ns->href)];\n\t\t}\n\t}\n\t\n\t// The attribute doesn't explicitly have a namespace.\n\t// But if the attribute is something like animal:duck='quack', then we should look for the URI for 'animal'.\n\t// \n\t// Note: [self prefix] returns an empty string if there is no prefix. (Not nil)\n\t\n\tNSString *prefix = [self prefix];\n\tif ([prefix length] > 0)\n\t{\n\t\txmlNsPtr ns = xmlSearchNs(attr->doc, attr->parent, [prefix xmlChar]);\n\t\tif (ns && ns->href)\n\t\t{\n\t\t\treturn [NSString stringWithUTF8String:((const char *)ns->href)];\n\t\t}\n\t}\n\t\n\treturn nil;\n}\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@implementation DDXMLInvalidNode\n\n// #pragma mark Properties\n\n- (DDXMLNodeKind)kind {\n\treturn DDXMLInvalidKind;\n}\n\n- (void)setName:(NSString *)name { }\n- (NSString *)name {\n\treturn nil;\n}\n\n- (void)setObjectValue:(id)value { }\n- (instancetype)objectValue {\n\treturn nil;\n}\n\n- (void)setStringValue:(NSString *)string { }\n- (void)setStringValue:(NSString *)string resolvingEntities:(BOOL)resolve { }\n- (NSString *)stringValue {\n\treturn nil;\n}\n\n// #pragma mark Tree Navigation\n\n- (NSUInteger)index {\n\treturn 0;\n}\n\n- (NSUInteger)level {\n\treturn 0;\n}\n\n- (DDXMLDocument *)rootDocument {\n\treturn nil;\n}\n\n- (DDXMLNode *)parent {\n\treturn nil;\n}\n- (NSUInteger)childCount {\n\treturn 0;\n}\n- (NSArray *)children {\n\treturn [NSArray array];\n}\n- (DDXMLNode *)childAtIndex:(NSUInteger)index {\n\treturn nil;\n}\n\n- (DDXMLNode *)previousSibling {\n\treturn nil;\n}\n- (DDXMLNode *)nextSibling {\n\treturn nil;\n}\n\n- (DDXMLNode *)previousNode {\n\treturn nil;\n}\n- (DDXMLNode *)nextNode {\n\treturn nil;\n}\n\n- (void)detach { }\n\n- (NSString *)XPath {\n\treturn @\"\";\n}\n\n// #pragma mark QNames\n\n- (NSString *)localName {\n\treturn nil;\n}\n- (NSString *)prefix {\n\treturn @\"\";\n}\n\n- (void)setURI:(NSString *)URI { }\n- (NSString *)URI {\n\treturn nil;\n}\n\n// #pragma mark Output\n\n- (NSString *)description {\n\treturn @\"\";\n}\n- (NSString *)XMLString {\n\treturn @\"\";\n}\n- (NSString *)XMLStringWithOptions:(NSUInteger)options {\n\treturn @\"\";\n}\n- (NSString *)canonicalXMLStringPreservingComments:(BOOL)comments {\n\treturn nil;\n}\n\n// #pragma mark XPath/XQuery\n\n- (NSArray *)nodesForXPath:(NSString *)xpath error:(NSError **)error {\n\treturn [NSArray array];\n}\n\n- (NSArray *)objectsForXQuery:(NSString *)xquery constants:(NSDictionary *)constants error:(NSError **)error {\n\treturn [NSArray array];\n}\n- (NSArray *)objectsForXQuery:(NSString *)xquery error:(NSError **)error {\n\treturn [NSArray array];\n}\n\n@end\n\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/KissXML.h",
    "content": "@import Foundation;\n\n#import \"DDXMLElementAdditions.h\"\n#import \"NSString+DDXML.h\"\n#import \"DDXML.h\"\n#import \"DDXMLDocument.h\"\n#import \"DDXMLElement.h\"\n#import \"DDXMLNode.h\"\n\nFOUNDATION_EXPORT double KissXMLVersionNumber;\nFOUNDATION_EXPORT const unsigned char KissXMLVersionString[];\n\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML/Private/DDXMLPrivate.h",
    "content": "#import \"DDXML.h\"\n#import <libxml/tree.h>\n\n// We can't rely solely on NSAssert, because many developers disable them for release builds.\n// Our API contract requires us to keep these assertions intact.\n#define DDXMLAssert(condition, desc, ...)                                                                 \\\n  do{                                                                                                     \\\n    if(!(condition)) {                                                                                    \\\n      [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd                                     \\\n                                                          object:self                                     \\\n                                                            file:[NSString stringWithUTF8String:__FILE__] \\\n                                                      lineNumber:__LINE__                                 \\\n                                                     description:(desc), ##__VA_ARGS__];                  \\\n    }                                                                                                     \\\n  }while(NO)\n\n\n// Create assertion to ensure xml node is not a zombie.\n#if DDXML_DEBUG_MEMORY_ISSUES\n#define DDXMLNotZombieAssert()                                                                            \\\n  do{                                                                                                     \\\n    if(DDXMLIsZombie(genericPtr, self)) {                                                                      \\\n      NSString *desc = @\"XML node is a zombie - It's parent structure has been freed!\";                   \\\n      [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd                                     \\\n                                                          object:self                                     \\\n                                                            file:[NSString stringWithUTF8String:__FILE__] \\\n                                                      lineNumber:__LINE__                                 \\\n                                                     description:desc];                                   \\\n    }                                                                                                     \\\n  }while(NO)\n#endif\n\n#define DDLastErrorKey @\"DDXML:LastError\"\n\n\n\n/**\n * DDXMLNode can represent several underlying types, such as xmlNodePtr, xmlDocPtr, xmlAttrPtr, xmlNsPtr, etc.\n * All of these are pointers to structures, and all of those structures start with a pointer, and a type.\n * The xmlKind struct is used as a generic structure, and a stepping stone.\n * We use it to check the type of a structure, and then perform the appropriate cast.\n * \n * For example:\n * if(genericPtr->type == XML_ATTRIBUTE_NODE)\n * {\n *     xmlAttrPtr attr = (xmlAttrPtr)genericPtr;\n *     // Do something with attr\n * }\n**/\nstruct _xmlKind {\n\tvoid * ignore;\n\txmlElementType type;\n};\ntypedef struct _xmlKind *xmlKindPtr;\n\n/**\n * Most xml types all start with this standard structure. In fact, all do except the xmlNsPtr.\n * We will occasionally take advantage of this to simplify code when the code wouldn't vary from type to type.\n * Obviously, you cannnot cast a xmlNsPtr to a xmlStdPtr.\n**/\nstruct _xmlStd {\n\tvoid * _private;\n\txmlElementType type;\n\tconst xmlChar *name;\n\tstruct _xmlNode *children;\n\tstruct _xmlNode *last;\n\tstruct _xmlNode *parent;\n\tstruct _xmlStd *next;\n\tstruct _xmlStd *prev;\n\tstruct _xmlDoc *doc;\n};\ntypedef struct _xmlStd *xmlStdPtr;\n\n\nNS_INLINE BOOL IsXmlAttrPtr(void *kindPtr)\n{\n\treturn ((xmlKindPtr)kindPtr)->type == XML_ATTRIBUTE_NODE;\n}\n\nNS_INLINE BOOL IsXmlNodePtr(void *kindPtr)\n{\n\tswitch (((xmlKindPtr)kindPtr)->type)\n\t{\n\t\tcase XML_ELEMENT_NODE       :\n\t\tcase XML_PI_NODE            : \n\t\tcase XML_COMMENT_NODE       : \n\t\tcase XML_TEXT_NODE          : \n\t\tcase XML_CDATA_SECTION_NODE : return YES;\n\t\tdefault                     : return NO;\n\t}\n}\n\nNS_INLINE BOOL IsXmlDocPtr(void *kindPtr)\n{\n\treturn ((xmlKindPtr)kindPtr)->type == XML_DOCUMENT_NODE;\n}\n\nNS_INLINE BOOL IsXmlDtdPtr(void *kindPtr)\n{\n\treturn ((xmlKindPtr)kindPtr)->type == XML_DTD_NODE;\n}\n\nNS_INLINE BOOL IsXmlNsPtr(void *kindPtr)\n{\n\treturn ((xmlKindPtr)kindPtr)->type == XML_NAMESPACE_DECL;\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLNamespaceNode : DDXMLNode\n{\n\t// The xmlNsPtr type doesn't store a reference to it's parent.\n\t// This is here to fix the problem, and make this class more compatible with the NSXML classes.\n\txmlNodePtr nsParentPtr;\n}\n\n+ (instancetype)nodeWithNsPrimitive:(xmlNsPtr)ns nsParent:(xmlNodePtr)parent owner:(DDXMLNode *)owner;\n- (instancetype)initWithNsPrimitive:(xmlNsPtr)ns nsParent:(xmlNodePtr)parent owner:(DDXMLNode *)owner;\n\n- (xmlNodePtr)_nsParentPtr;\n- (void)_setNsParentPtr:(xmlNodePtr)parentPtr;\n\n// Overrides several methods in DDXMLNode\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLAttributeNode : DDXMLNode\n{\n\t// The xmlAttrPtr type doesn't allow for ownership of a namespace.\n\t// \n\t// In other types, such as xmlNodePtr:\n\t// - nsDef stores namespaces that are owned by the node (have been alloced by the node).\n\t// - ns is simply a pointer to the default namespace of the node, which may or may not reside in its own nsDef list.\n\t// \n\t// The xmlAttrPtr only has a ns, it doesn't have a nsDef list.\n\t// Which completely makes sense really, since namespaces have to be defined elsewhere.\n\t// \n\t// This is here to maintain compatibility with the NSXML classes,\n\t// where one can assign a namespace to an attribute independently.\n\txmlNsPtr attrNsPtr;\n}\n\n+ (instancetype)nodeWithAttrPrimitive:(xmlAttrPtr)attr owner:(DDXMLNode *)owner;\n- (instancetype)initWithAttrPrimitive:(xmlAttrPtr)attr owner:(DDXMLNode *)owner;\n\n// Overrides several methods in DDXMLNode\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLInvalidNode : DDXMLNode\n{\n}\n\n// Overrides several methods in DDXMLNode\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLNode (PrivateAPI)\n\n+ (instancetype)nodeWithUnknownPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner;\n\n+ (instancetype)nodeWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner;\n- (instancetype)initWithPrimitive:(xmlKindPtr)kindPtr owner:(DDXMLNode *)owner;\n\n- (BOOL)_hasParent;\n\n+ (void)getHasPrefix:(BOOL *)hasPrefixPtr localName:(NSString **)localNamePtr forName:(NSString *)name;\n+ (void)getPrefix:(NSString **)prefixPtr localName:(NSString **)localNamePtr forName:(NSString *)name;\n\n+ (void)recursiveStripDocPointersFromNode:(xmlNodePtr)node;\n\n+ (void)detachNamespace:(xmlNsPtr)ns fromNode:(xmlNodePtr)node;\n+ (void)removeNamespace:(xmlNsPtr)ns fromNode:(xmlNodePtr)node;\n+ (void)removeAllNamespacesFromNode:(xmlNodePtr)node;\n\n+ (void)detachAttribute:(xmlAttrPtr)attr andClean:(BOOL)clean;\n+ (void)detachAttribute:(xmlAttrPtr)attr;\n+ (void)removeAttribute:(xmlAttrPtr)attr;\n+ (void)removeAllAttributesFromNode:(xmlNodePtr)node;\n\n+ (void)detachChild:(xmlNodePtr)child andClean:(BOOL)clean andFixNamespaces:(BOOL)fixNamespaces;\n+ (void)detachChild:(xmlNodePtr)child;\n+ (void)removeChild:(xmlNodePtr)child;\n+ (void)removeAllChildrenFromNode:(xmlNodePtr)node;\n\nBOOL DDXMLIsZombie(void *xmlPtr, DDXMLNode *wrapper);\n\n+ (NSError *)lastError;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLElement (PrivateAPI)\n\n+ (instancetype)nodeWithElementPrimitive:(xmlNodePtr)node owner:(DDXMLNode *)owner;\n- (instancetype)initWithElementPrimitive:(xmlNodePtr)node owner:(DDXMLNode *)owner;\n\n- (DDXMLNode *)_recursiveResolveNamespaceForPrefix:(NSString *)prefix atNode:(xmlNodePtr)nodePtr;\n- (NSString *)_recursiveResolvePrefixForURI:(NSString *)uri atNode:(xmlNodePtr)nodePtr;\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@interface DDXMLDocument (PrivateAPI)\n\n+ (instancetype)nodeWithDocPrimitive:(xmlDocPtr)doc owner:(DDXMLNode *)owner;\n- (instancetype)initWithDocPrimitive:(xmlDocPtr)doc owner:(DDXMLNode *)owner;\n\n@end\n\n@interface DDXMLNode ()\n{\n@public\n    // Every DDXML object is simply a wrapper around an underlying libxml node\n    struct _xmlKind *genericPtr;\n    \n    // Every libxml node resides somewhere within an xml tree heirarchy.\n    // We cannot free the tree heirarchy until all referencing nodes have been released.\n    // So all nodes retain a reference to the node that created them,\n    // and when the last reference is released the tree gets freed.\n    DDXMLNode *owner;\n}\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/KissXML.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name         = 'KissXML'\n  s.version      = '5.1.2'\n  s.license      = { :type => 'MIT', :file => 'LICENSE.txt' }\n  s.summary      = 'A replacement for Cocoa\\'s NSXML cluster of classes. Based on libxml.'\n  s.homepage     = 'https://github.com/robbiehanson/KissXML'\n  s.author       = { 'Robbie Hanson' => 'robbiehanson@deusty.com' }\n  s.source       = { :git => 'https://github.com/robbiehanson/KissXML.git', :tag => s.version }\n\n  s.requires_arc = true\n  s.default_subspecs = 'Core'\n\n  s.subspec 'Core' do |ss|\n    ss.source_files = 'KissXML/**/*.{h,m}'\n    ss.private_header_files = 'KissXML/Private/**/*.h'\n    ss.library      = 'xml2'\n    ss.xcconfig     = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2'}\n  end\n\n  # Requires 'use_frameworks!' in Podfile\n  s.subspec 'SwiftNSXML' do |ss|\n  \tss.dependency 'KissXML/Core'\n    ss.source_files = 'KissXML/**/*.{h,m,swift}'\n    ss.osx.exclude_files = 'KissXML/**/*.swift'\n    ss.private_header_files = 'KissXML/Private/**/*.h'\n    ss.ios.deployment_target = '8.0'\n    ss.osx.deployment_target = '10.8'\n  \tss.tvos.deployment_target = '9.0'\n  \tss.watchos.deployment_target = '2.0'\n  end\n\n  # This is left here for backwards compatibility\n  s.subspec 'libxml_module' do |ss|\n    ss.dependency 'KissXML/SwiftNSXML'\n    ss.ios.deployment_target = '8.0'\n    ss.osx.deployment_target = '10.8'\n  \tss.tvos.deployment_target = '9.0'\n  \tss.watchos.deployment_target = '2.0'\n  end\n\n  s.ios.deployment_target = '6.0'\n  s.osx.deployment_target = '10.8'\n  s.tvos.deployment_target = '9.0'\n  s.watchos.deployment_target = '2.0'\nend\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/LICENSE.txt",
    "content": "Copyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/README.markdown",
    "content": "# [KissXML](https://github.com/robbiehanson/KissXML)\n\n[![CI Status](http://img.shields.io/travis/robbiehanson/KissXML.svg?style=flat)](https://travis-ci.org/robbiehanson/KissXML)\n[![Version](https://img.shields.io/cocoapods/v/KissXML.svg?style=flat)](http://cocoapods.org/pods/KissXML)\n[![License](https://img.shields.io/cocoapods/l/KissXML.svg?style=flat)](http://cocoapods.org/pods/KissXML)\n[![Platform](https://img.shields.io/cocoapods/p/KissXML.svg?style=flat)](http://cocoapods.org/pods/KissXML)\n\nKissXML provides a drop-in replacement for Apple's NSXML class culster in environments without NSXML (e.g. iOS).\n\nIt is implemented atop the defacto libxml2 C library, which comes pre-installed on Mac & iOS.\nBut it shields you from all the nasty low-level C pointers and malloc's, and provides an easy-to-use Objective-C library.\n\nIt is designed for speed and reliability, so it's read-access thread-safe and will \"just-work\".\nThat is, KissXML provides an API that follows \"what-you-would-expect\" rules from an Objective-C library.\nSo feel free to do things like parallel processing of an xml document using blocks.\nIt will \"just work\" so you can get back to designing the rest of your app.\n\nKissXML is a mature library used in thousands of products. It's also used in other libraries, such as [XMPPFramework](https://github.com/robbiehanson/XMPPFramework) (an objective-c library for real-time xml streaming). It's even used in hospital applications.\n\nKissXML was inspired by the TouchXML project, but was created to add full support for generating XML as well as supporting the entire NSXML API.\n\n### Getting Started\n\nThe minimum deployment target is iOS 6.0 / macOS 10.8 / tvOS 9.0 / watchOS 2.0.\n\nThe easiest way to install `KissXML` is using CocoaPods.\n\n```ruby\npod 'KissXML'\n```\nIf you're using Swift you can enable mappings from DDXML to NSXML by using the `SwiftNSXML` subspec.\n\n```ruby\nuse_frameworks!\npod 'KissXML/SwiftNSXML'\n```\n\nAfter `pod install` open your `.xcworkspace` and import:\n\n```objc\n// Swift\nimport KissXML     \n// Objective-C on iOS 8+ with `use_frameworks!`\n@import KissXML;   \n// Objective-C when integrated as a static library\n#import <KissXML/KissXML.h>  \n```\n\n### Learn More\n\n**[Get started using KissXML](https://github.com/robbiehanson/KissXML/wiki/GettingStarted)**<br/>\n**[Learn more about KissXML](https://github.com/robbiehanson/KissXML/wiki)**<br/>\n\n<br/>\nCan't find the answer to your question in any of the [wiki](https://github.com/robbiehanson/KissXML/wiki) articles? Try the **[mailing list](http://groups.google.com/group/kissxml)**.\n<br/>\n<br/>\nLove the project? Wanna buy me a coffee? (or a beer :D) [![donation](http://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=69SPF7R4ZF69J)\n\n## Changelog\n\n* 5.1.1 - Jul 7 2016 - Fixes issue when integrated as a static library. Min iOS version is back to 6.0. Moved DDXML->NSXML Swift mappings to `SwiftNSXML` subspec. Added test for static library integration.\n* 5.1.0 - Jul 6 2016 - Removed need for `libxml_module` subspec by removing references to libxml in public headers. Added Obj-C generics and nullability support to match NSXML API. Added watchOS support. Minimum iOS version is now 8.0.\n* 5.0.3 - Feb 1 2016 - Removed `DDXML_NS_DECLARATIONS_ENABLED` to allow for better Swift compatibility. Added `DDXML.swift` with mappings between NSXML classes and constants and DDXML.\n* 5.0.2 - Jan 26 2016 - Enable Swift support via `libxml/module.modulemap` and `DDXML_LIBXML_MODULE_ENABLED` macro. You can use the `KissXML/libxml_module` CocoaPods subspec to enable this feature. \n* 5.0.1 - Jan 21 2016 - Run tests on iOS and Mac targets. \n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/KissXML.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\t2357A048A50D62A0726A47D7 /* Pods_KissXMLTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C70BB7AE0E553D05BD5B28A /* Pods_KissXMLTests.framework */; };\n\t\tD9AA72581C56EEF500002BEE /* KissXMLTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D9AA72571C56EEF500002BEE /* KissXMLTests.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t479081CF84316EC3B64CC774 /* Pods-KissXMLTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5C70BB7AE0E553D05BD5B28A /* Pods_KissXMLTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KissXMLTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7086B3E72D0408689CA93694 /* Pods_KissXMLSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KissXMLSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t803514BD5C8291F46DF497F8 /* Pods-KissXMLSwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t8B3609D8C44FA5211387ABFE /* Pods-KissXMLSwiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD36E3906E0CB35A96D3E649C /* Pods-KissXMLTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD9AA72541C56EEF500002BEE /* KissXMLTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KissXMLTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD9AA72571C56EEF500002BEE /* KissXMLTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = KissXMLTests.m; path = ../../Shared/KissXMLTests.m; sourceTree = \"<group>\"; };\n\t\tD9AA72591C56EEF500002BEE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD9AA72511C56EEF500002BEE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2357A048A50D62A0726A47D7 /* Pods_KissXMLTests.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\tD9AA72491C56EE9D00002BEE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9AA72561C56EEF500002BEE /* KissXMLTests */,\n\t\t\t\tD9AA72551C56EEF500002BEE /* Products */,\n\t\t\t\tEC6C09DE893398DA001C5BFD /* Pods */,\n\t\t\t\tFB53D0F8D20CA2E913D68E36 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72551C56EEF500002BEE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9AA72541C56EEF500002BEE /* KissXMLTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72561C56EEF500002BEE /* KissXMLTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9AA72571C56EEF500002BEE /* KissXMLTests.m */,\n\t\t\t\tD9AA72591C56EEF500002BEE /* Info.plist */,\n\t\t\t);\n\t\t\tpath = KissXMLTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEC6C09DE893398DA001C5BFD /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t479081CF84316EC3B64CC774 /* Pods-KissXMLTests.debug.xcconfig */,\n\t\t\t\tD36E3906E0CB35A96D3E649C /* Pods-KissXMLTests.release.xcconfig */,\n\t\t\t\t803514BD5C8291F46DF497F8 /* Pods-KissXMLSwiftTests.debug.xcconfig */,\n\t\t\t\t8B3609D8C44FA5211387ABFE /* Pods-KissXMLSwiftTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFB53D0F8D20CA2E913D68E36 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5C70BB7AE0E553D05BD5B28A /* Pods_KissXMLTests.framework */,\n\t\t\t\t7086B3E72D0408689CA93694 /* Pods_KissXMLSwiftTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD9AA72531C56EEF500002BEE /* KissXMLTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D9AA725C1C56EEF500002BEE /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49CD44A600EEDA2A30B614BB /* Check Pods Manifest.lock */,\n\t\t\t\tD9AA72501C56EEF500002BEE /* Sources */,\n\t\t\t\tD9AA72511C56EEF500002BEE /* Frameworks */,\n\t\t\t\tD9AA72521C56EEF500002BEE /* Resources */,\n\t\t\t\t62CF439FC3F6B1C6386AC09A /* Embed Pods Frameworks */,\n\t\t\t\t31362D2FE350759B36F97DCF /* 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 = KissXMLTests;\n\t\t\tproductName = KissXMLTests;\n\t\t\tproductReference = D9AA72541C56EEF500002BEE /* KissXMLTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD9AA724A1C56EE9D00002BEE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD9AA72531C56EEF500002BEE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */;\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 = D9AA72491C56EE9D00002BEE;\n\t\t\tproductRefGroup = D9AA72551C56EEF500002BEE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD9AA72531C56EEF500002BEE /* KissXMLTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD9AA72521C56EEF500002BEE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t31362D2FE350759B36F97DCF /* 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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t49CD44A600EEDA2A30B614BB /* 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\t62CF439FC3F6B1C6386AC09A /* Embed Pods Frameworks */ = {\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 = \"Embed Pods Frameworks\";\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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD9AA72501C56EEF500002BEE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD9AA72581C56EEF500002BEE /* KissXMLTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD9AA724E1C56EE9D00002BEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9AA724F1C56EE9D00002BEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD9AA725A1C56EEF500002BEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 479081CF84316EC3B64CC774 /* Pods-KissXMLTests.debug.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9AA725B1C56EEF500002BEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D36E3906E0CB35A96D3E649C /* Pods-KissXMLTests.release.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9AA724E1C56EE9D00002BEE /* Debug */,\n\t\t\t\tD9AA724F1C56EE9D00002BEE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD9AA725C1C56EEF500002BEE /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9AA725A1C56EEF500002BEE /* Debug */,\n\t\t\t\tD9AA725B1C56EEF500002BEE /* 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 = D9AA724A1C56EE9D00002BEE /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/KissXML.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:KissXML.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/KissXML.xcodeproj/xcshareddata/xcschemes/KissXMLTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D9AA72531C56EEF500002BEE\"\n               BuildableName = \"KissXMLTests.xctest\"\n               BlueprintName = \"KissXMLTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/KissXML.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:KissXML.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/KissXMLTests/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>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</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</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Mac/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nuse_frameworks!\nplatform :osx, \"10.8\"\n\n\ntarget 'KissXMLTests' do\n  pod \"KissXML\", :path => \"../../\"\nend"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Shared/KissXMLTests.m",
    "content": "//\n//  KissXMLTests.m\n//  KissXMLTests\n//\n//  Created by Christopher Ballinger on 9/23/15.\n//\n//\n\n#import <XCTest/XCTest.h>\n#import <KissXML/KissXML.h>\n\n@interface DDAssertionHandler : NSAssertionHandler\n{\n    BOOL shouldLogAssertionFailure;\n}\n\n@property (nonatomic, readwrite, assign) BOOL shouldLogAssertionFailure;\n\n@end\n\n@interface KissXMLTests : XCTestCase\n@end\n\n@implementation KissXMLTests\n\nstatic NSAssertionHandler *prevAssertionHandler;\nstatic DDAssertionHandler *ddAssertionHandler;\n\n- (void)setUp\n{\n    [super setUp];\n    // We purposefully do bad things to ensure the library is throwing exceptions when it should.\n    // In other words, DDXML uses the same assertions as NSXML, and we test they both throw the same exceptions\n    // on bad input.\n    //\n    // But the normal assertion handler does an NSLog for every failed assertion,\n    // even if that assertion is caught. This clogs up our console and makes it difficult to see test cases\n    // that failed. So we install our own assertion handler, and disable logging of failed assertions immediately\n    // before we enter those tests designed to trigger the assertion.\n    // And of course we re-enable the assertion logging when we exit those tests.\n    //\n    // See the tryCatch method below.\n    \n    prevAssertionHandler = [[[NSThread currentThread] threadDictionary] objectForKey:NSAssertionHandlerKey];\n    ddAssertionHandler = [[DDAssertionHandler alloc] init];\n    \n    [[[NSThread currentThread] threadDictionary] setObject:ddAssertionHandler forKey:NSAssertionHandlerKey];\n}\n\n- (void)tearDown\n{\n    [super tearDown];\n    // Remove our custom assertion handler.\n    \n    if (prevAssertionHandler)\n        [[[NSThread currentThread] threadDictionary] setObject:ddAssertionHandler forKey:NSAssertionHandlerKey];\n    else\n        [[[NSThread currentThread] threadDictionary] removeObjectForKey:NSAssertionHandlerKey];\n    \n    prevAssertionHandler = nil;\n    ddAssertionHandler = nil;\n}\n\n- (NSException *)tryCatch:(void (^)())block\n{\n    NSException *result = nil;\n    \n    ddAssertionHandler.shouldLogAssertionFailure = NO;\n    @try {\n        block();\n    }\n    @catch (NSException *e) {\n        result = e;\n    }\n    ddAssertionHandler.shouldLogAssertionFailure = YES;\n    \n    return result;\n}\n\n- (void)testName { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *str = @\"<body xmlns:food='http://example.com/' food:genre='italian'>\"\n        @\"  <food:pizza>yumyum</food:pizza>\"\n        @\"</body>\";\n        \n        NSError *error = nil;\n        \n        NSXMLElement *nsBody = [[NSXMLElement alloc] initWithXMLString:str error:&error];\n        DDXMLElement *ddBody = [[DDXMLElement alloc] initWithXMLString:str error:&error];\n        \n        // Test 1 - elements\n        \n        NSString *nsNodeName = [[nsBody childAtIndex:0] name];\n        NSString *ddNodeName = [[ddBody childAtIndex:0] name];\n        \n        XCTAssert([nsNodeName isEqualToString:ddNodeName], @\"Failed test 1 - ns(%@) dd(%@)\", nsNodeName, ddNodeName);\n        \n        // Test 2 - attributes\n        \n        NSString *nsAttrName = [[nsBody attributeForName:@\"food:genre\"] name];\n        NSString *ddAttrName = [[ddBody attributeForName:@\"food:genre\"] name];\n        \n        XCTAssert([nsAttrName isEqualToString:ddAttrName], @\"Failed test 2 - ns(%@) dd(%@)\", nsAttrName, ddAttrName);\n    }}\n\n- (void)testLocalName { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *nsTest1 = [NSXMLNode localNameForName:@\"a:quack\"];\n        NSString *ddTest1 = [DDXMLNode localNameForName:@\"a:quack\"];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        NSString *nsTest2 = [NSXMLNode localNameForName:@\"a:a:quack\"];\n        NSString *ddTest2 = [DDXMLNode localNameForName:@\"a:a:quack\"];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        NSString *nsTest3 = [NSXMLNode localNameForName:@\"quack\"];\n        NSString *ddTest3 = [DDXMLNode localNameForName:@\"quack\"];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        NSString *nsTest4 = [NSXMLNode localNameForName:@\"a:\"];\n        NSString *ddTest4 = [DDXMLNode localNameForName:@\"a:\"];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n        \n        NSString *nsTest5 = [NSXMLNode localNameForName:@\"\"];\n        NSString *ddTest5 = [DDXMLNode localNameForName:@\"\"];\n        \n        XCTAssert(!nsTest5.length && !ddTest5.length, @\"Failed test 5\");\n        \n        NSXMLNode *nsNode = [NSXMLNode namespaceWithName:@\"tucker\" stringValue:@\"dog\"];\n        DDXMLNode *ddNode = [DDXMLNode namespaceWithName:@\"tucker\" stringValue:@\"dog\"];\n        \n        NSString *nsTest6 = [nsNode localName];\n        NSString *ddTest6 = [ddNode localName];\n        \n        XCTAssert([nsTest6 isEqualToString:ddTest6], @\"Failed test 6\");\n    }}\n\n- (void)testPrefixName { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *nsTest1 = [NSXMLNode prefixForName:@\"a:quack\"];\n        NSString *ddTest1 = [DDXMLNode prefixForName:@\"a:quack\"];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        NSString *nsTest2 = [NSXMLNode prefixForName:@\"a:a:quack\"];\n        NSString *ddTest2 = [DDXMLNode prefixForName:@\"a:a:quack\"];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        NSString *nsTest3 = [NSXMLNode prefixForName:@\"quack\"];\n        NSString *ddTest3 = [DDXMLNode prefixForName:@\"quack\"];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        NSString *nsTest4 = [NSXMLNode prefixForName:@\"a:\"];\n        NSString *ddTest4 = [DDXMLNode prefixForName:@\"a:\"];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n        \n        NSString *nsTest5 = [NSXMLNode prefixForName:@\"\"];\n        NSString *ddTest5 = [DDXMLNode prefixForName:@\"\"];\n        \n        XCTAssert([nsTest5 isEqualToString:ddTest5], @\"Failed test 5\");\n        \n        NSXMLNode *nsNode = [NSXMLNode namespaceWithName:@\"tucker\" stringValue:@\"dog\"];\n        DDXMLNode *ddNode = [DDXMLNode namespaceWithName:@\"tucker\" stringValue:@\"dog\"];\n        \n        NSString *nsTest6 = [nsNode prefix];\n        NSString *ddTest6 = [ddNode prefix];\n        \n        XCTAssert([nsTest6 isEqualToString:ddTest6], @\"Failed test 6\");\n    }}\n\n- (void)testDoubleAdd { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLElement *nsRoot1 = [NSXMLElement elementWithName:@\"root1\"];\n        NSXMLElement *nsRoot2 = [NSXMLElement elementWithName:@\"root2\"];\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"node\"];\n        NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@\"key\" stringValue:@\"value\"];\n        NSXMLNode *nsNs = [NSXMLNode namespaceWithName:@\"a\" stringValue:@\"domain.com\"];\n        \n        NSException *nsInvalidAddException1 = nil;\n        NSException *nsInvalidAddException2 = nil;\n        NSException *nsInvalidAddException3 = nil;\n        \n        NSException *nsDoubleAddException1 = nil;\n        NSException *nsDoubleAddException2 = nil;\n        NSException *nsDoubleAddException3 = nil;\n        \n        nsInvalidAddException1 = [self tryCatch:^{\n            // Elements can only have text, elements, processing instructions, and comments as children\n            [nsRoot1 addChild:nsAttr];\n        }];\n        \n        nsInvalidAddException2 = [self tryCatch:^{\n            // Not an attribute\n            [nsRoot1 addAttribute:nsNode];\n        }];\n        \n        nsInvalidAddException3 = [self tryCatch:^{\n            // Not a namespace\n            [nsRoot1 addNamespace:nsNode];\n        }];\n        \n        [nsRoot1 addChild:nsNode];\n        nsDoubleAddException1 = [self tryCatch:^{\n            // Cannot add a child that has a parent; detach or copy first\n            [nsRoot2 addChild:nsNode];\n        }];\n        \n        [nsRoot1 addAttribute:nsAttr];\n        nsDoubleAddException2 = [self tryCatch:^{\n            // Cannot add an attribute with a parent; detach or copy first\n            [nsRoot2 addAttribute:nsAttr];\n        }];\n        \n        [nsRoot1 addNamespace:nsNs];\n        nsDoubleAddException3 = [self tryCatch:^{\n            // Cannot add a namespace with a parent; detach or copy first\n            [nsRoot2 addNamespace:nsNs];\n        }];\n        \n        XCTAssert(nsInvalidAddException1 != nil, @\"Failed CHECK 1\");\n        XCTAssert(nsInvalidAddException2 != nil, @\"Failed CHECK 2\");\n        XCTAssert(nsInvalidAddException3 != nil, @\"Failed CHECK 3\");\n        \n        XCTAssert(nsDoubleAddException1 != nil, @\"Failed CHECK 4\");\n        XCTAssert(nsDoubleAddException2 != nil, @\"Failed CHECK 5\");\n        XCTAssert(nsDoubleAddException3 != nil, @\"Failed CHECK 6\");\n        \n        DDXMLElement *ddRoot1 = [DDXMLElement elementWithName:@\"root1\"];\n        DDXMLElement *ddRoot2 = [DDXMLElement elementWithName:@\"root2\"];\n        \n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"node\"];\n        DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@\"key\" stringValue:@\"value\"];\n        DDXMLNode *ddNs = [DDXMLNode namespaceWithName:@\"a\" stringValue:@\"domain.com\"];\n        \n        NSException *ddInvalidAddException1 = nil;\n        NSException *ddInvalidAddException2 = nil;\n        NSException *ddInvalidAddException3 = nil;\n        \n        NSException *ddDoubleAddException1 = nil;\n        NSException *ddDoubleAddException2 = nil;\n        NSException *ddDoubleAddException3 = nil;\n        \n        ddInvalidAddException1 = [self tryCatch:^{\n            // Elements can only have text, elements, processing instructions, and comments as children\n            [ddRoot1 addChild:ddAttr];\n        }];\n        \n        ddInvalidAddException2 = [self tryCatch:^{\n            // Not an attribute\n            [ddRoot1 addAttribute:ddNode];\n        }];\n        \n        ddInvalidAddException3 = [self tryCatch:^{\n            // Not a namespace\n            [ddRoot1 addNamespace:ddNode];\n        }];\n        \n        [ddRoot1 addChild:ddNode];\n        ddDoubleAddException1 = [self tryCatch:^{\n            // Cannot add a child that has a parent; detach or copy first\n            [ddRoot2 addChild:ddNode];\n        }];\n        \n        [ddRoot1 addAttribute:ddAttr];\n        ddDoubleAddException2 = [self tryCatch:^{\n            // Cannot add an attribute with a parent; detach or copy first\n            [ddRoot2 addAttribute:ddAttr];\n        }];\n        \n        [ddRoot1 addNamespace:ddNs];\n        ddDoubleAddException3 = [self tryCatch:^{\n            // Cannot add a namespace with a parent; detach or copy first\n            [ddRoot2 addNamespace:ddNs];\n        }];\n        \n        XCTAssert(ddInvalidAddException1 != nil, @\"Failed test 1\");\n        XCTAssert(ddInvalidAddException2 != nil, @\"Failed test 2\");\n        XCTAssert(ddInvalidAddException3 != nil, @\"Failed test 3\");\n        \n        XCTAssert(ddDoubleAddException1 != nil, @\"Failed test 4\");\n        XCTAssert(ddDoubleAddException2 != nil, @\"Failed test 5\");\n        XCTAssert(ddDoubleAddException3 != nil, @\"Failed test 6\");\n    }}\n\n- (void)testNsGeneral { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLNode *nsNs = [NSXMLNode namespaceWithName:@\"a\" stringValue:@\"deusty.com\"];\n        DDXMLNode *ddNs = [DDXMLNode namespaceWithName:@\"a\" stringValue:@\"deusty.com\"];\n        \n        NSString *nsTest1 = [nsNs XMLString];\n        NSString *ddTest1 = [ddNs XMLString];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        [nsNs setName:@\"b\"];\n        [ddNs setName:@\"b\"];\n        \n        NSString *nsTest2 = [nsNs XMLString];\n        NSString *ddTest2 = [ddNs XMLString];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        [nsNs setStringValue:@\"robbiehanson.com\"];\n        [ddNs setStringValue:@\"robbiehanson.com\"];\n        \n        NSString *nsTest3 = [nsNs XMLString];\n        NSString *ddTest3 = [ddNs XMLString];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n    }}\n\n- (void)testNsLevel { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <root xmlns:a=\"apple.com\">\n        //   <node xmlns:d=\"deusty.com\" xmlns:rh=\"robbiehanson.com\"/>\n        // </root>\n        \n        NSXMLElement *nsRoot = [NSXMLElement elementWithName:@\"root\"];\n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"node\"];\n        NSXMLNode *nsNs0 = [NSXMLNode namespaceWithName:@\"a\" stringValue:@\"apple.com\"];\n        NSXMLNode *nsNs1 = [NSXMLNode namespaceWithName:@\"d\" stringValue:@\"deusty.com\"];\n        NSXMLNode *nsNs2 = [NSXMLNode namespaceWithName:@\"rh\" stringValue:@\"robbiehanson.com\"];\n        [nsNode addNamespace:nsNs1];\n        [nsNode addNamespace:nsNs2];\n        [nsRoot addNamespace:nsNs0];\n        [nsRoot addChild:nsNode];\n        \n        DDXMLElement *ddRoot = [DDXMLElement elementWithName:@\"root\"];\n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"node\"];\n        DDXMLNode *ddNs0 = [DDXMLNode namespaceWithName:@\"a\" stringValue:@\"apple.com\"];\n        DDXMLNode *ddNs1 = [DDXMLNode namespaceWithName:@\"d\" stringValue:@\"deusty.com\"];\n        DDXMLNode *ddNs2 = [DDXMLNode namespaceWithName:@\"rh\" stringValue:@\"robbiehanson.com\"];\n        [ddNode addNamespace:ddNs1];\n        [ddNode addNamespace:ddNs2];\n        [ddRoot addNamespace:ddNs0];\n        [ddRoot addChild:ddNode];\n        \n        XCTAssert([nsNs0 index] == [ddNs0 index], @\"Failed test 1\");\n        XCTAssert([nsNs1 index] == [ddNs1 index], @\"Failed test 2\");\n        XCTAssert([nsNs2 index] == [ddNs2 index], @\"Failed test 3\");\n        \n        XCTAssert([nsNs0 level] == [ddNs0 level], @\"Failed test 4\");\n        XCTAssert([nsNs1 level] == [ddNs1 level], @\"Failed test 5\");\n        XCTAssert([nsNs2 level] == [ddNs2 level], @\"Failed test 6\");\n    }}\n\n- (void)testNsURI { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"duck\" URI:@\"quack.com\"];\n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"duck\" URI:@\"quack.com\"];\n        \n        NSString *nsTest1 = [nsNode URI];\n        NSString *ddTest1 = [ddNode URI];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        [nsNode setURI:@\"food.com\"];\n        [ddNode setURI:@\"food.com\"];\n        \n        NSString *nsTest2 = [nsNode URI];\n        NSString *ddTest2 = [ddNode URI];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@\"duck\" URI:@\"quack.com\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@\"duck\" URI:@\"quack.com\" stringValue:@\"quack\"];\n        \n        NSString *nsTest3 = [nsAttr URI];\n        NSString *ddTest3 = [ddAttr URI];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        [nsAttr setURI:@\"food.com\"];\n        [ddAttr setURI:@\"food.com\"];\n        \n        NSString *nsTest4 = [nsAttr URI];\n        NSString *ddTest4 = [ddAttr URI];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n    }}\n\n- (void)testAddAttr { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *attrName  = @\"artist\";\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"song\"];\n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"song\"];\n        \n        // Test adding an attribute\n        \n        NSString *attrValue1 = @\"John Mayer\";\n        \n        NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:attrName stringValue:attrValue1];\n        DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:attrName stringValue:attrValue1];\n        \n        [nsNode addAttribute:nsAttr1];\n        [ddNode addAttribute:ddAttr1];\n        \n        NSString *nsAttrValue1 = [[nsNode attributeForName:attrName] stringValue];\n        NSString *ddAttrValue1 = [[ddNode attributeForName:attrName] stringValue];\n        \n        XCTAssert([nsAttrValue1 isEqualToString:attrValue1], @\"Failed CHECK 1\");\n        XCTAssert([ddAttrValue1 isEqualToString:attrValue1], @\"Failed test 1\");\n        \n        // Test replacing an attribute\n        \n        NSString *attrValue2 = @\"Paramore\";\n        \n        NSXMLNode *nsAttr2 = [NSXMLNode attributeWithName:attrName stringValue:attrValue2];\n        DDXMLNode *ddAttr2 = [DDXMLNode attributeWithName:attrName stringValue:attrValue2];\n        \n        [nsNode addAttribute:nsAttr2];\n        [ddNode addAttribute:ddAttr2];\n        \n        // The documentation for NSXMLElement's addAttribute: method says this:\n        //\n        // \"If the receiver already has an attribute with the same name, anAttribute is not added.\"\n        //\n        // However, this is NOT the case.\n        // If the receiver already has an attribute with the same name, the previous attribute is replaced.\n        //\n        // Considering the fact that the API does NOT contain a setAttribute method,\n        // I believe this should be the desired functionality.\n        //\n        // We match the functionality rather than the documentation.\n        \n        NSString *nsAttrValue2 = [[nsNode attributeForName:attrName] stringValue];\n        NSString *ddAttrValue2 = [[ddNode attributeForName:attrName] stringValue];\n        \n        XCTAssert([nsAttrValue2 isEqualToString:attrValue2], @\"Failed CHECK 2\");\n        XCTAssert([ddAttrValue2 isEqualToString:attrValue2], @\"Failed test 2\");\n        \n        // Test removing an attribute\n        \n        [nsNode removeAttributeForName:attrName];\n        [ddNode removeAttributeForName:attrName];\n        \n        XCTAssert([nsNode attributeForName:attrName] == nil, @\"Failed CHECK 3\");\n        XCTAssert([ddNode attributeForName:attrName] == nil, @\"Failed test 3\");\n        \n        // Test detaching an attribute\n        \n        NSString *attrValue3 = @\"Katy Perry\";\n        \n        NSXMLNode *nsAttr3 = [NSXMLNode attributeWithName:attrName stringValue:attrValue3];\n        DDXMLNode *ddAttr3 = [DDXMLNode attributeWithName:attrName stringValue:attrValue3];\n        \n        [nsNode addAttribute:nsAttr3];\n        [ddNode addAttribute:ddAttr3];\n        \n        NSString *nsAttrValue3 = [[nsNode attributeForName:attrName] stringValue];\n        NSString *ddAttrValue3 = [[ddNode attributeForName:attrName] stringValue];\n        \n        XCTAssert([nsAttrValue3 isEqualToString:attrValue3], @\"Failed CHECK 4\");\n        XCTAssert([ddAttrValue3 isEqualToString:attrValue3], @\"Failed test 4\");\n        \n        [nsAttr3 detach];\n        [ddAttr3 detach];\n        \n        XCTAssert([nsNode attributeForName:attrName] == nil, @\"Failed CHECK 5\");\n        XCTAssert([ddNode attributeForName:attrName] == nil, @\"Failed test 5\");\n        \n        // Test reattaching an attribute\n        \n        [nsNode addAttribute:nsAttr3];\n        [ddNode addAttribute:ddAttr3];\n        \n        nsAttrValue3 = [[nsNode attributeForName:attrName] stringValue];\n        ddAttrValue3 = [[ddNode attributeForName:attrName] stringValue];\n        \n        XCTAssert([nsAttrValue3 isEqualToString:attrValue3], @\"Failed CHECK 6\");\n        XCTAssert([ddAttrValue3 isEqualToString:attrValue3], @\"Failed test 6\");\n    }}\n\n- (void)testAttrGeneral { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@\"apple\" stringValue:@\"inc\"];\n        DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@\"apple\" stringValue:@\"inc\"];\n        \n        NSString *nsStr1 = [nsAttr XMLString];\n        NSString *ddStr1 = [ddAttr XMLString];\n        \n        XCTAssert([nsStr1 isEqualToString:ddStr1], @\"Failed test 1\");\n        \n        [nsAttr setName:@\"deusty\"];\n        [ddAttr setName:@\"deusty\"];\n        \n        NSString *nsStr2 = [nsAttr XMLString];\n        NSString *ddStr2 = [ddAttr XMLString];\n        \n        XCTAssert([nsStr2 isEqualToString:ddStr2], @\"Failed test 2\");\n        \n        [nsAttr setStringValue:@\"designs\"];\n        [ddAttr setStringValue:@\"designs\"];\n        \n        NSString *nsStr3 = [nsAttr XMLString];\n        NSString *ddStr3 = [ddAttr XMLString];\n        \n        XCTAssert([nsStr3 isEqualToString:ddStr3], @\"Failed test 3\");\n    }}\n\n- (void)testAttrSiblings { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <duck sound=\"quack\" swims=\"YES\" flys=\"YES\"/>\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"duck\"];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"sound\" stringValue:@\"quack\"]];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"swims\" stringValue:@\"YES\"]];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"flys\" stringValue:@\"YES\"]];\n        \n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"duck\"];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"sound\" stringValue:@\"quack\"]];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"swims\" stringValue:@\"YES\"]];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"flys\" stringValue:@\"YES\"]];\n        \n        NSXMLNode *nsAttr = [nsNode attributeForName:@\"swims\"];\n        DDXMLNode *ddAttr = [ddNode attributeForName:@\"swims\"];\n        \n        NSString *nsTest1 = [nsAttr XMLString];\n        NSString *ddTest1 = [ddAttr XMLString];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        //\tNSLog(@\"nsAttr prev: %@\", [[nsAttr previousSibling] XMLString]);  // nil\n        //\tNSLog(@\"nsAttr next: %@\", [[nsAttr nextSibling] XMLString]);      // nil\n        \n        //\tNSLog(@\"ddAttr prev: %@\", [[ddAttr previousSibling] XMLString]);  // sound=\"quack\"\n        //\tNSLog(@\"ddAttr next: %@\", [[ddAttr nextSibling] XMLString]);      // flys=\"YES\"\n        \n        //\tAnalysis: DDXML works and NSXML doesn't. I see no need to cripple DDXML because of that.\n        \n    }}\n\n- (void)testAttrDocOrder { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <duck sound=\"quack\" swims=\"YES\" flys=\"YES\"/>\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"duck\"];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"sound\" stringValue:@\"quack\"]];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"swims\" stringValue:@\"YES\"]];\n        [nsNode addAttribute:[NSXMLNode attributeWithName:@\"flys\" stringValue:@\"YES\"]];\n        \n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"duck\"];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"sound\" stringValue:@\"quack\"]];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"swims\" stringValue:@\"YES\"]];\n        [ddNode addAttribute:[DDXMLNode attributeWithName:@\"flys\" stringValue:@\"YES\"]];\n        \n        NSXMLNode *nsAttr = [nsNode attributeForName:@\"swims\"];\n        DDXMLNode *ddAttr = [ddNode attributeForName:@\"swims\"];\n        \n        NSXMLNode *nsTest1 = [nsAttr previousNode];\n        DDXMLNode *ddTest1 = [ddAttr previousNode];\n        \n        XCTAssert((!nsTest1 && !ddTest1), @\"Failed test 1\");\n        \n        NSXMLNode *nsTest2 = [nsAttr nextNode];\n        DDXMLNode *ddTest2 = [ddAttr nextNode];\n        \n        XCTAssert((!nsTest2 && !ddTest2), @\"Failed test 2\");\n        \n        // Notes: Attributes play no part in the document order.\n        \n    }}\n\n- (void)testAttrChildren { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:@\"deusty\" stringValue:@\"designs\"];\n        DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:@\"deusty\" stringValue:@\"designs\"];\n        \n        NSXMLNode *nsTest1 = [nsAttr1 childAtIndex:0];\n        DDXMLNode *ddTest1 = [ddAttr1 childAtIndex:0];\n        \n        XCTAssert((!nsTest1 && !ddTest1), @\"Failed test 1\");\n        \n        NSUInteger nsTest2 = [nsAttr1 childCount];\n        NSUInteger ddTest2 = [ddAttr1 childCount];\n        \n        XCTAssert((nsTest2 == ddTest2), @\"Failed test 2\");\n        \n        NSArray *nsTest3 = [nsAttr1 children];\n        NSArray *ddTest3 = [ddAttr1 children];\n        \n        XCTAssert((!nsTest3 && !ddTest3), @\"Failed test 3\");\n        \n        // Notes: Attributes aren't supposed to have children, although in libxml they technically do.\n        // The child is simply a pointer to a text node, which contains the attribute value.\n        \n    }}\n\n- (void)testString { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <pizza>\n        //   <toppings>\n        //     <pepperoni/>\n        //     <sausage>\n        //       <mild/>\n        //       <spicy/>\n        //     </sausage>\n        //   </toppings>\n        //   <crust>\n        //     <thin/>\n        //     <thick/>\n        //   </crust>\n        // </pizza>\n        \n        NSXMLElement *nsNode0 = [NSXMLElement elementWithName:@\"pizza\"];\n        NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@\"toppings\"];\n        NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@\"pepperoni\"];\n        NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@\"sausage\"];\n        NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@\"mild\"];\n        NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@\"spicy\"];\n        NSXMLElement *nsNode6 = [NSXMLElement elementWithName:@\"crust\"];\n        NSXMLElement *nsNode7 = [NSXMLElement elementWithName:@\"thin\"];\n        NSXMLElement *nsNode8 = [NSXMLElement elementWithName:@\"thick\"];\n        \n        [nsNode0 addChild:nsNode1];\n        [nsNode0 addChild:nsNode6];\n        [nsNode1 addChild:nsNode2];\n        [nsNode1 addChild:nsNode3];\n        [nsNode3 addChild:nsNode4];\n        [nsNode3 addChild:nsNode5];\n        [nsNode6 addChild:nsNode7];\n        [nsNode6 addChild:nsNode8];\n        \n        DDXMLElement *ddNode0 = [DDXMLElement elementWithName:@\"pizza\"];\n        DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@\"toppings\"];\n        DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@\"pepperoni\"];\n        DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@\"sausage\"];\n        DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@\"mild\"];\n        DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@\"spicy\"];\n        DDXMLElement *ddNode6 = [DDXMLElement elementWithName:@\"crust\"];\n        DDXMLElement *ddNode7 = [DDXMLElement elementWithName:@\"thin\"];\n        DDXMLElement *ddNode8 = [DDXMLElement elementWithName:@\"thick\"];\n        \n        [ddNode0 addChild:ddNode1];\n        [ddNode0 addChild:ddNode6];\n        [ddNode1 addChild:ddNode2];\n        [ddNode1 addChild:ddNode3];\n        [ddNode3 addChild:ddNode4];\n        [ddNode3 addChild:ddNode5];\n        [ddNode6 addChild:ddNode7];\n        [ddNode6 addChild:ddNode8];\n        \n        NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:@\"price\" stringValue:@\"1.00\"];\n        DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:@\"price\" stringValue:@\"1.00\"];\n        \n        [nsNode1 addAttribute:nsAttr1];\n        [ddNode1 addAttribute:ddAttr1];\n        \n        [nsNode4 setStringValue:@\"<just right>\"];\n        [ddNode4 setStringValue:@\"<just right>\"];\n        \n        [nsNode5 setStringValue:@\"too hot\"];\n        [ddNode5 setStringValue:@\"too hot\"];\n        \n        NSString *nsTest1 = [nsNode0 stringValue];  // Returns \"<just right>too hot\"\n        NSString *ddTest1 = [ddNode0 stringValue];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        NSString *nsTest2 = [nsAttr1 stringValue];  // Returns \"1.00\"\n        NSString *ddTest2 = [ddAttr1 stringValue];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        [nsAttr1 setStringValue:@\"1.25\"];\n        [ddAttr1 setStringValue:@\"1.25\"];\n        \n        NSString *nsTest3 = [nsAttr1 stringValue];  // Returns \"1.25\"\n        NSString *ddTest3 = [ddAttr1 stringValue];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        [nsNode0 setStringValue:@\"<wtf>ESCAPE</wtf>\"];\n        [ddNode0 setStringValue:@\"<wtf>ESCAPE</wtf>\"];\n        \n        NSString *nsTest4 = [nsNode0 stringValue];  // Returns \"<wtf>ESCAPE</wtf>\"\n        NSString *ddTest4 = [ddNode0 stringValue];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n        \n        //\tNSString *nsTest5 = [nsNode0 XMLString];  // Returns \"<pizza>&lt;wtf>ESCAPE&lt;/wtf></pizza>\"\n        //\tNSString *ddTest5 = [ddNode0 XMLString];  // Returns \"<pizza>&lt;wtf&gt;ESCAPE&lt;/wtf&gt;</pizza>\"\n        //\n        //\tNSAssert2([nsTest5 isEqualToString:ddTest5], @\"Failed test 5 - ns(%@) dd(%@)\", nsTest5, ddTest5);\n        //\n        //  The DDXML version is actually more accurate, so we'll accept the difference.\n        \n    }}\n\n- (void)testChildren { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<beers>            \"];\n        [xmlStr appendString:@\"  <sam_adams/>     \"];\n        [xmlStr appendString:@\"  <left_hand/>     \"];\n        [xmlStr appendString:@\"  <goose_island/>  \"];\n        [xmlStr appendString:@\" <!-- budweiser -->\"];\n        [xmlStr appendString:@\"</beers>           \"];\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        NSUInteger nsChildCount = [[nsDoc rootElement] childCount];\n        NSUInteger ddChildCount = [[ddDoc rootElement] childCount];\n        \n        XCTAssert(nsChildCount == ddChildCount, @\"Failed test 1\");\n        \n        NSArray *nsChildren = [[nsDoc rootElement] children];\n        NSArray *ddChildren = [[ddDoc rootElement] children];\n        \n        XCTAssert([nsChildren count] == [ddChildren count], @\"Failed test 2\");\n        \n        NSString *nsBeer = [[[nsDoc rootElement] childAtIndex:1] name];\n        NSString *ddBeer = [[[ddDoc rootElement] childAtIndex:1] name];\n        \n        XCTAssert([nsBeer isEqualToString:ddBeer], @\"Failed test 3\");\n    }}\n\n- (void)testPreviousNextNode1 { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <pizza>\n        //   <toppings>\n        //     <pepperoni/>\n        //     <sausage>\n        //       <mild/>\n        //       <spicy/>\n        //     </sausage>\n        //   </toppings>\n        //   <crust>\n        //     <thin/>\n        //     <thick/>\n        //   </crust>\n        // </pizza>\n        \n        NSXMLElement *nsNode0 = [NSXMLElement elementWithName:@\"pizza\"];\n        NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@\"toppings\"];\n        NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@\"pepperoni\"];\n        NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@\"sausage\"];\n        NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@\"mild\"];\n        NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@\"spicy\"];\n        NSXMLElement *nsNode6 = [NSXMLElement elementWithName:@\"crust\"];\n        NSXMLElement *nsNode7 = [NSXMLElement elementWithName:@\"thin\"];\n        NSXMLElement *nsNode8 = [NSXMLElement elementWithName:@\"thick\"];\n        \n        [nsNode0 addChild:nsNode1];\n        [nsNode0 addChild:nsNode6];\n        [nsNode1 addChild:nsNode2];\n        [nsNode1 addChild:nsNode3];\n        [nsNode3 addChild:nsNode4];\n        [nsNode3 addChild:nsNode5];\n        [nsNode6 addChild:nsNode7];\n        [nsNode6 addChild:nsNode8];\n        \n        DDXMLElement *ddNode0 = [DDXMLElement elementWithName:@\"pizza\"];\n        DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@\"toppings\"];\n        DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@\"pepperoni\"];\n        DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@\"sausage\"];\n        DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@\"mild\"];\n        DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@\"spicy\"];\n        DDXMLElement *ddNode6 = [DDXMLElement elementWithName:@\"crust\"];\n        DDXMLElement *ddNode7 = [DDXMLElement elementWithName:@\"thin\"];\n        DDXMLElement *ddNode8 = [DDXMLElement elementWithName:@\"thick\"];\n        \n        [ddNode0 addChild:ddNode1];\n        [ddNode0 addChild:ddNode6];\n        [ddNode1 addChild:ddNode2];\n        [ddNode1 addChild:ddNode3];\n        [ddNode3 addChild:ddNode4];\n        [ddNode3 addChild:ddNode5];\n        [ddNode6 addChild:ddNode7];\n        [ddNode6 addChild:ddNode8];\n        \n        NSString *nsTest1 = [[nsNode2 nextNode] name];\n        NSString *ddTest1 = [[ddNode2 nextNode] name];\n        \n        NSAssert2([nsTest1 isEqualToString:ddTest1], @\"Failed test 1: ns(%@) dd(%@)\", nsTest1, ddTest1);\n        \n        NSString *nsTest2 = [[nsNode3 nextNode] name];\n        NSString *ddTest2 = [[ddNode3 nextNode] name];\n        \n        NSAssert2([nsTest2 isEqualToString:ddTest2], @\"Failed test 2: ns(%@) dd(%@)\", nsTest2, ddTest2);\n        \n        NSString *nsTest3 = [[nsNode5 nextNode] name];\n        NSString *ddTest3 = [[ddNode5 nextNode] name];\n        \n        NSAssert2([nsTest3 isEqualToString:ddTest3], @\"Failed test 3: ns(%@) dd(%@)\", nsTest3, ddTest3);\n        \n        NSString *nsTest4 = [[nsNode5 previousNode] name];\n        NSString *ddTest4 = [[ddNode5 previousNode] name];\n        \n        NSAssert2([nsTest4 isEqualToString:ddTest4], @\"Failed test 4: ns(%@) dd(%@)\", nsTest4, ddTest4);\n        \n        NSString *nsTest5 = [[nsNode6 previousNode] name];\n        NSString *ddTest5 = [[ddNode6 previousNode] name];\n        \n        NSAssert2([nsTest5 isEqualToString:ddTest5], @\"Failed test 5: ns(%@) dd(%@)\", nsTest5, ddTest5);\n        \n        NSString *nsTest6 = [[nsNode8 nextNode] name];\n        NSString *ddTest6 = [[ddNode8 nextNode] name];\n        \n        NSAssert2((!nsTest6 && !ddTest6), @\"Failed test 6: ns(%@) dd(%@)\", nsTest6, ddTest6);\n        \n        NSString *nsTest7 = [[nsNode0 previousNode] name];\n        NSString *ddTest7 = [[ddNode0 previousNode] name];\n        \n        NSAssert2((!nsTest7 && !ddTest7), @\"Failed test 7: ns(%@) dd(%@)\", nsTest7, ddTest7);\n    }}\n\n- (void)testPreviousNextNode2 { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<pizza>         \"];\n        [xmlStr appendString:@\"  <toppings>    \"];\n        [xmlStr appendString:@\"    <pepperoni/>\"];\n        [xmlStr appendString:@\"    <sausage>   \"];\n        [xmlStr appendString:@\"      <mild/>   \"];\n        [xmlStr appendString:@\"      <spicy/>  \"];\n        [xmlStr appendString:@\"    </sausage>  \"];\n        [xmlStr appendString:@\"  </toppings>   \"];\n        [xmlStr appendString:@\"  <crust>       \"];\n        [xmlStr appendString:@\"    <thin/>     \"];\n        [xmlStr appendString:@\"    <thick/>    \"];\n        [xmlStr appendString:@\"  </crust>      \"];\n        [xmlStr appendString:@\"</pizza>        \"];\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        NSXMLNode *nsNode0 = [nsDoc rootElement]; // pizza\n        DDXMLNode *ddNode0 = [ddDoc rootElement]; // pizza\n        \n        NSXMLNode *nsNode2 = [[[nsDoc rootElement] childAtIndex:0] childAtIndex:0]; // pepperoni\n        DDXMLNode *ddNode2 = [[[ddDoc rootElement] childAtIndex:0] childAtIndex:0]; // pepperoni\n        \n        NSXMLNode *nsNode3 = [[[nsDoc rootElement] childAtIndex:0] childAtIndex:1]; // sausage\n        DDXMLNode *ddNode3 = [[[ddDoc rootElement] childAtIndex:0] childAtIndex:1]; // sausage\n        \n        NSXMLNode *nsNode5 = [[[[nsDoc rootElement] childAtIndex:0] childAtIndex:1] childAtIndex:1]; // spicy\n        DDXMLNode *ddNode5 = [[[[ddDoc rootElement] childAtIndex:0] childAtIndex:1] childAtIndex:1]; // spicy\n        \n        NSXMLNode *nsNode6 = [[nsDoc rootElement] childAtIndex:1]; // crust\n        DDXMLNode *ddNode6 = [[ddDoc rootElement] childAtIndex:1]; // crust\n        \n        NSXMLNode *nsNode8 = [[[nsDoc rootElement] childAtIndex:1] childAtIndex:1]; // crust\n        DDXMLNode *ddNode8 = [[[ddDoc rootElement] childAtIndex:1] childAtIndex:1]; // crust\n        \n        NSString *nsTest1 = [[nsNode2 nextNode] name];\n        NSString *ddTest1 = [[ddNode2 nextNode] name];\n        \n        NSAssert2([nsTest1 isEqualToString:ddTest1], @\"Failed test 1: ns(%@) dd(%@)\", nsTest1, ddTest1);\n        \n        NSString *nsTest2 = [[nsNode3 nextNode] name];\n        NSString *ddTest2 = [[ddNode3 nextNode] name];\n        \n        NSAssert2([nsTest2 isEqualToString:ddTest2], @\"Failed test 2: ns(%@) dd(%@)\", nsTest2, ddTest2);\n        \n        NSString *nsTest3 = [[nsNode5 nextNode] name];\n        NSString *ddTest3 = [[ddNode5 nextNode] name];\n        \n        NSAssert2([nsTest3 isEqualToString:ddTest3], @\"Failed test 3: ns(%@) dd(%@)\", nsTest3, ddTest3);\n        \n        NSString *nsTest4 = [[nsNode5 previousNode] name];\n        NSString *ddTest4 = [[ddNode5 previousNode] name];\n        \n        NSAssert2([nsTest4 isEqualToString:ddTest4], @\"Failed test 4: ns(%@) dd(%@)\", nsTest4, ddTest4);\n        \n        NSString *nsTest5 = [[nsNode6 previousNode] name];\n        NSString *ddTest5 = [[ddNode6 previousNode] name];\n        \n        NSAssert2([nsTest5 isEqualToString:ddTest5], @\"Failed test 5: ns(%@) dd(%@)\", nsTest5, ddTest5);\n        \n        NSString *nsTest6 = [[nsNode8 nextNode] name];\n        NSString *ddTest6 = [[ddNode8 nextNode] name];\n        \n        NSAssert2((!nsTest6 && !ddTest6), @\"Failed test 6: ns(%@) dd(%@)\", nsTest6, ddTest6);\n        \n        NSString *nsTest7 = [[nsNode0 previousNode] name];\n        NSString *ddTest7 = [[ddNode0 previousNode] name];\n        \n        NSAssert2((!nsTest7 && !ddTest7), @\"Failed test 7: ns(%@) dd(%@)\", nsTest7, ddTest7);\n    }}\n\n- (void)testPrefix { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <root xmlns:a=\"beagle\" xmlns:b=\"lab\">\n        //   <dog/>\n        //   <a:dog/>\n        //   <a:b:dog/>\n        //   <dog xmlns=\"beagle\"/>\n        // </root>\n        \n        NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@\"dog\"];\n        NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@\"a:dog\"];\n        NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@\"a:b:dog\"];\n        NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@\"dog\" URI:@\"beagle\"];\n        \n        DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@\"dog\"];\n        DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@\"a:dog\"];\n        DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@\"a:b:dog\"];\n        DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@\"dog\" URI:@\"beagle\"];\n        \n        NSString *nsTest1 = [nsNode1 prefix];\n        NSString *ddTest1 = [ddNode1 prefix];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        NSString *nsTest2 = [nsNode2 prefix];\n        NSString *ddTest2 = [ddNode2 prefix];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        NSString *nsTest3 = [nsNode3 prefix];\n        NSString *ddTest3 = [ddNode3 prefix];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        NSString *nsTest4 = [nsNode4 prefix];\n        NSString *ddTest4 = [ddNode4 prefix];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n    }}\n\n- (void)testURI { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <root xmlns:a=\"deusty.com\" xmlns:b=\"robbiehanson.com\">\n        //     <test test=\"1\"/>\n        //     <a:test test=\"2\"/>\n        //     <b:test test=\"3\"/>\n        //     <test xmlns=\"deusty.com\" test=\"4\"/>\n        //     <test xmlns=\"quack.com\" test=\"5\"/>\n        // </root>\n        \n        NSXMLElement *nsRoot = [NSXMLElement elementWithName:@\"root\"];\n        [nsRoot addNamespace:[NSXMLNode namespaceWithName:@\"a\" stringValue:@\"deusty.com\"]];\n        [nsRoot addNamespace:[NSXMLNode namespaceWithName:@\"b\" stringValue:@\"robbiehanson.com\"]];\n        \n        NSXMLElement *nsNode1 = [NSXMLElement elementWithName:@\"test\"];\n        [nsNode1 addAttribute:[NSXMLNode attributeWithName:@\"test\" stringValue:@\"1\"]];\n        \n        NSXMLElement *nsNode2 = [NSXMLElement elementWithName:@\"a:test\"];\n        [nsNode2 addAttribute:[NSXMLNode attributeWithName:@\"test\" stringValue:@\"2\"]];\n        \n        NSXMLElement *nsNode3 = [NSXMLElement elementWithName:@\"b:test\"];\n        [nsNode3 addAttribute:[NSXMLNode attributeWithName:@\"test\" stringValue:@\"3\"]];\n        \n        NSXMLElement *nsNode4 = [NSXMLElement elementWithName:@\"test\" URI:@\"deusty.com\"];\n        [nsNode4 addAttribute:[NSXMLNode attributeWithName:@\"test\" stringValue:@\"4\"]];\n        \n        NSXMLElement *nsNode5 = [NSXMLElement elementWithName:@\"test\" URI:@\"quack.com\"];\n        [nsNode5 addAttribute:[NSXMLNode attributeWithName:@\"test\" stringValue:@\"5\"]];\n        \n        [nsRoot addChild:nsNode1];\n        [nsRoot addChild:nsNode2];\n        [nsRoot addChild:nsNode3];\n        [nsRoot addChild:nsNode4];\n        [nsRoot addChild:nsNode5];\n        \n        DDXMLElement *ddRoot = [DDXMLElement elementWithName:@\"root\"];\n        [ddRoot addNamespace:[DDXMLNode namespaceWithName:@\"a\" stringValue:@\"deusty.com\"]];\n        [ddRoot addNamespace:[DDXMLNode namespaceWithName:@\"b\" stringValue:@\"robbiehanson.com\"]];\n        \n        DDXMLElement *ddNode1 = [DDXMLElement elementWithName:@\"test\"];\n        [ddNode1 addAttribute:[DDXMLNode attributeWithName:@\"test\" stringValue:@\"1\"]];\n        \n        DDXMLElement *ddNode2 = [DDXMLElement elementWithName:@\"a:test\"];\n        [ddNode2 addAttribute:[DDXMLNode attributeWithName:@\"test\" stringValue:@\"2\"]];\n        \n        DDXMLElement *ddNode3 = [DDXMLElement elementWithName:@\"b:test\"];\n        [ddNode3 addAttribute:[DDXMLNode attributeWithName:@\"test\" stringValue:@\"3\"]];\n        \n        DDXMLElement *ddNode4 = [DDXMLElement elementWithName:@\"test\" URI:@\"deusty.com\"];\n        [ddNode4 addAttribute:[DDXMLNode attributeWithName:@\"test\" stringValue:@\"4\"]];\n        \n        DDXMLElement *ddNode5 = [DDXMLElement elementWithName:@\"test\" URI:@\"quack.com\"];\n        [ddNode5 addAttribute:[DDXMLNode attributeWithName:@\"test\" stringValue:@\"5\"]];\n        \n        [ddRoot addChild:ddNode1];\n        [ddRoot addChild:ddNode2];\n        [ddRoot addChild:ddNode3];\n        [ddRoot addChild:ddNode4];\n        [ddRoot addChild:ddNode5];\n        \n        NSString *nsTest1 = [[nsNode1 resolveNamespaceForName:[nsNode1 name]] stringValue];\n        NSString *ddTest1 = [[ddNode1 resolveNamespaceForName:[ddNode1 name]] stringValue];\n        \n        XCTAssert(!nsTest1 && !ddTest1, @\"Failed test 1\");\n        \n        NSString *nsTest2 = [[nsNode2 resolveNamespaceForName:[nsNode2 name]] stringValue];\n        NSString *ddTest2 = [[ddNode2 resolveNamespaceForName:[ddNode2 name]] stringValue];\n        \n        NSAssert2([nsTest2 isEqualToString:ddTest2], @\"Failed test 2: ns(%@) dd(%@)\", nsTest2, ddTest2);\n        \n        NSString *nsTest3 = [[nsNode3 resolveNamespaceForName:[nsNode3 name]] stringValue];\n        NSString *ddTest3 = [[ddNode3 resolveNamespaceForName:[ddNode3 name]] stringValue];\n        \n        XCTAssert([nsTest3 isEqualToString:ddTest3], @\"Failed test 3\");\n        \n        NSString *nsTest4 = [[nsNode4 resolveNamespaceForName:[nsNode4 name]] stringValue];\n        NSString *ddTest4 = [[ddNode4 resolveNamespaceForName:[ddNode4 name]] stringValue];\n        \n        NSAssert2(!nsTest4 && !ddTest4, @\"Failed test 4: ns(%@) dd(%@)\", nsTest4, ddTest4);\n        \n        NSString *nsTest5 = [nsNode4 resolvePrefixForNamespaceURI:@\"deusty.com\"];\n        NSString *ddTest5 = [ddNode4 resolvePrefixForNamespaceURI:@\"deusty.com\"];\n        \n        NSAssert2([nsTest5 isEqualToString:ddTest5], @\"Failed test 5: ns(%@) dd(%@)\", nsTest5, ddTest5);\n        \n        NSString *nsTest6 = [nsNode4 resolvePrefixForNamespaceURI:@\"robbiehanson.com\"];\n        NSString *ddTest6 = [ddNode4 resolvePrefixForNamespaceURI:@\"robbiehanson.com\"];\n        \n        XCTAssert([nsTest6 isEqualToString:ddTest6], @\"Failed test 6\");\n        \n        NSString *nsTest7 = [nsNode4 resolvePrefixForNamespaceURI:@\"quack.com\"];\n        NSString *ddTest7 = [ddNode4 resolvePrefixForNamespaceURI:@\"quack.com\"];\n        \n        XCTAssert(!nsTest7 && !ddTest7, @\"Failed test 7\");\n        \n        NSString *nsTest8 = [nsNode4 resolvePrefixForNamespaceURI:@\"\"];\n        NSString *ddTest8 = [ddNode4 resolvePrefixForNamespaceURI:@\"\"];\n        \n        XCTAssert(!nsTest8 && !ddTest8, @\"Failed test 8\");\n        \n        NSUInteger nsTest9  = [[nsRoot elementsForName:@\"test\"] count];  // Returns test1, test4, test5\n        NSUInteger ddTest9  = [[ddRoot elementsForName:@\"test\"] count];  // Returns test1, test4, test5\n        \n        XCTAssert(nsTest9 == ddTest9, @\"Failed test 9\");\n        \n        NSUInteger nsTest10 = [[nsRoot elementsForName:@\"a:test\"] count];  // Returns node2 and node4\n        NSUInteger ddTest10 = [[ddRoot elementsForName:@\"a:test\"] count];  // Returns node2 and node4\n        \n        XCTAssert(nsTest10 == ddTest10, @\"Failed test 10\");\n        \n        NSUInteger nsTest11 = [[nsRoot elementsForLocalName:@\"test\" URI:@\"deusty.com\"] count];  // Returns node2 and node4\n        NSUInteger ddTest11 = [[ddRoot elementsForLocalName:@\"test\" URI:@\"deusty.com\"] count];  // Returns node2 and node4\n        \n        XCTAssert(nsTest11 == ddTest11, @\"Failed test 11\");\n        \n        NSUInteger nsTest12 = [[nsRoot elementsForLocalName:@\"a:test\" URI:@\"deusty.com\"] count];  // Returns nothing\n        NSUInteger ddTest12 = [[ddRoot elementsForLocalName:@\"a:test\" URI:@\"deusty.com\"] count];  // Returns nothing\n        \n        XCTAssert(nsTest12 == ddTest12, @\"Failed test 12\");\n        \n        NSUInteger nsTest13 = [[nsRoot elementsForLocalName:@\"test\" URI:@\"quack.com\"] count];  // Returns node5\n        NSUInteger ddTest13 = [[ddRoot elementsForLocalName:@\"test\" URI:@\"quack.com\"] count];  // Returns node5\n        \n        XCTAssert(nsTest13 == ddTest13, @\"Failed test 13\");\n    }}\n\n- (void)testXmlns { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *parseMe = @\"<query xmlns=\\\"jabber:iq:roster\\\"></query>\";\n        NSData *data = [parseMe dataUsingEncoding:NSUTF8StringEncoding];\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithData:data options:0 error:nil];\n        NSXMLElement *nsRootElement = [nsDoc rootElement];\n        \n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithData:data options:0 error:nil];\n        DDXMLElement *ddRootElement = [ddDoc rootElement];\n        \n        // Both URI and namespaceForPrefix:@\"\" should return \"jabber:iq:roster\"\n        \n        NSString *nsTest1 = [nsRootElement URI];\n        NSString *ddTest1 = [ddRootElement URI];\n        \n        XCTAssert([nsTest1 isEqualToString:ddTest1], @\"Failed test 1\");\n        \n        NSString *nsTest2 = [[nsRootElement namespaceForPrefix:@\"\"] stringValue];\n        NSString *ddTest2 = [[ddRootElement namespaceForPrefix:@\"\"] stringValue];\n        \n        XCTAssert([nsTest2 isEqualToString:ddTest2], @\"Failed test 2\");\n        \n        // In NSXML namespaceForPrefix:nil returns nil\n        // In DDXML namespaceForPrefix:nil returns the same as namespaceForPrefix:@\"\"\n        //\n        // This actually makes more sense, as many users would consider a prefix of nil or an empty string to be the same.\n        // Plus many XML documents state that a prefix of nil or \"\" should be treated equally.\n        //\n        // This difference comes into play in other areas.\n        //\n        // In NSXML creating a namespace with prefix:nil doesn't work.\n        // In DDXML creating a namespace with prefix:nil acts as if you had passed an empty string.\n        \n        NSUInteger nsTest3 = [[nsRootElement namespaces] count];\n        NSUInteger ddTest3 = [[ddRootElement namespaces] count];\n        \n        XCTAssert(nsTest3 == ddTest3, @\"Failed test 3\");\n        \n        // An odd quirk of NSXML is that if the data is parsed, then the namespaces array contains the default namespace.\n        // However, if the XML tree is generated in code, and the default namespace was set via setting the URI,\n        // then the namespaces array doesn't contain that default namespace.\n        // If instead the addNamespace method is used to add the default namespace, then it is contained in the array,\n        // and the URI is also properly set.\n        //\n        // I consider this to be a bug in NSXML.\n        \n        NSString *nsTest4 = [[nsRootElement resolveNamespaceForName:@\"\"] stringValue];\n        NSString *ddTest4 = [[ddRootElement resolveNamespaceForName:@\"\"] stringValue];\n        \n        XCTAssert([nsTest4 isEqualToString:ddTest4], @\"Failed test 4\");\n        \n        // Oddly enough, even though NSXML seems completely resistant to nil namespace prefixes, this works fine\n        NSString *nsTest5 = [[nsRootElement resolveNamespaceForName:@\"\"] stringValue];\n        NSString *ddTest5 = [[ddRootElement resolveNamespaceForName:@\"\"] stringValue];\n        \n        XCTAssert([nsTest5 isEqualToString:ddTest5], @\"Failed test 5\");\n        \n        NSXMLElement *nsNode = [NSXMLElement elementWithName:@\"query\"];\n        [nsNode addNamespace:[NSXMLNode namespaceWithName:@\"\" stringValue:@\"jabber:iq:auth\"]];\n        \n        DDXMLElement *ddNode = [DDXMLElement elementWithName:@\"query\"];\n        [ddNode addNamespace:[DDXMLNode namespaceWithName:@\"\" stringValue:@\"jabber:iq:auth\"]];\n        \n        NSString *nsTest6 = [[nsNode resolveNamespaceForName:@\"\"] stringValue];\n        NSString *ddTest6 = [[ddNode resolveNamespaceForName:@\"\"] stringValue];\n        \n        XCTAssert([nsTest6 isEqualToString:ddTest6], @\"Failed test 6\");\n        \n        NSString *nsTest7 = [[nsNode resolveNamespaceForName:@\"\"] stringValue];\n        NSString *ddTest7 = [[ddNode resolveNamespaceForName:@\"\"] stringValue];\n        \n        XCTAssert([nsTest7 isEqualToString:ddTest7], @\"Failed test 7\");\n        \n        NSString *nsTest8 = [nsNode URI];\n        NSString *ddTest8 = [ddNode URI];\n        \n        XCTAssert([nsTest8 isEqualToString:ddTest8], @\"Failed test 8\");\n        \n        NSUInteger nsTest9 = [[nsNode namespaces] count];\n        NSUInteger ddTest9 = [[ddNode namespaces] count];\n        \n        XCTAssert(nsTest9 == ddTest9, @\"Failed test 9\");\n    }}\n\n- (void)testCopy { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <parent>\n        //   <child age=\"4\">Billy</child>\n        // </parent>\n        \n        NSString *xmlStr = @\"<parent><child age=\\\"4\\\">Billy</child></parent>\";\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        // Test Document copy\n        \n        NSXMLDocument *nsDocCopy = [nsDoc copy];\n        [[nsDocCopy rootElement] addAttribute:[NSXMLNode attributeWithName:@\"type\" stringValue:@\"mom\"]];\n        \n        NSXMLNode *nsDocAttr = [[nsDoc rootElement] attributeForName:@\"type\"];\n        NSXMLNode *nsDocCopyAttr = [[nsDocCopy rootElement] attributeForName:@\"type\"];\n        \n        XCTAssert(nsDocAttr == nil, @\"Failed CHECK 1\");\n        XCTAssert(nsDocCopyAttr != nil, @\"Failed CHECK 2\");\n        \n        DDXMLDocument *ddDocCopy = [ddDoc copy];\n        [[ddDocCopy rootElement] addAttribute:[DDXMLNode attributeWithName:@\"type\" stringValue:@\"mom\"]];\n        \n        DDXMLNode *ddDocAttr = [[ddDoc rootElement] attributeForName:@\"type\"];\n        DDXMLNode *ddDocCopyAttr = [[ddDocCopy rootElement] attributeForName:@\"type\"];\n        \n        XCTAssert(ddDocAttr == nil, @\"Failed test 1\");\n        XCTAssert(ddDocCopyAttr != nil, @\"Failed test 2\");\n        \n        // Test Element copy\n        \n        NSXMLElement *nsElement = [[[nsDoc rootElement] elementsForName:@\"child\"] objectAtIndex:0];\n        NSXMLElement *nsElementCopy = [nsElement copy];\n        \n        XCTAssert([nsElement parent] != nil, @\"Failed CHECK 3\");\n        XCTAssert([nsElementCopy parent] == nil, @\"Failed CHECK 4\");\n        \n        [nsElementCopy addAttribute:[NSXMLNode attributeWithName:@\"type\" stringValue:@\"son\"]];\n        \n        NSXMLNode *nsElementAttr = [nsElement attributeForName:@\"type\"];\n        NSXMLNode *nsElementCopyAttr = [nsElementCopy attributeForName:@\"type\"];\n        \n        XCTAssert(nsElementAttr == nil, @\"Failed CHECK 5\");\n        XCTAssert(nsElementCopyAttr != nil, @\"Failed CHECK 6\");\n        \n        DDXMLElement *ddElement = [[[ddDoc rootElement] elementsForName:@\"child\"] objectAtIndex:0];\n        DDXMLElement *ddElementCopy = [ddElement copy];\n        \n        XCTAssert([nsElement parent] != nil, @\"Failed test 3\");\n        XCTAssert([nsElementCopy parent] == nil, @\"Failed test 4\");\n        \n        [ddElementCopy addAttribute:[DDXMLNode attributeWithName:@\"type\" stringValue:@\"son\"]];\n        \n        DDXMLNode *ddElementAttr = [ddElement attributeForName:@\"type\"];\n        DDXMLNode *ddElementCopyAttr = [ddElementCopy attributeForName:@\"type\"];\n        \n        XCTAssert(ddElementAttr == nil, @\"Failed test 5\");\n        XCTAssert(ddElementCopyAttr != nil, @\"Failed test 6\");\n        \n        // Test Node copy\n        \n        NSXMLNode *nsAttr = [nsElement attributeForName:@\"age\"];\n        NSXMLNode *nsAttrCopy = [nsAttr copy];\n        \n        XCTAssert([nsAttr parent] != nil, @\"Failed CHECK 7\");\n        XCTAssert([nsAttrCopy parent] == nil, @\"Failed CHECK 8\");\n        \n        [nsAttrCopy setStringValue:@\"5\"];\n        \n        NSString *nsAttrValue = [nsAttr stringValue];\n        NSString *nsAttrCopyValue = [nsAttrCopy stringValue];\n        \n        XCTAssert([nsAttrValue isEqualToString:@\"4\"], @\"Failed CHECK 9\");\n        XCTAssert([nsAttrCopyValue isEqualToString:@\"5\"], @\"Failed CHECK 10\");\n        \n        DDXMLNode *ddAttr = [ddElement attributeForName:@\"age\"];\n        DDXMLNode *ddAttrCopy = [ddAttr copy];\n        \n        XCTAssert([ddAttr parent] != nil, @\"Failed test 7\");\n        XCTAssert([ddAttrCopy parent] == nil, @\"Failed test 8\");\n        \n        [ddAttrCopy setStringValue:@\"5\"];\n        \n        NSString *ddAttrValue = [ddAttr stringValue];\n        NSString *ddAttrCopyValue = [ddAttrCopy stringValue];\n        \n        XCTAssert([ddAttrValue isEqualToString:@\"4\"], @\"Failed test 9\");\n        XCTAssert([ddAttrCopyValue isEqualToString:@\"5\"], @\"Failed test 10\");\n    }}\n\n- (void)testCData { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <?xml version=\"1.0\"?>\n        // <request>\n        //   <category>\n        //     <name><![CDATA[asdfdsfafasdfsf]]></name>\n        //     <type><![CDATA[post]]></type>\n        //   </category>\n        // </request>\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<request>\"];\n        [xmlStr appendString:@\"  <category>\"];\n        [xmlStr appendString:@\"    <name><![CDATA[asdfdsfafasdfsf]]></name>\"];\n        [xmlStr appendString:@\"    <type><![CDATA[post]]></type>\"];\n        [xmlStr appendString:@\"  </category>\"];\n        [xmlStr appendString:@\"</request>\"];\n        \n        NSError *nsErr = nil;\n        NSError *ddErr = nil;\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:&nsErr];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:&ddErr];\n        \n        XCTAssert(nsDoc != nil, @\"Failed CHECK 1: %@\", nsErr);\n        XCTAssert(ddDoc != nil, @\"Failed test 1: %@\", ddErr);\n    }}\n\n- (void)testElements { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<request>\"];\n        [xmlStr appendString:@\"  <category>\"];\n        [xmlStr appendString:@\"    <name>Jojo</name>\"];\n        [xmlStr appendString:@\"    <type>Mama</type>\"];\n        [xmlStr appendString:@\"  </category>\"];\n        [xmlStr appendString:@\"</request>\"];\n        \n        NSArray *children = nil;\n        int i = 0;\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        children = [[nsDoc rootElement] children];\n        for(i = 0; i < [children count]; i++)\n        {\n            NSXMLNode *child = [children objectAtIndex:i];\n            \n            if([child kind] == NSXMLElementKind)\n            {\n                XCTAssert([child isMemberOfClass:[NSXMLElement class]], @\"Failed CHECK 1\");\n            }\n        }\n        \n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        children = [[ddDoc rootElement] children];\n        for(i = 0; i < [children count]; i++)\n        {\n            DDXMLNode *child = [children objectAtIndex:i];\n            \n            if([child kind] == DDXMLElementKind)\n            {\n                XCTAssert([child isMemberOfClass:[DDXMLElement class]], @\"Failed test 1\");\n            }\n        }\n    }}\n\n- (void)testXPath { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<menu xmlns=\\\"food.com\\\" xmlns:a=\\\"deusty.com\\\">\"];\n        [xmlStr appendString:@\"  <salad>\"];\n        [xmlStr appendString:@\"    <name>Ceasar</name>\"];\n        [xmlStr appendString:@\"    <price>1.99</price>\"];\n        [xmlStr appendString:@\"  </salad>\"];\n        [xmlStr appendString:@\"  <pizza>\"];\n        [xmlStr appendString:@\"    <name>Supreme</name>\"];\n        [xmlStr appendString:@\"    <price>9.99</price>\"];\n        [xmlStr appendString:@\"  </pizza>\"];\n        [xmlStr appendString:@\"  <pizza>\"];\n        [xmlStr appendString:@\"    <name>Three Cheese</name>\"];\n        [xmlStr appendString:@\"    <price>7.99</price>\"];\n        [xmlStr appendString:@\"  </pizza>\"];\n        [xmlStr appendString:@\"  <beer tap=\\\"yes\\\"/>\"];\n        [xmlStr appendString:@\"</menu>\"];\n        \n        int i = 0;\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        NSXMLElement *nsMenu = [nsDoc rootElement];\n        DDXMLElement *ddMenu = [ddDoc rootElement];\n        \n        NSString *nsDocXPath = [nsDoc XPath]; // empty string\n        NSString *ddDocXPath = [ddDoc XPath]; // empty string\n        \n        XCTAssert([nsDocXPath isEqualToString:ddDocXPath], @\"Failed test 1\");\n        \n        NSString *nsMenuXPath = [nsMenu XPath];\n        NSString *ddMenuXPath = [ddMenu XPath];\n        \n        XCTAssert([nsMenuXPath isEqualToString:ddMenuXPath], @\"Failed test 2\");\n        \n        NSArray *nsChildren = [nsMenu children];\n        NSArray *ddChildren = [ddMenu children];\n        \n        XCTAssert([nsChildren count] == [ddChildren count], @\"Failed CHECK 1\");\n        \n        for(i = 0; i < [nsChildren count]; i++)\n        {\n            NSString *nsChildXPath = [[nsChildren objectAtIndex:i] XPath];\n            NSString *ddChildXPath = [[ddChildren objectAtIndex:i] XPath];\n            \n            XCTAssert([nsChildXPath isEqualToString:ddChildXPath], @\"Failed test 3\");\n        }\n        \n        NSXMLElement *nsBeer = [[nsMenu elementsForName:@\"beer\"] objectAtIndex:0];\n        DDXMLElement *ddBeer = [[ddMenu elementsForName:@\"beer\"] objectAtIndex:0];\n        \n        NSArray *nsAttributes = [nsBeer attributes];\n        NSArray *ddAttributes = [ddBeer attributes];\n        \n        XCTAssert([nsAttributes count] == [ddAttributes count], @\"Failed CHECK 2\");\n        \n        for(i = 0; i < [nsAttributes count]; i++)\n        {\n            NSString *nsAttrXPath = [[nsAttributes objectAtIndex:i] XPath];\n            NSString *ddAttrXPath = [[ddAttributes objectAtIndex:i] XPath];\n            \n            NSAssert2([nsAttrXPath isEqualToString:ddAttrXPath],\n                      @\"Failed test 4: ns(%@) != dd(%@)\", nsAttrXPath, ddAttrXPath);\n        }\n        \n        NSArray *nsNamespaces = [nsMenu namespaces];\n        NSArray *ddNamespaces = [ddMenu namespaces];\n        \n        XCTAssert([nsNamespaces count] == [ddNamespaces count], @\"Failed CHECK 3\");\n        \n        for(i = 0; i < [nsNamespaces count]; i++)\n        {\n            NSString *nsNamespaceXPath = [[nsNamespaces objectAtIndex:i] XPath];\n            NSString *ddNamespaceXPath = [[ddNamespaces objectAtIndex:i] XPath];\n            \n            NSAssert2([nsNamespaceXPath isEqualToString:ddNamespaceXPath], @\"Failed test 5 - ns(%@) dd(%@)\",\n                      nsNamespaceXPath, ddNamespaceXPath);\n        }\n        \n        \n        NSXMLElement *nsElement1 = [NSXMLElement elementWithName:@\"duck\"];\n        NSXMLElement *nsElement2 = [NSXMLElement elementWithName:@\"quack\"];\n        [nsElement1 addChild:nsElement2];\n        \n        DDXMLElement *ddElement1 = [DDXMLElement elementWithName:@\"duck\"];\n        DDXMLElement *ddElement2 = [DDXMLElement elementWithName:@\"quack\"];\n        [ddElement1 addChild:ddElement2];\n        \n        NSString *nsElement1XPath = [nsElement1 XPath];\n        NSString *ddElement1XPath = [ddElement1 XPath];\n        \n        NSAssert2([nsElement1XPath isEqualToString:ddElement1XPath],\n                  @\"Failed test 6: ns(%@) != dd(%@)\", nsElement1XPath, ddElement1XPath);\n        \n        NSString *nsElement2XPath = [nsElement2 XPath];\n        NSString *ddElement2XPath = [ddElement2 XPath];\n        \n        NSAssert2([nsElement2XPath isEqualToString:ddElement2XPath],\n                  @\"Failed test 7: ns(%@) != dd(%@)\", nsElement2XPath, ddElement2XPath);\n        \n        NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@\"deusty\" stringValue:@\"designs\"];\n        NSXMLNode *ddAttr = [DDXMLNode attributeWithName:@\"deusty\" stringValue:@\"designs\"];\n        \n        NSString *nsAttrXPath = [nsAttr XPath];\n        NSString *ddAttrXPath = [ddAttr XPath];\n        \n        NSAssert2([nsAttrXPath isEqualToString:ddAttrXPath],\n                  @\"Failed test 8: ns(%@) != dd(%@)\", nsAttrXPath, ddAttrXPath);\n        \n    }}\n\n- (void)testNodesForXPath { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<menu xmlns:a=\\\"tap\\\">\"];\n        [xmlStr appendString:@\"  <salad>\"];\n        [xmlStr appendString:@\"    <name>Ceasar</name>\"];\n        [xmlStr appendString:@\"    <price>1.99</price>\"];\n        [xmlStr appendString:@\"  </salad>\"];\n        [xmlStr appendString:@\"  <pizza>\"];\n        [xmlStr appendString:@\"    <name>Supreme</name>\"];\n        [xmlStr appendString:@\"    <price>9.99</price>\"];\n        [xmlStr appendString:@\"  </pizza>\"];\n        [xmlStr appendString:@\"  <pizza>\"];\n        [xmlStr appendString:@\"    <name>Three Cheese</name>\"];\n        [xmlStr appendString:@\"    <price>7.99</price>\"];\n        [xmlStr appendString:@\"  </pizza>\"];\n        [xmlStr appendString:@\"  <a:beer delicious=\\\"yes\\\"/>\"];\n        [xmlStr appendString:@\"</menu>\"];\n        \n        NSError *err = nil;\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        NSArray *nsTest0 = [nsDoc nodesForXPath:@\"/menu/b:salad[1]\" error:&err];\n        \n        XCTAssert(nsTest0 == nil, @\"Failed CHECK 1\");\n        XCTAssert(err != nil, @\"Failed CHECK 2\");\n        \n        NSArray *nsTest1 = [nsDoc nodesForXPath:@\"/menu/salad[1]\" error:&err];\n        \n        XCTAssert(err == nil, @\"Failed CHECK 3\");\n        \n        NSArray *ddTest0 = [ddDoc nodesForXPath:@\"/menu/b:salad[1]\" error:&err];\n        \n        XCTAssert(ddTest0 == nil, @\"Failed test 1\");\n        XCTAssert(err != nil, @\"Failed test 2\");\n        \n        NSArray *ddTest1 = [ddDoc nodesForXPath:@\"/menu/salad[1]\" error:&err];\n        \n        XCTAssert(err == nil, @\"Failed test 3\");\n        \n        XCTAssert([nsTest1 count] == [ddTest1 count], @\"Failed test 4\");\n        \n        NSArray *nsTest2 = [nsDoc nodesForXPath:@\"menu/pizza\" error:&err];\n        NSArray *ddTest2 = [ddDoc nodesForXPath:@\"menu/pizza\" error:&err];\n        \n        XCTAssert([nsTest2 count] == [ddTest2 count], @\"Failed test 5\");\n        \n        NSArray *nsTest3 = [nsDoc nodesForXPath:@\"menu/a:beer/@delicious\" error:&err];\n        NSArray *ddTest3 = [ddDoc nodesForXPath:@\"menu/a:beer/@delicious\" error:&err];\n        \n        XCTAssert([nsTest3 count] == [ddTest3 count], @\"Failed test 6\");\n        \n        NSString *nsYes = [[nsTest3 objectAtIndex:0] stringValue];\n        NSString *ddYes = [[ddTest3 objectAtIndex:0] stringValue];\n        \n        XCTAssert([nsYes isEqualToString:ddYes], @\"Failed test 7\");\n        \n        \n        NSXMLElement *nsElement1 = [NSXMLElement elementWithName:@\"duck\"];\n        NSXMLElement *nsElement2 = [NSXMLElement elementWithName:@\"quack\"];\n        [nsElement1 addChild:nsElement2];\n        \n        DDXMLElement *ddElement1 = [DDXMLElement elementWithName:@\"duck\"];\n        DDXMLElement *ddElement2 = [DDXMLElement elementWithName:@\"quack\"];\n        [ddElement1 addChild:ddElement2];\n        \n        NSArray *nsTest4 = [nsElement1 nodesForXPath:@\"quack[1]\" error:nil];\n        NSArray *ddTest4 = [ddElement1 nodesForXPath:@\"quack[1]\" error:nil];\n        \n        XCTAssert([nsTest4 count] == [ddTest4 count], @\"Failed test 8\");\n    }}\n\n- (void)testNSXMLBugs { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <query xmlns=\"jabber:iq:private\">\n        //   <x xmlns=\"some:other:namespace\"></x>\n        // </query>\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<?xml version=\\\"1.0\\\"?>\"];\n        [xmlStr appendString:@\"<query xmlns=\\\"jabber:iq:private\\\">\"];\n        [xmlStr appendString:@\"  <x xmlns=\\\"some:other:namespace\\\"></x>\"];\n        [xmlStr appendString:@\"</query>\"];\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        \n        NSArray *nsChildren = [[nsDoc rootElement] elementsForName:@\"x\"];\n        NSArray *ddChildren = [[ddDoc rootElement] elementsForName:@\"x\"];\n        \n        if([nsChildren count] > 0)\n        {\n            NSLog(@\"Good news: Apple finally fixed that elementsForName: bug!\");\n        }\n        \n        XCTAssert([ddChildren count] == 1, @\"Failed test 1\");\n        \n    }}\n\n- (void)testInsertChild { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLElement *nsParent = [NSXMLElement elementWithName:@\"parent\"];\n        DDXMLElement *ddParent = [DDXMLElement elementWithName:@\"parent\"];\n        \n        NSXMLElement *nsChild2 = [NSXMLElement elementWithName:@\"child2\"];\n        DDXMLElement *ddChild2 = [DDXMLElement elementWithName:@\"child2\"];\n        \n        [nsParent insertChild:nsChild2 atIndex:0];\n        [ddParent insertChild:ddChild2 atIndex:0];\n        \n        XCTAssert([[nsParent XMLString] isEqualToString:[ddParent XMLString]], @\"Failed test 1\");\n        \n        NSXMLElement *nsChild0 = [NSXMLElement elementWithName:@\"child0\"];\n        DDXMLElement *ddChild0 = [DDXMLElement elementWithName:@\"child0\"];\n        \n        [nsParent insertChild:nsChild0 atIndex:0];\n        [ddParent insertChild:ddChild0 atIndex:0];\n        \n        XCTAssert([[nsParent XMLString] isEqualToString:[ddParent XMLString]], @\"Failed test 2\");\n        \n        NSXMLElement *nsChild1 = [NSXMLElement elementWithName:@\"child1\"];\n        DDXMLElement *ddChild1 = [DDXMLElement elementWithName:@\"child1\"];\n        \n        [nsParent insertChild:nsChild1 atIndex:1];\n        [ddParent insertChild:ddChild1 atIndex:1];\n        \n        XCTAssert([[nsParent XMLString] isEqualToString:[ddParent XMLString]], @\"Failed test 3\");\n        \n        NSXMLElement *nsChild3 = [NSXMLElement elementWithName:@\"child3\"];\n        DDXMLElement *ddChild3 = [DDXMLElement elementWithName:@\"child3\"];\n        \n        [nsParent insertChild:nsChild3 atIndex:3];\n        [ddParent insertChild:ddChild3 atIndex:3];\n        \n        XCTAssert([[nsParent XMLString] isEqualToString:[ddParent XMLString]], @\"Failed test 4\");\n        \n        NSException *nsException;\n        NSException *ddException;\n        \n        NSXMLElement *nsChild5 = [NSXMLElement elementWithName:@\"child5\"];\n        DDXMLElement *ddChild5 = [DDXMLElement elementWithName:@\"child5\"];\n        \n        nsException = [self tryCatch:^{\n            // Exception - index (5) beyond bounds (5)\n            [nsParent insertChild:nsChild5 atIndex:5];\n        }];\n        \n        ddException = [self tryCatch:^{\n            // Exception - index (5) beyond bounds (5)\n            [ddParent insertChild:ddChild5 atIndex:5];\n        }];\n        \n        XCTAssert(nsException != nil, @\"Failed CHECK 1\");\n        XCTAssert(ddException != nil, @\"Failed test 6\");\n    }}\n\n- (void)testElementSerialization { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *str = @\"<soup spicy=\\\"no\\\">chicken noodle</soup>\";\n        NSError *err;\n        \n        err = nil;\n        NSXMLElement *nse = [[NSXMLElement alloc] initWithXMLString:str error:&err];\n        \n        XCTAssert((nse != nil) && (err == nil), @\"Failed CHECK 1\");\n        \n        err = nil;\n        DDXMLElement *dde = [[DDXMLElement alloc] initWithXMLString:str error:&err];\n        \n        XCTAssert((dde != nil) && (err == nil), @\"Failed test 1\");\n        \n        XCTAssert([[nse XMLString] isEqualToString:[dde XMLString]], @\"Failed test 2\");\n    }}\n\n- (void)testAttrWithColonInName { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *str = @\"<artist name='Jay-Z' xml:pimp='yes' />\";\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithXMLString:str options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithXMLString:str options:0 error:nil];\n        \n        NSXMLNode *nsa = [[nsDoc rootElement] attributeForName:@\"xml:pimp\"];\n        DDXMLNode *dda = [[ddDoc rootElement] attributeForName:@\"xml:pimp\"];\n        \n        XCTAssert(nsa != nil, @\"Failed CHECK 1\");\n        XCTAssert(dda != nil, @\"Failed test 1\");\n    }}\n\n- (void)testMemoryIssueDebugging { @autoreleasepool\n    {\n#if DDXML_DEBUG_MEMORY_ISSUES\n        \n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        // <starbucks>\n        //   <latte/>\n        // </starbucks>\n        \n        NSMutableString *xmlStr = [NSMutableString stringWithCapacity:100];\n        [xmlStr appendString:@\"<starbucks>\"];\n        [xmlStr appendString:@\"  <latte/>\"];\n        [xmlStr appendString:@\"</starbucks>\"];\n        \n        DDXMLDocument *doc = [[DDXMLDocument alloc] initWithXMLString:xmlStr options:0 error:nil];\n        DDXMLElement *starbucks = [doc rootElement];\n        DDXMLElement *latte = [[starbucks elementsForName:@\"latte\"] lastObject];\n        \n        [doc release];\n        \n        NSException *exception1;\n        exception1 = [self tryCatch:^{\n            \n            [starbucks name];\n            [latte name];\n        }];\n        XCTAssert(exception1 == nil, @\"Failed test 1\");\n        \n        [starbucks removeChildAtIndex:0];\n        \n        NSException *exception2;\n        exception2 = [self tryCatch:^{\n            \n            [latte name];\n        }];\n        XCTAssert(exception2 != nil, @\"Failed test 2\");\n        \n        // <animals>\n        //   <duck/>\n        // </animals>\n        \n        DDXMLElement *animals = [[DDXMLElement alloc] initWithName:@\"animals\"];\n        DDXMLElement *duck = [DDXMLElement elementWithName:@\"duck\"];\n        \n        [animals addChild:duck];\n        [animals release];\n        \n        NSException *exception3;\n        exception3 = [self tryCatch:^{\n            \n            [duck name];\n        }];\n        XCTAssert(exception3 == nil, @\"Failed test 3\");\n        \n        // <colors>\n        //   <red/>\n        // </colors>\n        \n        DDXMLElement *colors = [[DDXMLElement alloc] initWithName:@\"colors\"];\n        DDXMLElement *red = [DDXMLElement elementWithName:@\"red\"];\n        \n        [colors addChild:red];\n        [colors setChildren:nil];\n        \n        NSException *exception4;\n        exception4 = [self tryCatch:^{\n            \n            [red name];\n        }];\n        XCTAssert(exception4 != nil, @\"Failed test 4\");\n        \n#endif\n    }}\n\n- (void)testAttrNs { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *nsName, *ddName;\n        NSString *nsUri, *ddUri;\n        \n        // 1. Normal attribute: duck='quack'.\n        //    Then try setting the URI of the attribute.\n        \n        NSXMLNode *nsAttr1 = [NSXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr1 = [DDXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        \n        nsName = [nsAttr1 name];\n        ddName = [ddAttr1 name];\n        \n        nsUri = [nsAttr1 URI];\n        ddUri = [ddAttr1 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 1A\");\n        XCTAssert(nsUri == nil && ddUri == nil, @\"Failed test 1B\");\n        \n        [nsAttr1 setURI:@\"http://animal.com\"];\n        [ddAttr1 setURI:@\"http://animal.com\"];\n        \n        nsName = [nsAttr1 name];\n        ddName = [ddAttr1 name];\n        \n        nsUri = [nsAttr1 URI];\n        ddUri = [ddAttr1 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 1C\");\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 1D\");\n        \n        // 2. Try setting the URI of the attribute at creation time\n        \n        NSXMLNode *nsAttr2 = [NSXMLNode attributeWithName:@\"duck\" URI:@\"http://animal.com\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr2 = [DDXMLNode attributeWithName:@\"duck\" URI:@\"http://animal.com\" stringValue:@\"quack\"];\n        \n        nsName = [nsAttr2 name];\n        ddName = [ddAttr2 name];\n        \n        nsUri = [nsAttr2 URI];\n        ddUri = [ddAttr2 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 2A\");\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 2B\");\n        \n        // 3. Try creating an attribute with a prefix but no URI (ns prefix, but no ns href)\n        \n        NSXMLNode *nsAttr3 = [NSXMLNode attributeWithName:@\"animal:duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr3 = [DDXMLNode attributeWithName:@\"animal:duck\" stringValue:@\"quack\"];\n        \n        nsName = [nsAttr3 name];\n        ddName = [ddAttr3 name];\n        \n        nsUri = [nsAttr3 URI];\n        ddUri = [ddAttr3 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 3A\");\n        XCTAssert(nsUri == nil && ddUri == nil, @\"Failed test 3B\");\n        \n        // 4. Try creating an attribute with a prefix and URI\n        \n        NSXMLNode *nsAttr4 = [NSXMLNode attributeWithName:@\"animal:duck\" URI:@\"http://animal.com\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr4 = [DDXMLNode attributeWithName:@\"animal:duck\" URI:@\"http://animal.com\" stringValue:@\"quack\"];\n        \n        nsName = [nsAttr4 name];\n        ddName = [ddAttr4 name];\n        \n        nsUri = [nsAttr4 URI];\n        ddUri = [ddAttr4 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 4A\");\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 4B\");\n        \n        // Prep for next 2 tests\n        // \n        // <zoo xmlns:animan='animal.com' />\n        \n        NSXMLElement *nsElement = [NSXMLElement elementWithName:@\"zoo\"];\n        [nsElement addNamespace:[NSXMLNode namespaceWithName:@\"animal\" stringValue:@\"animal.com\"]];\n        \n        DDXMLElement *ddElement = [DDXMLElement elementWithName:@\"zoo\"];\n        [ddElement addNamespace:[DDXMLNode namespaceWithName:@\"animal\" stringValue:@\"animal.com\"]];\n        \n        // 5. Try adding an attribute with a prefix to an element with specifies the href for the prefix\n        \n        NSXMLNode *nsAttr5 = [NSXMLNode attributeWithName:@\"animal:duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr5 = [DDXMLNode attributeWithName:@\"animal:duck\" stringValue:@\"quack\"];\n        \n        [nsElement addAttribute:nsAttr5];\n        [ddElement addAttribute:ddAttr5];\n        \n        nsName = [nsAttr5 name];\n        ddName = [ddAttr5 name];\n        \n        nsUri = [nsAttr5 URI];\n        ddUri = [ddAttr5 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 5A\");\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 5B - ns(%@) dd(%@)\", nsUri, ddUri);\n        \n        // 6. Try adding an attribute with a URI to an element which specifies the prefix for the URI\n        \n        NSXMLNode *nsAttr6 = [NSXMLNode attributeWithName:@\"duck\" URI:@\"animal.com\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr6 = [DDXMLNode attributeWithName:@\"duck\" URI:@\"animal.com\" stringValue:@\"quack\"];\n        \n        [nsElement addAttribute:nsAttr6];\n        [ddElement addAttribute:ddAttr6];\n        \n        nsName = [nsAttr6 name];\n        ddName = [ddAttr6 name];\n        \n        nsUri = [nsAttr6 URI];\n        ddUri = [ddAttr6 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 6A - ns(%@) dd(%@)\", nsName, ddName);\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 6B - ns(%@) dd(%@)\", nsUri, ddUri);\n        \n        // 7. Try when there are default namespaces involved\n        // \n        // <zoo xmlns='farm.com'>\n        //   <animal xmlns='animals.com' duck='quack'/>\n        // </zoo>\n        \n        NSXMLElement *nsZoo = [NSXMLElement elementWithName:@\"zoo\" URI:@\"zoo.com\"];\n        DDXMLElement *ddZoo = [DDXMLElement elementWithName:@\"zoo\" URI:@\"zoo.com\"];\n        \n        NSXMLElement *nsAnimal = [NSXMLElement elementWithName:@\"animal\" URI:@\"animals.com\"];\n        DDXMLElement *ddAnimal = [DDXMLElement elementWithName:@\"animal\" URI:@\"animals.com\"];\n        \n        [nsZoo addChild:nsAnimal];\n        [ddZoo addChild:ddAnimal];\n        \n        NSXMLNode *nsAttr7 = [NSXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr7 = [DDXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        \n        [nsAnimal addAttribute:nsAttr7];\n        [ddAnimal addAttribute:ddAttr7];\n        \n        nsName = [nsAttr7 name];\n        ddName = [ddAttr7 name];\n        \n        nsUri = [nsAttr7 URI];\n        ddUri = [ddAttr7 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 7A\");\n        XCTAssert(nsUri == nil && ddUri == nil, @\"Failed test 7B\");\n        \n        // 8. Try with the xml prefix\n        // \n        // <farm xml:duck='quack'/>\n        \n        NSXMLElement *nsFarm = [NSXMLElement elementWithName:@\"farm\"];\n        DDXMLElement *ddFarm = [DDXMLElement elementWithName:@\"farm\"];\n        \n        NSXMLNode *nsAttr8 = [NSXMLNode attributeWithName:@\"xml:duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr8 = [DDXMLNode attributeWithName:@\"xml:duck\" stringValue:@\"quack\"];\n        \n        [nsFarm addAttribute:nsAttr8];\n        [ddFarm addAttribute:ddAttr8];\n        \n        nsName = [nsAttr8 name];\n        ddName = [ddAttr8 name];\n        \n        nsUri = [nsAttr8 URI];\n        ddUri = [ddAttr8 URI];\n        \n        XCTAssert([nsName isEqualToString:ddName], @\"Failed test 8A\");\n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 8B - ns(%@) dd(%@)\", nsUri, ddUri);\n        \n    }}\n\n- (void)testNsDetatchCopy { @autoreleasepool\n    {\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSString *nsUri;\n        NSString *ddUri;\n        \n        // Test 1 - Set a URI on a standalone attribute\n        \n        NSXMLNode *nsAttr = [NSXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        DDXMLNode *ddAttr = [DDXMLNode attributeWithName:@\"duck\" stringValue:@\"quack\"];\n        \n        [nsAttr setURI:@\"zoo.com\"];\n        [ddAttr setURI:@\"zoo.com\"];\n        \n        nsUri = [nsAttr URI];\n        ddUri = [ddAttr URI];\n        \n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 1 - ns(%@) dd(%@)\", nsUri, ddUri);\n        \n        // Test 2 - Strip a URI from a doc\n        // \n        // <animals xmlns:farm='animals:farm' xmlns:zoo='animals:zoo'>\n        //   <farm:animal name='cow' />\n        //   <zoo:animal name='lion' />\n        // </animal>\n        \n        NSString *str = @\"<animals xmlns:farm='animals:farm' xmlns:zoo='animals:zoo' farm:loc='CA' zoo:loc='MO' >\\n\"\n        @\"  <farm:animal name='cow' />\\n\"\n        @\"  <zoo:animal name='lion' />\\n\"\n        @\"</animals>\";\n        NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];\n        \n        NSXMLDocument *nsDoc = [[NSXMLDocument alloc] initWithData:data options:0 error:nil];\n        DDXMLDocument *ddDoc = [[DDXMLDocument alloc] initWithData:data options:0 error:nil];\n        \n        NSXMLElement *nsRoot = [nsDoc rootElement];\n        DDXMLElement *ddRoot = [ddDoc rootElement];\n        \n        NSXMLElement *nsCow = [[nsRoot elementsForName:@\"farm:animal\"] objectAtIndex:0];\n        DDXMLElement *ddCow = [[ddRoot elementsForName:@\"farm:animal\"] objectAtIndex:0];\n        \n        nsUri = [nsCow URI];\n        ddUri = [ddCow URI];\n        \n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 2a\");\n        \n        [nsRoot removeNamespaceForPrefix:@\"farm\"];\n        [ddRoot removeNamespaceForPrefix:@\"farm\"];\n        \n        nsUri = [nsCow URI];\n        ddUri = [ddCow URI];\n        \n        XCTAssert([nsUri isEqualToString:ddUri], @\"Failed test 2b\");\t\n    }}\n\n- (void)testInvalidNode { @autoreleasepool\n    {\n#if !(TARGET_OS_IPHONE) // This test won't compile for iOS targets due to initWithKind:\n        NSLog(@\"Starting %@...\", NSStringFromSelector(_cmd));\n        \n        NSXMLNode *nsNode = [[NSXMLNode alloc] initWithKind:NSXMLInvalidKind];\n        DDXMLNode *ddNode = [[DDXMLNode alloc] init];\n        \n        XCTAssert([NSStringFromClass([ddNode class]) isEqualToString:@\"DDXMLInvalidNode\"], @\"Failed test 0\");\n        XCTAssert([NSStringFromClass([nsNode class]) isEqualToString:@\"NSXMLNode\"], @\"Failed test 0a\");\n        \n        NSXMLNodeKind nsKind = [nsNode kind];\n        XCTAssert(nsKind == NSXMLInvalidKind, @\"Failed CHECK 1a\");\n        \n        DDXMLNodeKind ddKind = [ddNode kind];\n        XCTAssert(ddKind == DDXMLInvalidKind, @\"Failed test 1a\");\n        \n        // _NSXMLPlaceholderNode does not recognize these selectors\n        NSString *nsName = [nsNode name];\n        NSString *ddName = [ddNode name];\n        \n        XCTAssert(ddName == nil, @\"Failed test 2 - dd(%@)\", ddName);\n        XCTAssert(nsName == nil, @\"Failed test 2a - dd(%@)\", ddName);\n        \n        NSString *nsDesc = [nsNode description];\n        NSString *ddDesc = [ddNode description];\n        \n        XCTAssert(nsDesc && [nsDesc isEqualToString:ddDesc], @\"Failed test 3 - ns(%@) dd(%@)\", nsDesc, ddDesc);\n#endif\n    }}\n\n@end\n\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n#pragma mark -\n////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\n\n@implementation DDAssertionHandler\n\n@synthesize shouldLogAssertionFailure;\n\n- (instancetype)init\n{\n    if ((self = [super init]))\n    {\n        shouldLogAssertionFailure = YES;\n    }\n    return self;\n}\n\n- (void)logFailureIn:(NSString *)place\n                file:(NSString *)fileName\n          lineNumber:(NSInteger)line\n{\n    // How Apple's default assertion handler does it (all on one line):\n    // \n    // *** Assertion failure in -[NSXMLElement insertChild:atIndex:],\n    // /SourceCache/Foundation/Foundation-751.53/XML.subproj/XMLTypes.subproj/NSXMLElement.m:823\n    \n    NSLog(@\"*** Assertion failure in %@, %@:%li\", place, fileName, (long int)line);\n}\n\n- (void)handleFailureInFunction:(NSString *)functionName\n                           file:(NSString *)fileName\n                     lineNumber:(NSInteger)line\n                    description:(NSString *)format, ...\n{\n    if (shouldLogAssertionFailure)\n    {\n        [self logFailureIn:functionName file:fileName lineNumber:line];\n    }\n    \n    va_list args;\n    va_start(args, format);\n    \n    NSString *reason = [[NSString alloc] initWithFormat:format arguments:args];\n    \n    va_end(args);\n    \n    [[NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil] raise];\n}\n\n- (void)handleFailureInMethod:(SEL)selector\n                       object:(id)object\n                         file:(NSString *)fileName\n                   lineNumber:(NSInteger)line\n                  description:(NSString *)format, ...\n{\n    if (shouldLogAssertionFailure)\n    {\n        Class objectClass = [object class];\n        \n        NSString *type;\n        if (objectClass == object)\n            type = @\"+\";\n        else\n            type = @\"-\";\n        \n        NSString *place = [NSString stringWithFormat:@\"%@[%@ %@]\",\n                           type, NSStringFromClass(objectClass), NSStringFromSelector(selector)];\n        \n        [self logFailureIn:place file:fileName lineNumber:line];\n    }\n    \n    va_list args;\n    va_start(args, format);\n    \n    NSString *reason = [[NSString alloc] initWithFormat:format arguments:args];\n    \n    va_end(args);\n    \n    [[NSException exceptionWithName:NSInternalInconsistencyException reason:reason userInfo:nil] raise];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXML.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\t1FB55F4C9A619D81B2B6D5F9 /* Pods_KissXMLSwiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45C05E6813A1A077F1A35E5F /* Pods_KissXMLSwiftTests.framework */; };\n\t\tD9DB387C1C5845BA003E55FB /* KissXMLSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9DB387B1C5845BA003E55FB /* KissXMLSwiftTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1D9F98E4E9274E7FE7236211 /* Pods-KissXMLSwiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t45C05E6813A1A077F1A35E5F /* Pods_KissXMLSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KissXMLSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t489CB490979AD956670153FB /* Pods-KissXMLSwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD9DB38791C5845BA003E55FB /* KissXMLSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KissXMLSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD9DB387B1C5845BA003E55FB /* KissXMLSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissXMLSwiftTests.swift; sourceTree = \"<group>\"; };\n\t\tD9DB387D1C5845BA003E55FB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD9DB38761C5845BA003E55FB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1FB55F4C9A619D81B2B6D5F9 /* Pods_KissXMLSwiftTests.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\tCAF7F0EA91C35E08F4C76441 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t489CB490979AD956670153FB /* Pods-KissXMLSwiftTests.debug.xcconfig */,\n\t\t\t\t1D9F98E4E9274E7FE7236211 /* Pods-KissXMLSwiftTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD88E11315861A1E4686DB829 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45C05E6813A1A077F1A35E5F /* Pods_KissXMLSwiftTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72491C56EE9D00002BEE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB387A1C5845BA003E55FB /* KissXMLSwiftTests */,\n\t\t\t\tD9AA72551C56EEF500002BEE /* Products */,\n\t\t\t\tCAF7F0EA91C35E08F4C76441 /* Pods */,\n\t\t\t\tD88E11315861A1E4686DB829 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72551C56EEF500002BEE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB38791C5845BA003E55FB /* KissXMLSwiftTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9DB387A1C5845BA003E55FB /* KissXMLSwiftTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD9DB387B1C5845BA003E55FB /* KissXMLSwiftTests.swift */,\n\t\t\t\tD9DB387D1C5845BA003E55FB /* Info.plist */,\n\t\t\t);\n\t\t\tpath = KissXMLSwiftTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD9DB38781C5845BA003E55FB /* KissXMLSwiftTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D9DB38801C5845BA003E55FB /* Build configuration list for PBXNativeTarget \"KissXMLSwiftTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7F06356A51F464385261A193 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tD9DB38751C5845BA003E55FB /* Sources */,\n\t\t\t\tD9DB38761C5845BA003E55FB /* Frameworks */,\n\t\t\t\tD9DB38771C5845BA003E55FB /* Resources */,\n\t\t\t\tB80AC4DC07455D15D9429DBB /* [CP] Embed Pods Frameworks */,\n\t\t\t\tB93F80DD70215412261A5B21 /* [CP] 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 = KissXMLSwiftTests;\n\t\t\tproductName = KissXMLSwiftTests;\n\t\t\tproductReference = D9DB38791C5845BA003E55FB /* KissXMLSwiftTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD9AA724A1C56EE9D00002BEE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD9DB38781C5845BA003E55FB = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */;\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 = D9AA72491C56EE9D00002BEE;\n\t\t\tproductRefGroup = D9AA72551C56EEF500002BEE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD9DB38781C5845BA003E55FB /* KissXMLSwiftTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD9DB38771C5845BA003E55FB /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t7F06356A51F464385261A193 /* [CP] 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 = \"[CP] 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\tB80AC4DC07455D15D9429DBB /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tB93F80DD70215412261A5B21 /* [CP] 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 = \"[CP] 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/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD9DB38751C5845BA003E55FB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD9DB387C1C5845BA003E55FB /* KissXMLSwiftTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD9AA724E1C56EE9D00002BEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9AA724F1C56EE9D00002BEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD9DB387E1C5845BA003E55FB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 489CB490979AD956670153FB /* Pods-KissXMLSwiftTests.debug.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLSwiftTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-isystem\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/Headers/Public\\\"\",\n\t\t\t\t\t\"-isystem\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/Headers/Public/KissXML\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLSwiftTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9DB387F1C5845BA003E55FB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 1D9F98E4E9274E7FE7236211 /* Pods-KissXMLSwiftTests.release.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLSwiftTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-isystem\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/Headers/Public\\\"\",\n\t\t\t\t\t\"-isystem\",\n\t\t\t\t\t\"\\\"${PODS_ROOT}/Headers/Public/KissXML\\\"\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLSwiftTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9AA724E1C56EE9D00002BEE /* Debug */,\n\t\t\t\tD9AA724F1C56EE9D00002BEE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD9DB38801C5845BA003E55FB /* Build configuration list for PBXNativeTarget \"KissXMLSwiftTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9DB387E1C5845BA003E55FB /* Debug */,\n\t\t\t\tD9DB387F1C5845BA003E55FB /* 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 = D9AA724A1C56EE9D00002BEE /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXML.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:KissXML.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXML.xcodeproj/xcshareddata/xcschemes/KissXMLSwiftTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D9DB38781C5845BA003E55FB\"\n               BuildableName = \"KissXMLSwiftTests.xctest\"\n               BlueprintName = \"KissXMLSwiftTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D9DB38781C5845BA003E55FB\"\n               BuildableName = \"KissXMLSwiftTests.xctest\"\n               BlueprintName = \"KissXMLSwiftTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D9DB38781C5845BA003E55FB\"\n            BuildableName = \"KissXMLSwiftTests.xctest\"\n            BlueprintName = \"KissXMLSwiftTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D9DB38781C5845BA003E55FB\"\n            BuildableName = \"KissXMLSwiftTests.xctest\"\n            BlueprintName = \"KissXMLSwiftTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXML.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:KissXML.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXMLSwiftTests/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>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</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</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/KissXMLSwiftTests/KissXMLSwiftTests.swift",
    "content": "//\n//  KissXMLSwiftTests.swift\n//  KissXMLSwiftTests\n//\n//  Created by Chris Ballinger on 1/26/16.\n//\n//\n\nimport XCTest\nimport KissXML\n\nclass KissXMLSwiftTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testXMLNode() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n        let node = DDXMLNode()\n        let apple = NSXMLNode()\n        XCTAssertNotNil(node)\n        XCTAssertNotNil(apple)\n    }\n    \n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nuse_frameworks!\nplatform :osx, \"10.8\"\n\n\ntarget 'KissXMLSwiftTests' do\n  pod \"KissXML/SwiftNSXML\", :path => \"../../\"\nend"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXML.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\t63F8CF211C5C1285000D126C /* KissXMLSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F8CF201C5C1285000D126C /* KissXMLSwiftTests.swift */; };\n\t\tE15F9B59EC75DDF6BC04121D /* Pods_KissXMLSwiftTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6175035243226B1DD2C43AC /* Pods_KissXMLSwiftTests.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t63F8CF1D1C5C1285000D126C /* KissXMLSwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KissXMLSwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t63F8CF201C5C1285000D126C /* KissXMLSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KissXMLSwiftTests.swift; sourceTree = \"<group>\"; };\n\t\t63F8CF221C5C1285000D126C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t784DE902045AB8CB969937F9 /* Pods-KissXMLSwiftTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t9B79B7E3E4447D0F067D38DA /* Pods-KissXMLSwiftTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLSwiftTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB6175035243226B1DD2C43AC /* Pods_KissXMLSwiftTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KissXMLSwiftTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t63F8CF1A1C5C1285000D126C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE15F9B59EC75DDF6BC04121D /* Pods_KissXMLSwiftTests.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\t5880722171937CB96753C0E2 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB6175035243226B1DD2C43AC /* Pods_KissXMLSwiftTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t63F8CF121C5C1250000D126C = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63F8CF1F1C5C1285000D126C /* KissXMLSwiftTests */,\n\t\t\t\t63F8CF1E1C5C1285000D126C /* Products */,\n\t\t\t\t87B944F2CF8A60316205ACE9 /* Pods */,\n\t\t\t\t5880722171937CB96753C0E2 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t63F8CF1E1C5C1285000D126C /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63F8CF1D1C5C1285000D126C /* KissXMLSwiftTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t63F8CF1F1C5C1285000D126C /* KissXMLSwiftTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63F8CF201C5C1285000D126C /* KissXMLSwiftTests.swift */,\n\t\t\t\t63F8CF221C5C1285000D126C /* Info.plist */,\n\t\t\t);\n\t\t\tpath = KissXMLSwiftTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t87B944F2CF8A60316205ACE9 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B79B7E3E4447D0F067D38DA /* Pods-KissXMLSwiftTests.debug.xcconfig */,\n\t\t\t\t784DE902045AB8CB969937F9 /* Pods-KissXMLSwiftTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t63F8CF1C1C5C1285000D126C /* KissXMLSwiftTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 63F8CF251C5C1285000D126C /* Build configuration list for PBXNativeTarget \"KissXMLSwiftTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6538811713D17D403355873B /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t63F8CF191C5C1285000D126C /* Sources */,\n\t\t\t\t63F8CF1A1C5C1285000D126C /* Frameworks */,\n\t\t\t\t63F8CF1B1C5C1285000D126C /* Resources */,\n\t\t\t\t135FFAB2B1CFCAC82029D9A0 /* [CP] Embed Pods Frameworks */,\n\t\t\t\t30A8BCA84E22EA6BF0BD6196 /* [CP] 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 = KissXMLSwiftTests;\n\t\t\tproductName = KissXMLSwiftTests;\n\t\t\tproductReference = 63F8CF1D1C5C1285000D126C /* KissXMLSwiftTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t63F8CF131C5C1250000D126C /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t63F8CF1C1C5C1285000D126C = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 63F8CF161C5C1250000D126C /* Build configuration list for PBXProject \"KissXML\" */;\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 = 63F8CF121C5C1250000D126C;\n\t\t\tproductRefGroup = 63F8CF1E1C5C1285000D126C /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t63F8CF1C1C5C1285000D126C /* KissXMLSwiftTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t63F8CF1B1C5C1285000D126C /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t135FFAB2B1CFCAC82029D9A0 /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t30A8BCA84E22EA6BF0BD6196 /* [CP] 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 = \"[CP] 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/Target Support Files/Pods-KissXMLSwiftTests/Pods-KissXMLSwiftTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t6538811713D17D403355873B /* [CP] 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 = \"[CP] 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\t63F8CF191C5C1285000D126C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t63F8CF211C5C1285000D126C /* KissXMLSwiftTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t63F8CF171C5C1250000D126C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t63F8CF181C5C1250000D126C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t63F8CF231C5C1285000D126C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9B79B7E3E4447D0F067D38DA /* Pods-KissXMLSwiftTests.debug.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLSwiftTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.davidchiles.KissXMLSwiftTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t63F8CF241C5C1285000D126C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 784DE902045AB8CB969937F9 /* Pods-KissXMLSwiftTests.release.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLSwiftTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.davidchiles.KissXMLSwiftTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\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/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t63F8CF161C5C1250000D126C /* Build configuration list for PBXProject \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t63F8CF171C5C1250000D126C /* Debug */,\n\t\t\t\t63F8CF181C5C1250000D126C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t63F8CF251C5C1285000D126C /* Build configuration list for PBXNativeTarget \"KissXMLSwiftTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t63F8CF231C5C1285000D126C /* Debug */,\n\t\t\t\t63F8CF241C5C1285000D126C /* 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 = 63F8CF131C5C1250000D126C /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXML.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:KissXML.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXML.xcodeproj/xcshareddata/xcschemes/KissXMLSwiftTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"63F8CF1C1C5C1285000D126C\"\n               BuildableName = \"KissXMLSwiftTests.xctest\"\n               BlueprintName = \"KissXMLSwiftTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"63F8CF1C1C5C1285000D126C\"\n               BuildableName = \"KissXMLSwiftTests.xctest\"\n               BlueprintName = \"KissXMLSwiftTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"63F8CF1C1C5C1285000D126C\"\n            BuildableName = \"KissXMLSwiftTests.xctest\"\n            BlueprintName = \"KissXMLSwiftTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"63F8CF1C1C5C1285000D126C\"\n            BuildableName = \"KissXMLSwiftTests.xctest\"\n            BlueprintName = \"KissXMLSwiftTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXML.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:KissXML.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXMLSwiftTests/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>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</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</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/KissXMLSwiftTests/KissXMLSwiftTests.swift",
    "content": "//\n//  KissXMLSwiftTests.swift\n//  KissXMLSwiftTests\n//\n//  Created by David Chiles on 1/29/16.\n//\n//\n\nimport XCTest\nimport KissXML\n\nclass KissXMLSwiftTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testElementCreatoin() {\n        let element = NSXMLNode()\n        XCTAssertNotNil(element)\n    }\n    \n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/Swift-iOS/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nuse_frameworks!\nplatform :ios, \"8.0\"\n\n\ntarget 'KissXMLSwiftTests' do\n  pod \"KissXML/SwiftNSXML\", :path => \"../../\"\nend\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/KissXML.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\t5152071646030EA6E6FD4F7C /* Pods_KissXMLTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 375C7AABAE352F762C98A303 /* Pods_KissXMLTests.framework */; };\n\t\tD92F89D21C582AEE008C1F90 /* KissXMLTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D92F89D11C582AEE008C1F90 /* KissXMLTests.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t375C7AABAE352F762C98A303 /* Pods_KissXMLTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_KissXMLTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KissXMLTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD92F89D11C582AEE008C1F90 /* KissXMLTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = KissXMLTests.m; path = ../../Shared/KissXMLTests.m; sourceTree = \"<group>\"; };\n\t\tD92F89D31C582AEE008C1F90 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD92F89CC1C582AEE008C1F90 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5152071646030EA6E6FD4F7C /* Pods_KissXMLTests.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\t77336FAB70E3EE954FF63735 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t375C7AABAE352F762C98A303 /* Pods_KissXMLTests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD92F89D01C582AEE008C1F90 /* KissXMLTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89D11C582AEE008C1F90 /* KissXMLTests.m */,\n\t\t\t\tD92F89D31C582AEE008C1F90 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = KissXMLTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72491C56EE9D00002BEE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89D01C582AEE008C1F90 /* KissXMLTests */,\n\t\t\t\tD9AA72551C56EEF500002BEE /* Products */,\n\t\t\t\tE18FECB466D758E0304EE6FD /* Pods */,\n\t\t\t\t77336FAB70E3EE954FF63735 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72551C56EEF500002BEE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE18FECB466D758E0304EE6FD /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */,\n\t\t\t\tB6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD92F89CE1C582AEE008C1F90 /* KissXMLTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D92F89D41C582AEE008C1F90 /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2B9FDC8BF808217099BB7420 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tD92F89CB1C582AEE008C1F90 /* Sources */,\n\t\t\t\tD92F89CC1C582AEE008C1F90 /* Frameworks */,\n\t\t\t\tD92F89CD1C582AEE008C1F90 /* Resources */,\n\t\t\t\t796A1BB0D488DBA9C15D14DD /* [CP] Embed Pods Frameworks */,\n\t\t\t\t506DF61E02F664DE0B44A546 /* [CP] 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 = KissXMLTests;\n\t\t\tproductName = KissXMLTests;\n\t\t\tproductReference = D92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD9AA724A1C56EE9D00002BEE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD92F89CE1C582AEE008C1F90 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */;\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 = D9AA72491C56EE9D00002BEE;\n\t\t\tproductRefGroup = D9AA72551C56EEF500002BEE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD92F89CE1C582AEE008C1F90 /* KissXMLTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD92F89CD1C582AEE008C1F90 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t2B9FDC8BF808217099BB7420 /* [CP] 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 = \"[CP] 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\t506DF61E02F664DE0B44A546 /* [CP] 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 = \"[CP] 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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t796A1BB0D488DBA9C15D14DD /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD92F89CB1C582AEE008C1F90 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD92F89D21C582AEE008C1F90 /* KissXMLTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD92F89D51C582AEE008C1F90 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD92F89D61C582AEE008C1F90 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\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\tD9AA724E1C56EE9D00002BEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9AA724F1C56EE9D00002BEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD92F89D41C582AEE008C1F90 /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD92F89D51C582AEE008C1F90 /* Debug */,\n\t\t\t\tD92F89D61C582AEE008C1F90 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9AA724E1C56EE9D00002BEE /* Debug */,\n\t\t\t\tD9AA724F1C56EE9D00002BEE /* 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 = D9AA724A1C56EE9D00002BEE /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/KissXML.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:KissXML.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/KissXML.xcodeproj/xcshareddata/xcschemes/KissXMLTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n               BuildableName = \"KissXMLTests.xctest\"\n               BlueprintName = \"KissXMLTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n               BuildableName = \"KissXMLTests.xctest\"\n               BlueprintName = \"KissXMLTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n            BuildableName = \"KissXMLTests.xctest\"\n            BlueprintName = \"KissXMLTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n            BuildableName = \"KissXMLTests.xctest\"\n            BlueprintName = \"KissXMLTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/KissXML.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:KissXML.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/KissXMLTests/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>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</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</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nuse_frameworks!\nplatform :ios, \"8.0\"\n\n\ntarget 'KissXMLTests' do\n  pod \"KissXML\", :path => \"../../\"\nend\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/KissXML.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\tA9FB98401DC17F64CCCB18E3 /* libPods-KissXMLTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DB24D3F146594D5BA971AF07 /* libPods-KissXMLTests.a */; };\n\t\tD92F89D21C582AEE008C1F90 /* KissXMLTests.m in Sources */ = {isa = PBXBuildFile; fileRef = D92F89D11C582AEE008C1F90 /* KissXMLTests.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-KissXMLTests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KissXMLTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD92F89D11C582AEE008C1F90 /* KissXMLTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = KissXMLTests.m; path = ../../Shared/KissXMLTests.m; sourceTree = \"<group>\"; };\n\t\tD92F89D31C582AEE008C1F90 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tDB24D3F146594D5BA971AF07 /* libPods-KissXMLTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-KissXMLTests.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD92F89CC1C582AEE008C1F90 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA9FB98401DC17F64CCCB18E3 /* libPods-KissXMLTests.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\t77336FAB70E3EE954FF63735 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDB24D3F146594D5BA971AF07 /* libPods-KissXMLTests.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD92F89D01C582AEE008C1F90 /* KissXMLTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89D11C582AEE008C1F90 /* KissXMLTests.m */,\n\t\t\t\tD92F89D31C582AEE008C1F90 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = KissXMLTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72491C56EE9D00002BEE = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89D01C582AEE008C1F90 /* KissXMLTests */,\n\t\t\t\tD9AA72551C56EEF500002BEE /* Products */,\n\t\t\t\tE18FECB466D758E0304EE6FD /* Pods */,\n\t\t\t\t77336FAB70E3EE954FF63735 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD9AA72551C56EEF500002BEE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE18FECB466D758E0304EE6FD /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */,\n\t\t\t\tB6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD92F89CE1C582AEE008C1F90 /* KissXMLTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D92F89D41C582AEE008C1F90 /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2B9FDC8BF808217099BB7420 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tD92F89CB1C582AEE008C1F90 /* Sources */,\n\t\t\t\tD92F89CC1C582AEE008C1F90 /* Frameworks */,\n\t\t\t\tD92F89CD1C582AEE008C1F90 /* Resources */,\n\t\t\t\t796A1BB0D488DBA9C15D14DD /* [CP] Embed Pods Frameworks */,\n\t\t\t\t506DF61E02F664DE0B44A546 /* [CP] 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 = KissXMLTests;\n\t\t\tproductName = KissXMLTests;\n\t\t\tproductReference = D92F89CF1C582AEE008C1F90 /* KissXMLTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD9AA724A1C56EE9D00002BEE /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD92F89CE1C582AEE008C1F90 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */;\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 = D9AA72491C56EE9D00002BEE;\n\t\t\tproductRefGroup = D9AA72551C56EEF500002BEE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD92F89CE1C582AEE008C1F90 /* KissXMLTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD92F89CD1C582AEE008C1F90 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t2B9FDC8BF808217099BB7420 /* [CP] 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 = \"[CP] 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\t506DF61E02F664DE0B44A546 /* [CP] 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 = \"[CP] 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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t796A1BB0D488DBA9C15D14DD /* [CP] Embed Pods Frameworks */ = {\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 = \"[CP] Embed Pods Frameworks\";\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/Target Support Files/Pods-KissXMLTests/Pods-KissXMLTests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD92F89CB1C582AEE008C1F90 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD92F89D21C582AEE008C1F90 /* KissXMLTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD92F89D51C582AEE008C1F90 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 118119B6ADBE0D1B53049C24 /* Pods-KissXMLTests.debug.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD92F89D61C582AEE008C1F90 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6FADFA4F3C952CEB87FD8F8 /* Pods-KissXMLTests.release.xcconfig */;\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 = YES;\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_ERROR;\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_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = 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\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = KissXMLTests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = io.ballinger.KissXMLTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\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\tD9AA724E1C56EE9D00002BEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD9AA724F1C56EE9D00002BEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD92F89D41C582AEE008C1F90 /* Build configuration list for PBXNativeTarget \"KissXMLTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD92F89D51C582AEE008C1F90 /* Debug */,\n\t\t\t\tD92F89D61C582AEE008C1F90 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD9AA724D1C56EE9D00002BEE /* Build configuration list for PBXProject \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD9AA724E1C56EE9D00002BEE /* Debug */,\n\t\t\t\tD9AA724F1C56EE9D00002BEE /* 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 = D9AA724A1C56EE9D00002BEE /* Project object */;\n}\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/KissXML.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:KissXML.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/KissXML.xcodeproj/xcshareddata/xcschemes/KissXMLTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n               BuildableName = \"KissXMLTests.xctest\"\n               BlueprintName = \"KissXMLTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n               BuildableName = \"KissXMLTests.xctest\"\n               BlueprintName = \"KissXMLTests\"\n               ReferencedContainer = \"container:KissXML.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n            BuildableName = \"KissXMLTests.xctest\"\n            BlueprintName = \"KissXMLTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D92F89CE1C582AEE008C1F90\"\n            BuildableName = \"KissXMLTests.xctest\"\n            BlueprintName = \"KissXMLTests\"\n            ReferencedContainer = \"container:KissXML.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/KissXML.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:KissXML.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/KissXMLTests/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>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</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</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Modified Pods/KissXML-5.1.2/Tests/iOS-static/Podfile",
    "content": "source 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, \"7.0\"\n\n\ntarget 'KissXMLTests' do\n  pod \"KissXML\", :path => \"../../\"\nend\n"
  },
  {
    "path": "Modified Pods/MRProgress/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Modified Pods/MRProgress/MRProgress.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name                  = 'MRProgress'\n  s.version               = '0.7.0'\n  s.summary               = 'Collection of iOS drop-in components to visualize progress with different modes'\n  s.homepage              = 'https://github.com/mrackwitz/MRProgress'\n  s.social_media_url      = 'https://twitter.com/mrackwitz'\n  s.author                = { 'Marius Rackwitz' => 'git@mariusrackwitz.de' }\n  s.license               = 'MIT License'\n  s.source                = { :git => 'https://github.com/mrackwitz/MRProgress.git', :tag => s.version.to_s }\n  s.source_files          = 'src/MRProgress.h'\n  s.platform              = :ios, '7.0'\n  s.requires_arc          = true\n  s.default_subspecs      = %w{Blur ActivityIndicator Circular Icons NavigationBarProgress Overlay}\n  \n  s.subspec 'Blur' do |subs|\n    subs.source_files = 'src/Blur/*.{h,m}'\n    subs.dependency 'MRProgress/Helper'\n    subs.ios.frameworks = %w{UIKit QuartzCore CoreGraphics Accelerate}\n  end\n\n  s.subspec 'ActivityIndicator' do |subs|\n    subs.source_files = 'src/Components/MRActivityIndicatorView.{h,m}'\n    subs.dependency 'MRProgress/Stopable'\n    subs.ios.frameworks = %w{UIKit QuartzCore CoreGraphics}\n  end\n\n  s.subspec 'Circular' do |subs|\n    subs.source_files = 'src/Components/MRCircularProgressView.{h,m}'\n    subs.dependency 'MRProgress/Stopable'\n    subs.dependency 'MRProgress/Helper'\n    subs.dependency 'MRProgress/ProgressBaseClass'\n    subs.ios.frameworks = %w{UIKit QuartzCore}\n  end\n\n  s.subspec 'Icons' do |subs|\n    subs.source_files = 'src/Components/MRIconView.{h,m}'\n    subs.ios.frameworks = %w{UIKit QuartzCore}\n  end\n  \n  s.subspec 'NavigationBarProgress' do |subs|\n    subs.source_files = 'src/Components/MRNavigationBarProgressView.{h,m}'\n    subs.dependency 'MRProgress/ProgressBaseClass'\n    subs.ios.frameworks = %w{UIKit}\n  end\n  \n  s.subspec 'Overlay' do |subs|\n    subs.source_files = 'src/Components/MRProgressOverlayView.{h,m}'\n    subs.dependency 'MRProgress/ActivityIndicator'\n    subs.dependency 'MRProgress/Circular'\n    subs.dependency 'MRProgress/Icons'\n    subs.dependency 'MRProgress/Blur'\n    subs.dependency 'MRProgress/Helper'\n    subs.ios.frameworks = %w{UIKit QuartzCore CoreGraphics}\n  end\n  \n  # Optional support subspecs - you can use them if they make sense for you\n  s.subspec 'AFNetworking' do |subs|\n    subs.subspec 'Base' do |subs|\n      subs.dependency 'MRProgress/MethodCopier'\n      subs.dependency 'AFNetworking'\n      subs.dependency 'AFNetworking/UIKit', '2.4.1'\n    end\n\n    def subs.subspec_with_category_for(spec_name, class_name)\n      subspec spec_name do |subs|\n        subs.dependency 'MRProgress/AFNetworking/Base'\n        subs.dependency \"MRProgress/#{spec_name}\"\n        subs.source_files = \"src/Support/AFNetworking/#{class_name}+AFNetworking.{h,m}\"\n      end\n    end\n\n    def subs.alias_subspecs(hash)\n      hash.each do |alias_name, target_name|\n        subspec alias_name do |subs|\n          subs.dependency \"MRProgress/AFNetworking/#{target_name}\"\n        end\n      end\n    end\n\n    subs.subspec_with_category_for('ActivityIndicator', 'MRActivityIndicatorView')\n    subs.subspec_with_category_for('ProgressBaseClass', 'MRProgressView')\n    subs.subspec_with_category_for('Overlay',           'MRProgressOverlayView').tap do |subs|\n      subs.dependency 'MRProgress/AFNetworking/ActivityIndicator'\n      subs.dependency 'MRProgress/AFNetworking/Circular'\n    end\n    subs.alias_subspecs 'Circular'              => 'ProgressBaseClass'\n    subs.alias_subspecs 'NavigationBarProgress' => 'ProgressBaseClass'\n  end\n  \n  # \"Public\" helper subspecs - you can rely on these\n  s.subspec 'MessageInterceptor' do |subs|\n    subs.source_files = 'src/Utils/MRMessageInterceptor.{h,m}'\n  end\n  \n  s.subspec 'MethodCopier' do |subs|\n    subs.source_files = 'src/Utils/MRMethodCopier.{h,m}'\n  end\n\n  s.subspec 'WeakProxy' do |subs|\n    subs.source_files = 'src/Utils/MRWeakProxy.{h,m}'\n  end\n\n  # \"Private\" helper subspecs - do not depend on these\n  s.subspec 'ProgressBaseClass' do |subs|\n    subs.source_files = 'src/Components/MRProgressView.{h,m}'\n    subs.ios.frameworks = %w{UIKit}\n  end\n\n  s.subspec 'Stopable' do |subs|\n    subs.source_files = 'src/Components/{MRStopableView,MRStopButton}.{h,m}'\n    subs.ios.frameworks = %w{UIKit QuartzCore}\n    subs.dependency 'MRProgress/Helper'\n  end\n  \n  s.subspec 'Helper' do |subs|\n    subs.source_files = 'src/Utils/MRProgressHelper.h'\n    subs.ios.frameworks = %w{UIKit QuartzCore}\n  end\nend"
  },
  {
    "path": "Modified Pods/MRProgress/README.md",
    "content": "## MRProgress\n[![Twitter: @mrackwitz](https://img.shields.io/badge/contact-@mrackwitz-blue.svg?style=flat)](https://twitter.com/mrackwitz)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg?style=flat)](https://github.com/mrackwitz/MRProgress/blob/master/LICENSE)\n[![CocoaPods](https://img.shields.io/cocoapods/v/MRProgress.svg?style=flat)](https://github.com/mrackwitz/MRProgress)\n[![Travis](http://img.shields.io/travis/mrackwitz/MRProgress.svg?style=flat)](https://travis-ci.org/mrackwitz/MRProgress)\n\nMRProgress is a collection of drop-in components that display a dimmed overlay with a blurred box view with an indicator and/or labels while work is being done in a background thread.\n\n[![](Images/screenshot_004_2.jpg)](Images/screenshot_004.png)\n[![](Images/screenshot_005_2.jpg)](Images/screenshot_005.png)\n[![](Images/screenshot_006_2.jpg)](Images/screenshot_006.png)\n[![](Images/screenshot_007_2.jpg)](Images/screenshot_007.png)\n[![](Images/screenshot_008_2.jpg)](Images/screenshot_008.png)\n[![](Images/screenshot_009_2.jpg)](Images/screenshot_009.png)\n[![](Images/screenshot_010_2.jpg)](Images/screenshot_010.png)\n\n* **Component oriented**: You don't have to use all components or `MRProgressOverlayView`. You can use just the custom activity indicators or progress views.\n* **Configurable**: All components implement tintColor.\n* **Customizable**: You can replace the given blur implementation and hook into your own you are maybe already using in other places of your app. Or simply throw in an [UIToolbar's layer](https://github.com/JagCesar/iOS-blur), if you prefer Apple's implementation. (Current blur implementation is as given by sample code of WWDC 2013.)\n* **Reusable**: The code is fragmented in small reusable pieces.\n* **Well documented**: You can install and open Appledoc documentation.\n* **Integrated**: It offers an integration into [AFNetworking](https://github.com/AFNetworking/AFNetworking).\n* **Accessible**: It provides labels, traits and events for UIAccessibility.\n\n\n## Components\n\nThe components used in `MRProgressOverlayView` could be used seperately.\nThe provided Example app demonstrates how they can be used.\n\n### `MRProgressOverlayView`\n\n![](Images/screenshot_004_1.jpg)\n\n* Supports different modes\n* Animated show and hide\n* Blured background\n* With UIMotionEffects for tilting like `UIAlertView`\n* Supports multi-line title label text\n\n\n### `MRCircularProgressView`\n\n![](Images/circular_determinate.gif)\n![](Images/screenshot_002_1.jpg)\n\n* Tint color can be changed\n* Circular progress view like in AppStore\n* Can display a stop button\n* Animated with `CABasicAnimation`\n* Percentage label change is animated over a `NSTimer`\n\n\n### `MRNavigationBarProgressView`\n\n![](Images/screenshot_003_1.jpg)\n\n* Display a progress view in a `UINavigationController`\n* Hooks `UINavigationControllerDelegate` and is automatically removed on push or pop\n* Can be used in `UINavigationBar` or `UIToolbar`\n\n\n### `MRCheckmarkIconView` and `MRCrossIconView`\n\n![](Images/screenshot_011_1.jpg)\n\n* Tint color can be changed\n* Scalable\n* Animatable\n* Backed by `CAShapeLayer`\n\n\n### `MRActivityIndicatorView`\n\n![](Images/circular_indeterminate.gif)\n\n* Tint color can be changed\n* Same API as `UIActivityIndicatorView`\n* Can display a stop button\n* Animated with `CABasicAnimation`\n\n\n\n## Installation\n\n### Cocoapods\n\n[CocoaPods](http://www.cocoapods.org) is the recommended way to add MRProgress to your project.\n\n1. Add a pod entry for MRProgress to your *Podfile* `pod 'MRProgress'`.\n2. Install the pod(s) by running `pod install`.\n3. Include MRProgress wherever you need it with `#import \"MRProgress.h\"`.\n\n\n### Source files\n\n1. Download the [latest code version](http://github.com/mrackwitz/MRProgress/archive/master.zip) or add the repository as a git submodule to your git-tracked project.\n2. Drag and drop the **src** directory from the archive in your project navigator. Make sure to select *Copy items* when asked if you extracted the code archive outside of your project.\n3. Include MRProgress wherever you need any component with `#import \"MRProgress.h\"`.\n\n\n### Static library\n\n1. Drag and drop **MRProgress.xcodeproj** in your project navigator.\n2. Select your target and go to the *Build Phases* tab. In the *Link Binary With Libraries* section select the add button. On the sheet find and add libMRProgress.a.\n3. Add Target **MRProgress** to your *Target Dependencies* list.\n4. `import <MRProgress/MRProgress.h>` whereever you want to use the components. You could add it to your Prefix header file, if you want.\n\n\n### Cocoapods - Subspecs\n\nThe library is cut in small subspecs, so that you can just depend on selected components. See the following dependency tree:\n\n```\n─┬─MRProgress/\n │\n ├───Blur\n │\n ├───ActivityIndicator\n │\n ├───Circular\n │\n ├───Icons\n │\n ├───NavigationBarProgress\n │\n ├─┬─Overlay\n │ ├───ActivityIndicator\n │ ├───Circular\n │ ├───Icons\n │ └───Blur\n |\n ├─┬─AFNetworking (optional)\n │ ├───ActivityIndicator\n │ ├───Circular\n │ ├───NavigationBarProgress\n │ └───Overlay\n |\n ├───MethodCopier (optional)\n │\n ├───MessageInterceptor (optional)\n │\n └───WeakProxy (optional)\n```\n\nThe tree only list *public* specs, where you can rely on.\nYou will see in the podspec and your Podfile.lock other subspecs, but you should\n*NOT* rely on these. Those are implementation details, which are subject to\nchange and may been removed, even with a minor version update.\nFurthermore this tree doesn't show any cross-dependencies, which do exist.\n\n\n## Requirements\n\n* Xcode 5\n* iOS 7\n* ARC\n* Frameworks:\n    * QuartzCore\n    * CoreGraphics\n    * Accelerate\n\n\n\n## Usage\n\nCheck out the provided demo app for many examples how you can use the components.\nMake sure you also see [MRProgress documentation on Cocoadocs](http://cocoadocs.org/docsets/MRProgress/).\n\n### Basics\n\n1. Add the following import to the top of the file or to your Prefix header:\n\n   ```objc\n   // If used with Cocoapods\n   #import \"MRProgress.h\"\n   ```\n\n   ```objc\n   // If used as Framework\n   #import <MRProgress/MRProgress.h>\n   ```\n\n2. Use one the following ways to display the overlay:\n\n   ```objc\n   // Block whole window\n   [MRProgressOverlayView showOverlayAddedTo:self.window animated:YES];\n   ```\n\n   ```objc\n   // Block only the navigation controller\n   [MRProgressOverlayView showOverlayAddedTo:self.navigationController.view animated:YES];\n   ```\n\n   ```objc\n   // Block only the view\n   [MRProgressOverlayView showOverlayAddedTo:self.view animated:YES];\n   ```\n\n   ```objc\n   // Block a custom view\n   [MRProgressOverlayView showOverlayAddedTo:self.imageView animated:YES];\n   ```\n\n3. Simply dismiss after complete your task:\n\n   ```objc\n   // Dismiss\n   [MRProgressOverlayView dismissOverlayForView:self.view animated:YES];\n   ```\n\n### AFNetworking\n\nMRProgress offers an integration into the network library AFNetworking.\n\n1. Include the following **additional** line into your Podfile:\n\n   ```ruby\n   pod 'MRProgress/AFNetworking'\n   ```\n\n2. Import the adequate category header for the component you want to use:\n\n   ```objc\n   #import <MRProgress/MRProgressOverlayView+AFNetworking.h>\n   ```\n\n3. You can now just setup your task / operation as usual and use the category\n   methods to bind to execution state and progress as shown below.\n\n   ```objc\n   // Init the progress overlay as usual\n   MRProgressOverlayView *overlayView = [MRProgressOverlayView showOverlayAddedTo:self.view animated:YES];\n\n   // The following line will do these things automatically:\n   // * Set mode to determinate when a download or upload is in progress\n   // * Set animated progress of the download or upload\n   // * Show a checkmark or cross pane at the end of the progress\n   [overlayView setModeAndProgressWithStateOfTask:task];\n\n   // Allows the user to cancel the task by using the provided stop button.\n   // If you use that, make sure that you handle the error code, which will be\n   // delivered to the failure block of the task like shown below:\n   //\n   //    if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {\n   //        NSLog(@\"Task was cancelled by user.\");\n   //        return;\n   //    }\n   //\n   [overlayView setStopBlockForTask:task];\n\n   // If you use the activity indicator directly\n   [self.activityIndicatorView setAnimatingWithStateOfTask:task];\n\n   // If you use one of the progress views directly\n   [self.circularProgressView setProgressWithUploadProgressOfTask:downloadTask animated:YES];   // for uploads\n   [self.circularProgressView setProgressWithDownloadProgressOfTask:downloadTask animated:YES]; // for downloads\n   [[MRNavigationBarProgressView progressViewForNavigationController:self.navigationController]\n     setProgressWithDownloadProgressOfTask:downloadTask animated:YES];\n   ```\n\n   All methods are available for both 'NSURLSessionTask' and 'AFURLConnectionOperation' and their descendants.\n   For further examples, make sure to also checkout the [Example app](/blob/master/Example/MRAFNetworkingSupportViewController.m).\n\n\n### Modes\n\nName (`MRProgressOverlayView<...>`)  | Screenshot                                                    | Description\n------------------------------------ | ------------------------------------------------------------- | :-----------\n**Indeterminate**                    | [![](Images/screenshot_004_2.jpg)](Images/screenshot_004.png) | Progress is shown using a large round activity indicator view. (`MRActivityIndicatorView`) This is the default.\n**DeterminateCircular**              | [![](Images/screenshot_005_2.jpg)](Images/screenshot_005.png) | Progress is shown using a round, pie-chart like, progress view. (`MRCircularProgressView`)\n**DeterminateHorizontalBar**         | [![](Images/screenshot_006_2.jpg)](Images/screenshot_006.png) | Progress is shown using a horizontal progress bar. (`UIProgressView`)\n**IndeterminateSmall**               | [![](Images/screenshot_007_2.jpg)](Images/screenshot_007.png) | Shows primarily a label. Progress is shown using a small activity indicator. (`MRActivityIndicatorView`)\n**IndeterminateSmallDefault**        | [![](Images/screenshot_008_2.jpg)](Images/screenshot_008.png) | Shows primarily a label. Progress is shown using a small activity indicator. (`UIActivityIndicatorView` in `UIActivityIndicatorViewStyleGray`)\n**Checkmark**                        | [![](Images/screenshot_009_2.jpg)](Images/screenshot_009.png) | Shows a checkmark. (`MRCheckmarkIconView`)\n**Cross**                            | [![](Images/screenshot_010_2.jpg)](Images/screenshot_010.png) | Shows a cross. (`MRCrossIconView`)\n\n\n\n## Credits\n\nMRProgress' API was inspired by [MBProgressHUD](https://github.com/jdg/MBProgressHUD) project.\n\nThe acquarium image was stolen by [Jag Cesar's blur implementation](https://github.com/JagCesar/iOS-blur).\n\nYou can find me on Twitter @mrackwitz.\n\n\n\n## License\n\nCopyright (c) 2013 Marius Rackwitz git@mariusrackwitz.de\n\nThe MIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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"
  },
  {
    "path": "Modified Pods/MRProgress/src/Blur/MRBlurView.h",
    "content": "//\n//  MRBlurView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n/**\n Blur implementation, which displays a blurred image screenshot of the window cropped to its absolute frame.\n Hides it superview on redraw, temporarily.\n */\n@interface MRBlurView : UIImageView\n\n/**\n Force redraw\n */\n- (void)redraw;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Blur/MRBlurView.m",
    "content": "//\n//  MRBlurView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <QuartzCore/QuartzCore.h>\n#import <CoreGraphics/CoreGraphics.h>\n#import \"MRBlurView.h\"\n#import \"UIImage+MRImageEffects.h\"\n#import \"MRProgressHelper.h\"\n\n\n@interface MRBlurView ()\n\n@property (nonatomic, assign) BOOL redrawOnFrameChange;\n\n@end\n\n\n@implementation MRBlurView\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (void)commonInit {\n    [self setPlaceholder];\n    self.clipsToBounds = YES;\n    [self registerForNotificationCenter];\n}\n\n- (void)dealloc {\n    [self unregisterFromNotificationCenter];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    if (self.redrawOnFrameChange) {\n        self.redrawOnFrameChange = NO;\n        dispatch_async(dispatch_get_main_queue(), ^{\n            [self redraw];\n        });\n    }\n}\n\n- (void)didMoveToSuperview {\n    [super didMoveToSuperview];\n    // See `didMoveToWindow`\n    if (self.window) {\n        [self redraw];\n    }\n}\n\n- (void)didMoveToWindow {\n    [super didMoveToWindow];\n    // As the documentation states: The window property may be nil by the time that this method is called\n    if (self.window) {\n        // This is needed e.g. for the push animation of UINavigationController.\n        CFTimeInterval timeInterval = CATransaction.animationDuration > 0 ? CATransaction.animationDuration : 0.25;\n        dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeInterval * NSEC_PER_SEC));\n        dispatch_after(time, dispatch_get_main_queue(), ^{\n            [self redraw];\n        });\n    }\n}\n\n\n#pragma mark - Notifications\n\n- (void)registerForNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center addObserver:self\n               selector:@selector(statusBarOrientationDidChange:)\n                   name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];\n}\n\n- (void)unregisterFromNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center removeObserver:self];\n}\n\n- (void)statusBarOrientationDidChange:(NSNotification *)notification {\n    self.redrawOnFrameChange = YES;\n}\n\n\n#pragma mark - Redraw\n\n- (void)setPlaceholder {\n    self.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.96];\n}\n\n- (void)clearPlaceholder {\n    self.backgroundColor = UIColor.clearColor;\n}\n\n- (void)redraw {\n    #if DEBUG\n        if (!NSThread.isMainThread) {\n            NSLog(@\"** WARNING - %@ -%@ should be always called on the main thread!\",\n                  NSStringFromClass(self.class),\n                  NSStringFromSelector(_cmd));\n        }\n    #endif\n    \n    // This has to happen on the main queue, as the view hierachy will be redrawn.\n//    __block UIImage *image = self.snapshot;\n    \n    if (!self.image) {\n        [self setPlaceholder];\n    }\n    \n//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n//        image = [image mr_applyBlurWithRadius:30.0 tintColor:[UIColor colorWithWhite:0.97 alpha:0.82] saturationDeltaFactor:1.0 maskImage:nil];\n//        dispatch_async(dispatch_get_main_queue(), ^{\n//            // Fade on content's change, dependent if there was already an image.\n//            CATransition *transition = [CATransition new];\n//            transition.duration = self.image ? 0.3 : 0.1;\n//            transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];\n//            transition.type = kCATransitionFade;\n//            [self.layer addAnimation:transition forKey:nil];\n//            \n//            if (self.image) {\n//                [self clearPlaceholder];\n//            }\n//            \n//            self.image = image;\n//        });\n//    });\n}\n\n\n#pragma mark - Snapshot helper\n\n- (UIImage *)snapshot {\n    BOOL wasHidden = self.superview.hidden;\n    self.superview.hidden = YES;\n    \n    UIWindow *window = UIApplication.sharedApplication.delegate.window;\n    \n    // Absolute origin of receiver\n    CGPoint origin = self.bounds.origin;\n    if (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation)) {\n        origin = CGPointMake(origin.y, origin.x);\n    }\n    origin = [self convertPoint:origin toView:window];\n    CGSize size = self.frame.size;\n    \n    // Begin context (with device scale)\n    UIGraphicsBeginImageContextWithOptions(size, NO, 0);\n    const CGContextRef context = UIGraphicsGetCurrentContext();\n    \n    // Apply window tranforms\n    // Author: NSElvis\n    // Source: http://stackoverflow.com/a/8017292\n    CGContextTranslateCTM(context, window.center.x, window.center.y);\n    CGContextConcatCTM(context, window.transform);\n    CGContextTranslateCTM(context, -window.bounds.size.width  * window.layer.anchorPoint.x,\n                                   -window.bounds.size.height * window.layer.anchorPoint.y);\n    \n    // Rotate according to device orientation\n    CGContextRotateCTM(context, 2*M_PI - MRRotationForStatusBarOrientation());\n    \n    // Translate to draw at the absolute origin of the receiver\n    CGContextTranslateCTM(context, -origin.x, -origin.y);\n    \n    // Draw the window\n    [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];\n    \n    // Capture the image and exit context\n    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();\n    UIGraphicsEndImageContext();\n    \n    self.superview.hidden = wasHidden;\n    \n    return image;\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Blur/UIImage+MRImageEffects.h",
    "content": "//\n//  UIImage+MRImageEffects.m\n//  MRProgress\n//\n//  Modified by Marius Rackwitz on 22.10.13.\n//  based on:\n//  https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip\n//\n/*\n File: UIImage+ImageEffects.h\n Abstract: This is a category of UIImage that adds methods to apply blur and tint effects to an image. This is the code you’ll want to look out to find out how to use vImage to efficiently calculate a blur.\n Version: 1.0\n \n Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple\n Inc. (\"Apple\") in consideration of your agreement to the following\n terms, and your use, installation, modification or redistribution of\n this Apple software constitutes acceptance of these terms.  If you do\n not agree with these terms, please do not use, install, modify or\n redistribute this Apple software.\n \n In consideration of your agreement to abide by the following terms, and\n subject to these terms, Apple grants you a personal, non-exclusive\n license, under Apple's copyrights in this original Apple software (the\n \"Apple Software\"), to use, reproduce, modify and redistribute the Apple\n Software, with or without modifications, in source and/or binary forms;\n provided that if you redistribute the Apple Software in its entirety and\n without modifications, you must retain this notice and the following\n text and disclaimers in all such redistributions of the Apple Software.\n Neither the name, trademarks, service marks or logos of Apple Inc. may\n be used to endorse or promote products derived from the Apple Software\n without specific prior written permission from Apple.  Except as\n expressly stated in this notice, no other rights or licenses, express or\n implied, are granted by Apple herein, including but not limited to any\n patent rights that may be infringed by your derivative works or by other\n works in which the Apple Software may be incorporated.\n \n The Apple Software is provided by Apple on an \"AS IS\" basis.  APPLE\n MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION\n THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS\n FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\n OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n \n IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\n OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\n MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\n AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\n STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE.\n \n Copyright (C) 2013 Apple Inc. All Rights Reserved.\n \n \n Copyright © 2013 Apple Inc. All rights reserved.\n WWDC 2013 License\n \n NOTE: This Apple Software was supplied by Apple as part of a WWDC 2013\n Session. Please refer to the applicable WWDC 2013 Session for further\n information.\n \n IMPORTANT: This Apple software is supplied to you by Apple Inc.\n (\"Apple\") in consideration of your agreement to the following terms, and\n your use, installation, modification or redistribution of this Apple\n software constitutes acceptance of these terms. If you do not agree with\n these terms, please do not use, install, modify or redistribute this\n Apple software.\n \n In consideration of your agreement to abide by the following terms, and\n subject to these terms, Apple grants you a non-exclusive license, under\n Apple's copyrights in this original Apple software (the \"Apple\n Software\"), to use, reproduce, modify and redistribute the Apple\n Software, with or without modifications, in source and/or binary forms;\n provided that if you redistribute the Apple Software in its entirety and\n without modifications, you must retain this notice and the following\n text and disclaimers in all such redistributions of the Apple Software.\n Neither the name, trademarks, service marks or logos of Apple Inc. may\n be used to endorse or promote products derived from the Apple Software\n without specific prior written permission from Apple. Except as\n expressly stated in this notice, no other rights or licenses, express or\n implied, are granted by Apple herein, including but not limited to any\n patent rights that may be infringed by your derivative works or by other\n works in which the Apple Software may be incorporated.\n \n The Apple Software is provided by Apple on an \"AS IS\" basis. APPLE MAKES\n NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE\n IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\n OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n \n IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\n OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\n MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\n AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\n STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE.\n \n EA1002\n 5/3/2013\n */\n\n#import <UIKit/UIKit.h>\n\n\n/**\n Helper to apply effects to images.\n */\n@interface UIImage (MRImageEffects)\n\n/**\n Blur, tint and change saturation of CGImage-backed receiver\n \n @param blurRadius The Gaussian radius which specifies the blur intensity. No blur is applied, if you specify 0 as\n value.\n @param tintColor The tint color to apply in last step to the result image. (optional)\n @param saturationDeltaFactor A value above 0.0 and below 1.0 desaturate the result image, which means the colorfulness\n will be reduced. A value above 1.0 increase the saturation. Specify 1.0 to do not apply a saturation change.\n @param maskImage CGImage-backed mask that specify which part of the result image should not be blured. (optional)\n */\n- (UIImage *)mr_applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Blur/UIImage+MRImageEffects.m",
    "content": "//\n//  UIImage+MRImageEffects.m\n//  MRProgress\n//\n//  Modified by Marius Rackwitz on 22.10.13.\n//  based on:\n//  https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip\n//\n/*\n File: UIImage+ImageEffects.m\n Abstract: This is a category of UIImage that adds methods to apply blur and tint effects to an image. This is the code you’ll want to look out to find out how to use vImage to efficiently calculate a blur.\n Version: 1.0\n \n Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple\n Inc. (\"Apple\") in consideration of your agreement to the following\n terms, and your use, installation, modification or redistribution of\n this Apple software constitutes acceptance of these terms.  If you do\n not agree with these terms, please do not use, install, modify or\n redistribute this Apple software.\n \n In consideration of your agreement to abide by the following terms, and\n subject to these terms, Apple grants you a personal, non-exclusive\n license, under Apple's copyrights in this original Apple software (the\n \"Apple Software\"), to use, reproduce, modify and redistribute the Apple\n Software, with or without modifications, in source and/or binary forms;\n provided that if you redistribute the Apple Software in its entirety and\n without modifications, you must retain this notice and the following\n text and disclaimers in all such redistributions of the Apple Software.\n Neither the name, trademarks, service marks or logos of Apple Inc. may\n be used to endorse or promote products derived from the Apple Software\n without specific prior written permission from Apple.  Except as\n expressly stated in this notice, no other rights or licenses, express or\n implied, are granted by Apple herein, including but not limited to any\n patent rights that may be infringed by your derivative works or by other\n works in which the Apple Software may be incorporated.\n \n The Apple Software is provided by Apple on an \"AS IS\" basis.  APPLE\n MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION\n THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS\n FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\n OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n \n IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\n OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\n MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\n AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\n STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE.\n \n Copyright (C) 2013 Apple Inc. All Rights Reserved.\n \n \n Copyright © 2013 Apple Inc. All rights reserved.\n WWDC 2013 License\n \n NOTE: This Apple Software was supplied by Apple as part of a WWDC 2013\n Session. Please refer to the applicable WWDC 2013 Session for further\n information.\n \n IMPORTANT: This Apple software is supplied to you by Apple Inc.\n (\"Apple\") in consideration of your agreement to the following terms, and\n your use, installation, modification or redistribution of this Apple\n software constitutes acceptance of these terms. If you do not agree with\n these terms, please do not use, install, modify or redistribute this\n Apple software.\n \n In consideration of your agreement to abide by the following terms, and\n subject to these terms, Apple grants you a non-exclusive license, under\n Apple's copyrights in this original Apple software (the \"Apple\n Software\"), to use, reproduce, modify and redistribute the Apple\n Software, with or without modifications, in source and/or binary forms;\n provided that if you redistribute the Apple Software in its entirety and\n without modifications, you must retain this notice and the following\n text and disclaimers in all such redistributions of the Apple Software.\n Neither the name, trademarks, service marks or logos of Apple Inc. may\n be used to endorse or promote products derived from the Apple Software\n without specific prior written permission from Apple. Except as\n expressly stated in this notice, no other rights or licenses, express or\n implied, are granted by Apple herein, including but not limited to any\n patent rights that may be infringed by your derivative works or by other\n works in which the Apple Software may be incorporated.\n \n The Apple Software is provided by Apple on an \"AS IS\" basis. APPLE MAKES\n NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE\n IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND\n OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.\n \n IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL\n OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,\n MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED\n AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),\n STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE.\n \n EA1002\n 5/3/2013\n */\n\n#import \"UIImage+MRImageEffects.h\"\n#import <CoreGraphics/CoreGraphics.h>\n#import <Accelerate/Accelerate.h>\n\n\nvImage_Buffer vImageBuffer_InitWithCGContext(CGContextRef contextRef) {\n    return (vImage_Buffer){\n        .width = CGBitmapContextGetWidth(contextRef),\n        .height = CGBitmapContextGetHeight(contextRef),\n        .rowBytes = CGBitmapContextGetBytesPerRow(contextRef),\n        .data = CGBitmapContextGetData(contextRef),\n    };\n}\n\n\n@implementation UIImage (MRImageEffects)\n\n- (UIImage *)mr_applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage {\n    NSAssert(self.size.width > 0 && self.size.height > 0, @\"Size must be positive: Both dimensions msut be >= 1.\");\n    NSAssert(self.CGImage != nil, @\"image must be backed by a CGImage.\");\n    NSAssert(!maskImage || maskImage.CGImage, @\"maskImage, if given, must be backed by a CGImage.\");\n    \n    UIImage *image = self;\n    const CGRect rect = {CGPointZero, image.size};\n    const CGFloat scale = UIScreen.mainScreen.scale;\n    \n    const BOOL hasBlur = blurRadius > __FLT_EPSILON__;\n    const BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__;\n    \n    if (hasBlur || hasSaturationChange) {\n        UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);\n        CGContextRef inputContext = UIGraphicsGetCurrentContext();\n        [image drawAtPoint:CGPointZero];\n        \n        vImage_Buffer inputBuffer = vImageBuffer_InitWithCGContext(inputContext);\n        \n        UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);\n        vImage_Buffer outputBuffer = vImageBuffer_InitWithCGContext(UIGraphicsGetCurrentContext());\n        \n        if (hasBlur) {\n            // A description of how to compute the box kernel width from the Gaussian\n            // radius (aka standard deviation) appears in the SVG spec:\n            // http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement\n            //\n            // For larger values of 's' (s >= 2.0), an approximation can be used: Three\n            // successive box-blurs build a piece-wise quadratic convolution kernel, which\n            // approximates the Gaussian kernel to within roughly 3%.\n            //\n            // let d = floor(s * 3*sqrt(2*pi)/4 + 0.5)\n            //\n            // ... if d is odd, use three box-blurs of size 'd', centered on the output pixel.\n            //\n            CGFloat inputRadius = blurRadius * 1;\n            uint32_t radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5);\n            if (radius % 2 != 1) {\n                radius += 1; // force radius to be odd so that the three box-blur methodology works.\n            }\n            \n            vImageBoxConvolve_ARGB8888(&inputBuffer,  &outputBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);\n            vImageBoxConvolve_ARGB8888(&outputBuffer, &inputBuffer,  NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);\n            vImageBoxConvolve_ARGB8888(&inputBuffer,  &outputBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);\n            \n            // Swap input & output\n            vImage_Buffer tempBuffer = inputBuffer;\n            inputBuffer = outputBuffer;\n            outputBuffer = tempBuffer;\n        }\n        \n        if (hasSaturationChange) {\n            CGFloat s = saturationDeltaFactor;\n            CGFloat floatingPointSaturationMatrix[] = {\n                0.0722 + 0.9278 * s,  0.0722 - 0.0722 * s,  0.0722 - 0.0722 * s,  0,\n                0.7152 - 0.7152 * s,  0.7152 + 0.2848 * s,  0.7152 - 0.7152 * s,  0,\n                0.2126 - 0.2126 * s,  0.2126 - 0.2126 * s,  0.2126 + 0.7873 * s,  0,\n                0,                    0,                    0,  1,\n            };\n            \n            const int32_t divisor = 256;\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wbad-function-cast\"\n#pragma clang diagnostic ignored \"-Wvla\"\n            // Convert saturation matrix from float to int\n            NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);\n            int16_t saturationMatrix[matrixSize];\n            for (NSUInteger i = 0; i < matrixSize; ++i) {\n                saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);\n            }\n#pragma clang diagnostic pop\n            vImageMatrixMultiply_ARGB8888(&inputBuffer, &outputBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);\n        }\n        \n        if (!hasBlur) {\n            image = UIGraphicsGetImageFromCurrentImageContext();\n        }\n        UIGraphicsEndImageContext();\n        \n        if (hasBlur) {\n            image = UIGraphicsGetImageFromCurrentImageContext();\n        }\n        UIGraphicsEndImageContext();\n    }\n    \n    // Set up output context.\n    UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);\n    CGContextRef outputContext = UIGraphicsGetCurrentContext();\n    \n    // Draw base image.\n    [self drawAtPoint:rect.origin];\n    \n    // Draw effect image.\n    if (hasBlur) {\n        CGContextSaveGState(outputContext);\n        if (maskImage) {\n            CGContextClipToMask(outputContext, rect, maskImage.CGImage);\n        }\n        [image drawAtPoint:rect.origin];\n        CGContextRestoreGState(outputContext);\n    }\n    \n    // Add in color tint.\n    if (tintColor) {\n        CGContextSaveGState(outputContext);\n        CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);\n        CGContextFillRect(outputContext, rect);\n        CGContextRestoreGState(outputContext);\n    }\n    \n    // Output image is ready.\n    image = UIGraphicsGetImageFromCurrentImageContext();\n    UIGraphicsEndImageContext();\n    \n    return image;\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRActivityIndicatorView.h",
    "content": "//\n//  MRActivityIndicatorView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"MRStopableView.h\"\n\n\n/**\n Use an activity indicator to show that a task is in progress. An activity indicator appears as a circle slice that is\n either spinning or stopped.\n */\n@interface MRActivityIndicatorView : UIView<MRStopableView> {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wobjc-interface-ivars\"\n@package\n    BOOL _animating;\n#pragma clang diagnostic pop\n}\n\n/**\n A float value to indicate how thick the line of the activivity indicator is.\n \n The default value is 2.f. \n */\n@property (nonatomic) CGFloat lineWidth UI_APPEARANCE_SELECTOR;\n\n/**\n A Boolean value that controls whether the receiver is hidden when the animation is stopped.\n \n If the value of this property is YES (the default), the receiver sets its hidden property (UIView) to YES when receiver\n is not animating. If the hidesWhenStopped property is NO, the receiver is not hidden when animation stops. You stop an\n animating progress indicator with the stopAnimating method.\n */\n@property(nonatomic) BOOL hidesWhenStopped;\n\n/**\n Starts the animation of the progress indicator.\n \n When the progress indicator is animated, the gear spins to indicate indeterminate progress. The indicator is animated\n until stopAnimating is called.\n */\n- (void)startAnimating;\n\n/**\n Stops the animation of the progress indicator.\n \n Call this method to stop the animation of the progress indicator started with a call to startAnimating. When animating\n is stopped, the indicator is hidden, unless hidesWhenStopped is NO.\n */\n- (void)stopAnimating;\n\n/**\n Returns whether the receiver is animating.\n\n @return YES if the receiver is animating, otherwise NO.\n */\n- (BOOL)isAnimating;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRActivityIndicatorView.m",
    "content": "//\n//  MRActivityIndicatorView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <QuartzCore/QuartzCore.h>\n#import \"MRActivityIndicatorView.h\"\n#import \"MRStopButton.h\"\n\n\nstatic NSString *const MRActivityIndicatorViewSpinAnimationKey = @\"MRActivityIndicatorViewSpinAnimationKey\";\n\n\n@interface MRActivityIndicatorView ()\n\n@property (nonatomic, weak) CAShapeLayer *shapeLayer;\n@property (nonatomic, weak, readwrite) MRStopButton *stopButton;\n\n@end\n\n\n@implementation MRActivityIndicatorView\n\n@synthesize stopButton = _stopButton;\n\n+ (void)load {\n    [self.appearance setLineWidth:2.0];\n}\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (void)commonInit {\n    self.isAccessibilityElement = YES;\n    self.accessibilityLabel = NSLocalizedString(@\"Indeterminate Progress\", @\"Accessibility label for activity indicator view\");\n    \n    self.hidesWhenStopped = YES;\n    \n    CAShapeLayer *shapeLayer = [CAShapeLayer new];\n    shapeLayer.borderWidth = 0;\n    shapeLayer.fillColor = UIColor.clearColor.CGColor;\n    [self.layer addSublayer:shapeLayer];\n    self.shapeLayer = shapeLayer;\n    \n    MRStopButton *stopButton = [MRStopButton new];\n    [self addSubview:stopButton];\n    self.stopButton = stopButton;\n    \n    self.mayStop = NO;\n    \n    [self tintColorDidChange];\n}\n\n- (void)dealloc {\n    [self unregisterFromNotificationCenter];\n}\n\n\n#pragma mark - Notifications\n\n- (void)registerForNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];\n    [center addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];\n}\n\n- (void)unregisterFromNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center removeObserver:self];\n}\n\n- (void)applicationDidEnterBackground:(NSNotification *)note {\n    [self removeAnimation];\n}\n\n- (void)applicationWillEnterForeground:(NSNotification *)note {\n    if (self.isAnimating) {\n        [self addAnimation];\n    }\n}\n\n\n#pragma mark - Layout\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    CGRect frame = self.bounds;\n    if (ABS(frame.size.width - frame.size.height) < CGFLOAT_MIN) {\n        // Ensure that we have a square frame\n        CGFloat s = MIN(frame.size.width, frame.size.height);\n        frame.size.width = s;\n        frame.size.height = s;\n    }\n    self.shapeLayer.frame = frame;\n    \n    self.shapeLayer.path = [self layoutPath].CGPath;\n    \n    self.stopButton.frame = [self.stopButton frameThatFits:self.bounds];\n}\n\n- (UIBezierPath *)layoutPath {\n    const double TWO_M_PI = 2.0*M_PI;\n    double startAngle = 0.75 * TWO_M_PI;\n    double endAngle = startAngle + TWO_M_PI * 0.9;\n    \n    CGFloat width = self.bounds.size.width;\n    return [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f)\n                                          radius:width/2.2f\n                                      startAngle:startAngle\n                                        endAngle:endAngle\n                                       clockwise:YES];\n}\n\n\n#pragma mark - Hook tintColor\n\n- (void)tintColorDidChange  {\n    [super tintColorDidChange];\n    self.shapeLayer.strokeColor = self.tintColor.CGColor;\n    self.stopButton.tintColor = self.tintColor;\n}\n\n\n#pragma mark - Line width\n\n- (void)setLineWidth:(CGFloat)width {\n    self.shapeLayer.lineWidth = width;\n}\n\n- (CGFloat)lineWidth {\n    return self.shapeLayer.lineWidth;\n}\n\n\n#pragma mark - MRStopableView's implementation\n\n- (void)setMayStop:(BOOL)mayStop {\n    self.stopButton.hidden = !mayStop;\n}\n\n- (BOOL)mayStop {\n    return !self.stopButton.hidden;\n}\n\n\n#pragma mark - Control animation\n\n- (void)startAnimating {\n    if (_animating) {\n        return;\n    }\n    \n    _animating = YES;\n    \n    [self registerForNotificationCenter];\n    \n    [self addAnimation];\n    \n    if (self.hidesWhenStopped) {\n        self.hidden = NO;\n    }\n}\n\n- (void)stopAnimating {\n    if (!_animating) {\n        return;\n    }\n    \n    _animating = NO;\n    \n    [self unregisterFromNotificationCenter];\n    \n    [self removeAnimation];\n    \n    if (self.hidesWhenStopped) {\n        self.hidden = YES;\n    }\n}\n\n- (BOOL)isAnimating {\n    return _animating;\n}\n\n\n#pragma mark - Add and remove animation\n\n- (void)addAnimation {\n    CABasicAnimation *spinAnimation = [CABasicAnimation animationWithKeyPath:@\"transform.rotation\"];\n    spinAnimation.toValue        = @(1*2*M_PI);\n    spinAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];\n    spinAnimation.duration       = 1.0;\n    spinAnimation.repeatCount    = INFINITY;\n    [self.shapeLayer addAnimation:spinAnimation forKey:MRActivityIndicatorViewSpinAnimationKey];\n}\n\n- (void)removeAnimation {\n    [self.shapeLayer removeAnimationForKey:MRActivityIndicatorViewSpinAnimationKey];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRCircularProgressView.h",
    "content": "//\n//  MRCircularProgressView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"MRProgressView.h\"\n#import \"MRStopableView.h\"\n\n\n/**\n You use the MRCircularProgressView class to depict the progress of a task over time.\n */\n@interface MRCircularProgressView : MRProgressView<MRStopableView>\n\n/**\n Value label.\n \n The label where the current progress is displayed, if the receiver's property mayStop has the value NO.\n */\n@property (nonatomic, weak, readonly) UILabel *valueLabel;\n\n/**\n Current progress.\n \n Use associated setter for non animated changes. Otherwises use setProgress:animated:.\n */\n@property(nonatomic, assign) UIEdgeInsets hitTestEdgeInsets;\n\n/**\n Duration of an animated progress change.\n \n Default is 0.3s. Must be larger than zero.\n */\n@property (nonatomic, assign) CFTimeInterval animationDuration UI_APPEARANCE_SELECTOR;\n\n/**\n The line width of the outer circle\n \n Default is 2.0. Must be larger than zero.\n */\n@property (nonatomic, assign) CGFloat borderWidth UI_APPEARANCE_SELECTOR;\n\n/**\n The line width of the inner circle\n \n Default is 2.0. Must be larger than zero.\n */\n@property (nonatomic, assign) CGFloat lineWidth UI_APPEARANCE_SELECTOR;\n\n/**\n Change progress animated.\n \n The animation will be always linear.\n \n @param progress The new progress value.\n \n @param animated Specify YES to animate the change or NO if you do not want the change to be animated.\n */\n- (void)setProgress:(float)progress animated:(BOOL)animated;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRCircularProgressView.m",
    "content": "//\n//  MRCircularProgressView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 10.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <QuartzCore/QuartzCore.h>\n#import \"MRCircularProgressView.h\"\n#import \"MRProgressHelper.h\"\n#import \"MRStopButton.h\"\n\n\nstatic NSString *const MRCircularProgressViewProgressAnimationKey = @\"MRCircularProgressViewProgressAnimationKey\";\n\n\n@interface MRCircularProgressView ()\n\n@property (nonatomic, strong, readwrite) NSNumberFormatter *numberFormatter;\n@property (nonatomic, strong, readwrite) NSTimer *valueLabelUpdateTimer;\n\n@property (nonatomic, weak, readwrite) UILabel *valueLabel;\n@property (nonatomic, weak, readwrite) MRStopButton *stopButton;\n\n@end\n\n\n@implementation MRCircularProgressView {\n    int _valueLabelProgressPercentDifference;\n}\n\n@synthesize stopButton = _stopButton;\n\n+ (void)load {\n    [self.appearance setAnimationDuration:0.3];\n    [self.appearance setBorderWidth:2.0];\n    [self.appearance setLineWidth:2.0];\n}\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n+ (Class)layerClass {\n    return CAShapeLayer.class;\n}\n\n- (CAShapeLayer *)shapeLayer {\n    return (CAShapeLayer *)self.layer;\n}\n\n- (void)commonInit {\n    self.isAccessibilityElement = YES;\n    self.accessibilityLabel = NSLocalizedString(@\"Determinate Progress\", @\"Accessibility label for circular progress view\");\n    self.accessibilityTraits = UIAccessibilityTraitUpdatesFrequently;\n    \n    NSNumberFormatter *numberFormatter = [NSNumberFormatter new];\n    self.numberFormatter = numberFormatter;\n    numberFormatter.numberStyle = NSNumberFormatterPercentStyle;\n    numberFormatter.locale = NSLocale.currentLocale;\n    \n    self.shapeLayer.fillColor = UIColor.clearColor.CGColor;\n    \n    UILabel *valueLabel = [UILabel new];\n    self.valueLabel = valueLabel;\n    valueLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];\n    valueLabel.textColor = UIColor.blackColor;\n    valueLabel.textAlignment = NSTextAlignmentCenter;\n    [self addSubview:valueLabel];\n    \n    MRStopButton *stopButton = [MRStopButton new];\n    [self addSubview:stopButton];\n    self.stopButton = stopButton;\n    \n    self.mayStop = NO;\n    \n    self.progress = 0;\n    \n    [self tintColorDidChange];\n}\n\n\n#pragma mark - Properties\n\n- (CGFloat)borderWidth {\n    return self.shapeLayer.borderWidth;\n}\n\n- (void)setBorderWidth:(CGFloat)borderWidth {\n    self.shapeLayer.borderWidth = borderWidth;\n}\n\n- (CGFloat)lineWidth {\n    return self.shapeLayer.lineWidth;\n}\n\n- (void)setLineWidth:(CGFloat)lineWidth {\n    self.shapeLayer.lineWidth = lineWidth;\n}\n\n\n#pragma mark - Layout\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    const CGFloat offset = 4;\n    CGRect valueLabelRect = self.bounds;\n    valueLabelRect.origin.x += offset;\n    valueLabelRect.size.width -= 2*offset;\n    self.valueLabel.frame = valueLabelRect;\n    \n    self.layer.cornerRadius = self.frame.size.width / 2.0f;\n    self.shapeLayer.path = [self layoutPath].CGPath;\n    \n    self.stopButton.frame = [self.stopButton frameThatFits:self.bounds];\n}\n\n- (UIBezierPath *)layoutPath {\n    const double TWO_M_PI = 2.0 * M_PI;\n    const double startAngle = 0.75 * TWO_M_PI;\n    const double endAngle = startAngle + TWO_M_PI;\n    \n    CGFloat width = self.frame.size.width;\n    CGFloat borderWidth = self.layer.borderWidth;\n    CGFloat lineWidth = self.lineWidth;\n    return [UIBezierPath bezierPathWithArcCenter:CGPointMake(width/2.0f, width/2.0f)\n                                          radius:width/2.0f - lineWidth/2.0f - borderWidth/2.0f\n                                      startAngle:startAngle\n                                        endAngle:endAngle\n                                       clockwise:YES];\n}\n\n\n#pragma mark - Hook tintColor\n\n- (void)tintColorDidChange {\n    [super tintColorDidChange];\n    UIColor *tintColor = self.tintColor;\n    self.shapeLayer.strokeColor = tintColor.CGColor;\n    self.layer.borderColor = tintColor.CGColor;\n    self.valueLabel.textColor = tintColor;\n    self.stopButton.tintColor = tintColor;\n}\n\n\n#pragma mark - MRStopableView's implementation\n\n- (void)setMayStop:(BOOL)mayStop {\n    self.stopButton.hidden = !mayStop;\n    self.valueLabel.hidden = mayStop;\n}\n\n- (BOOL)mayStop {\n    return !self.stopButton.hidden;\n}\n\n\n#pragma mark - Control progress\n\n- (void)setProgress:(float)progress {\n    NSParameterAssert(progress >= 0 && progress <= 1);\n    \n    [self stopAnimation];\n    \n    _progress = progress;\n    \n    [self updateProgress];\n}\n\n- (void)updateProgress {\n    [self updatePath];\n    [self updateLabel:self.progress];\n}\n\n- (void)updatePath {\n    self.shapeLayer.strokeEnd = self.progress;\n}\n\n- (void)updateLabel:(float)progress {\n    self.valueLabel.text = [self.numberFormatter stringFromNumber:@(progress)];\n    self.accessibilityValue = self.valueLabel.text;\n}\n\n- (void)setProgress:(float)progress animated:(BOOL)animated {\n    if (animated) {\n        if (ABS(self.progress - progress) < CGFLOAT_MIN) {\n            return;\n        }\n        \n        [self animateToProgress:progress];\n    } else {\n        self.progress = progress;\n    }\n}\n\n- (void)setAnimationDuration:(CFTimeInterval)animationDuration {\n    NSParameterAssert(animationDuration > 0);\n    _animationDuration = animationDuration;\n}\n\n- (void)animateToProgress:(float)progress {\n    [self stopAnimation];\n    \n    // Add shape animation\n    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@\"strokeEnd\"];\n    animation.duration = self.animationDuration;\n    animation.fromValue = @(self.progress);\n    animation.toValue = @(progress);\n    animation.delegate = self;\n    animation.removedOnCompletion = NO;\n    animation.fillMode = kCAFillModeForwards;\n    [self.shapeLayer addAnimation:animation forKey:MRCircularProgressViewProgressAnimationKey];\n    \n    // Add timer to update valueLabel\n    _valueLabelProgressPercentDifference = (progress - self.progress) * 100;\n    CFTimeInterval timerInterval =  self.animationDuration / ABS(_valueLabelProgressPercentDifference);\n    self.valueLabelUpdateTimer = [NSTimer scheduledTimerWithTimeInterval:timerInterval\n                                                                  target:self\n                                                                selector:@selector(onValueLabelUpdateTimer:)\n                                                                userInfo:nil\n                                                                 repeats:YES];\n    \n    \n    _progress = progress;\n}\n\n- (void)stopAnimation {\n    // Stop running animation\n    [self.layer removeAnimationForKey:MRCircularProgressViewProgressAnimationKey];\n    \n    // Stop timer\n    [self.valueLabelUpdateTimer invalidate];\n    self.valueLabelUpdateTimer = nil;\n}\n\n- (void)onValueLabelUpdateTimer:(NSTimer *)timer {\n    if (_valueLabelProgressPercentDifference > 0) {\n        _valueLabelProgressPercentDifference--;\n    } else {\n        _valueLabelProgressPercentDifference++;\n    }\n    \n    [self updateLabel:self.progress - (_valueLabelProgressPercentDifference / 100.0f)];\n}\n\n\n- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event\n{\n    if(UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets, UIEdgeInsetsZero) || self.hidden) {\n        return [super pointInside:point withEvent:event];\n    }\n    \n    CGRect relativeFrame = self.bounds;\n    CGRect hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets);\n    \n    return CGRectContainsPoint(hitFrame, point);\n}\n\n#pragma mark - CAAnimationDelegate\n\n- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {\n    [self updateProgress];\n    [self stopAnimation];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRIconView.h",
    "content": "//\n//  MRIconView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 22.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n/**\n Base class for icons which are given by an UIBezierPath and drawn with a CAShapeLayer.\n Their circular outer border and their line is colored in their tintColor.\n */\n@interface MRIconView : UIView\n\n/**\n Inner path.\n */\n- (UIBezierPath *)path;\n\n@end\n\n\n/**\n Draws a checkmark.\n */\n@interface MRCheckmarkIconView : MRIconView\n\n@end\n\n\n/**\n Draws a cross.\n */\n@interface MRCrossIconView : MRIconView\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRIconView.m",
    "content": "//\n//  MRIconView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 22.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import \"MRIconView.h\"\n#import <QuartzCore/QuartzCore.h>\n\n\n@implementation MRIconView\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (UIBezierPath *)path {\n    return nil;\n}\n\n+ (Class)layerClass {\n    return CAShapeLayer.class;\n}\n\n- (CAShapeLayer *)shapeLayer {\n    return (CAShapeLayer *)self.layer;\n}\n\n- (void)commonInit {\n    self.isAccessibilityElement = YES;\n    \n    self.layer.borderWidth = 1.0f;\n    self.shapeLayer.lineWidth = 1.0f;\n    self.shapeLayer.fillColor = UIColor.clearColor.CGColor;\n    \n    [self tintColorDidChange];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    self.shapeLayer.path = self.path.CGPath;\n}\n\n- (void)tintColorDidChange {\n    [super tintColorDidChange];\n    UIColor *const tintColor = self.tintColor;\n    self.layer.borderColor = tintColor.CGColor;\n    self.shapeLayer.strokeColor = tintColor.CGColor;\n}\n\n- (void)setFrame:(CGRect)frame {\n    super.frame = frame;\n    self.layer.cornerRadius = frame.size.width / 2.0f;\n}\n\n@end\n\n\n@implementation MRCheckmarkIconView\n\n- (void)commonInit {\n    [super commonInit];\n    \n    self.accessibilityLabel = NSLocalizedString(@\"Checkmark\", @\"Accessibility label for custom rendered checkmark icon\");\n}\n\n- (UIBezierPath *)path {\n    UIBezierPath *path = [UIBezierPath new];\n    \n    CGRect bounds = self.bounds;\n    [path moveToPoint:CGPointMake(bounds.size.width * 0.2f, bounds.size.height * 0.55f)];\n    [path addLineToPoint:CGPointMake(bounds.size.width * 0.325f, bounds.size.height * 0.7f)];\n    [path addLineToPoint:CGPointMake(bounds.size.width * 0.75f, bounds.size.height * 0.3f)];\n    \n    return path;\n}\n\n@end\n\n\n@implementation MRCrossIconView\n\n- (void)commonInit {\n    [super commonInit];\n    \n    self.accessibilityLabel = NSLocalizedString(@\"Cross\", @\"Accessibility label for custom rendered cross icon\");\n}\n\n- (UIBezierPath *)path {\n    UIBezierPath *path = [UIBezierPath new];\n    \n    const double relativePadding = 0.25;\n    CGSize size = self.bounds.size;\n    double min = relativePadding;\n    double max = 1 - relativePadding;\n    [path moveToPoint:CGPointMake(size.width * min, size.height * min)];\n    [path addLineToPoint:CGPointMake(size.width * max, size.height * max)];\n    [path moveToPoint:CGPointMake(size.width * min, size.height * max)];\n    [path addLineToPoint:CGPointMake(size.width * max, size.height * min)];\n    \n    return path;\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRNavigationBarProgressView.h",
    "content": "//\n//  MRNavigationBarProgressView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 09.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"MRProgressView.h\"\n\n\n/**\n A custom progress view which can be displayed at the bottom edge of the navigation bar like in Messages app\n or at the top edge of the toolbar like in Safari.\n */\n@interface MRNavigationBarProgressView : MRProgressView\n\n/**\n Tint color of progress bar.\n */\n@property (nonatomic, retain) UIColor *progressTintColor;\n\n/**\n Current progress. Use associated setter for non animated changes. Otherwises use setProgress:aniamted:.\n */\n\n/**\n Change progress animated.\n \n If you set a lower value than the current progess then the animation bounces.\n If you set a higher value than the current progress then the animation eases out.\n \n The progress bar will be hidden, if you set the progress to 1.0, automatically.\n \n @param progress The new progress value.\n \n @param animated Specify YES to animate the change or NO if you do not want the change to be animated.\n */\n- (void)setProgress:(float)progress animated:(BOOL)animated;\n\n/**\n Get current progress view or initialize a new for given navigation controller.\n \n @param navigationController  The navigationBar of the navigationController will be used to initialize the progress\n views frame and progressTintColor. The navigationController's delegate will be intercepted to automatically to remove\n the progress bar on push or pop. You can destroy the current instance by using removeFromSuperview, manually.\n */\n+ (instancetype)progressViewForNavigationController:(UINavigationController *)navigationController;\n\n@end\n\n\n/**\n Helper to access MRNavigationBarProgressView from view controllers.\n */\n@interface UINavigationController (NavigationBarProgressView)\n\n/**\n Access an already initialized progressView.\n */\n@property (nonatomic, readonly) MRNavigationBarProgressView *progressView;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRNavigationBarProgressView.m",
    "content": "//\n//  MRNavigationBarProgressView.m\n//  MRNavigationBarProgressView\n//\n//  Created by Marius Rackwitz on 09.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import \"MRNavigationBarProgressView.h\"\n#import <objc/runtime.h>\n\n\n\nstatic NSString *const MR_UINavigationControllerDidShowViewControllerNotification = @\"UINavigationControllerDidShowViewControllerNotification\";\nstatic NSString *const MR_UINavigationControllerLastVisibleViewController = @\"UINavigationControllerLastVisibleViewController\";\n\n\n\n@interface UINavigationController (NavigationBarProgressView_Private)\n\n@property (nonatomic, weak) MRNavigationBarProgressView *progressView;\n\n@end\n\n\n@implementation UINavigationController (NavigationBarProgressView_Private)\n\n- (void)setProgressView:(MRNavigationBarProgressView *)progressView {\n    objc_setAssociatedObject(self, @selector(progressView), progressView, OBJC_ASSOCIATION_ASSIGN);\n}\n\n- (MRNavigationBarProgressView *)progressView {\n    return objc_getAssociatedObject(self, @selector(progressView));\n}\n\n@end\n\n\n\n@interface MRNavigationBarProgressView ()\n\n@property (nonatomic, weak, readwrite) UIView *progressView;\n@property (nonatomic, weak, readwrite) UIViewController *viewController;\n@property (nonatomic, weak, readwrite) UIView *barView;\n\n@end\n\n\n@implementation MRNavigationBarProgressView\n\nstatic NSNumberFormatter *progressNumberFormatter;\n\n+ (void)load {\n    NSNumberFormatter *numberFormatter = [NSNumberFormatter new];\n    numberFormatter.numberStyle = NSNumberFormatterPercentStyle;\n    numberFormatter.locale = NSLocale.currentLocale;\n    progressNumberFormatter = numberFormatter;\n}\n\n+ (instancetype)progressViewForNavigationController:(UINavigationController *)navigationController {\n    // Try to get existing bar\n    MRNavigationBarProgressView *progressView = navigationController.progressView;\n    if (progressView) {\n        return progressView;\n    }\n    \n    // Create new bar\n    UINavigationBar *navigationBar = navigationController.navigationBar;\n    progressView = [MRNavigationBarProgressView new];\n    progressView.barView = navigationBar;\n    \n    progressView.progressTintColor = navigationBar.tintColor\n        ? navigationBar.tintColor : UIApplication.sharedApplication.delegate.window.tintColor;\n    \n    // Store bar and add to view hierachy\n    navigationController.progressView = progressView;\n    [navigationController.navigationBar addSubview:progressView];\n    \n    // Observe topItem\n    progressView.viewController = navigationController.topViewController;\n    [progressView registerObserverForNavigationController:navigationController];\n    \n    return progressView;\n}\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n+ (BOOL)requiresConstraintBasedLayout {\n    return YES;\n}\n\n- (void)commonInit {\n    self.isAccessibilityElement = YES;\n    self.accessibilityLabel = NSLocalizedString(@\"Determinate Progress\", @\"Accessibility label for navigation bar progress view\");\n    self.accessibilityTraits = UIAccessibilityTraitUpdatesFrequently;\n    \n    self.autoresizingMask = UIViewAutoresizingFlexibleWidth;\n    self.opaque = NO;\n    \n    UIView *progressView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, self.bounds.size.height)];\n    progressView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin;\n    progressView.backgroundColor = self.tintColor;\n    [self addSubview:progressView];\n    self.progressView = progressView;\n    \n    self.progress = 0;\n    \n    [self tintColorDidChange];\n}\n\n- (void)registerObserverForNavigationController:(UINavigationController *)navigationController {\n    [NSNotificationCenter.defaultCenter addObserver:self\n                                           selector:@selector(navigationControllerDidShowViewController:)\n                                               name:MR_UINavigationControllerDidShowViewControllerNotification\n                                             object:navigationController];\n}\n\n- (void)unregisterObserverForNavigationController:(UINavigationController *)navigationController {\n    [NSNotificationCenter.defaultCenter removeObserver:self];\n}\n\n- (void)navigationControllerDidShowViewController:(NSNotification *)notification {\n    UINavigationController *navigationController = notification.object;\n    UIViewController *lastVisibleVC = notification.userInfo[MR_UINavigationControllerLastVisibleViewController];\n    \n    // Check if our controller will be still the topViewController or was popped\n    if (lastVisibleVC == self.viewController) {\n        // Unregister observer\n        [self unregisterObserverForNavigationController:navigationController];\n        \n        // Remove reference\n        navigationController.progressView = nil;\n        \n        // Remove receiver from view hierachy\n        [self removeFromSuperview];\n    }\n}\n\n- (void) dealloc {\n    [NSNotificationCenter.defaultCenter removeObserver:self];\n}\n\n- (void)setBarView:(UIView *)barView {\n    _barView = barView;\n    [self layoutSubviews];\n}\n\n\n#pragma mark - Layout\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    CGRect barFrame = self.barView.frame;\n    const CGFloat progressBarHeight = 2;\n    \n    CGRect frame = CGRectMake(barFrame.origin.x,\n                              0,\n                              barFrame.size.width,\n                              progressBarHeight);\n    \n    if ([self.barView isKindOfClass:UINavigationBar.class]) {\n        const CGFloat barBorderHeight = 0.5;\n        frame.origin.y = barFrame.size.height - progressBarHeight + barBorderHeight;\n    }\n    \n    if (!CGRectEqualToRect(self.frame, frame)) {\n        self.frame = frame;\n    }\n    \n    [self layoutProgressView];\n}\n\n- (void)layoutProgressView {\n    self.progressView.frame = CGRectMake(0, 0, self.frame.size.width * self.progress, self.frame.size.height);\n}\n\n\n#pragma mark - Getter and setter for progress tint color\n\n- (void)setProgressTintColor:(UIColor *)tintColor {\n    self.progressView.backgroundColor = tintColor;\n}\n\n- (UIColor *)progressTintColor {\n    return self.progressView.backgroundColor;\n}\n\n\n#pragma mark - Control progress\n\n- (void)setProgress:(float)progress {\n    NSParameterAssert(progress >= 0 && progress <= 1);\n    [self _setProgress:progress];\n}\n\n- (void)_setProgress:(float)progress {\n    _progress = progress;\n    [self progressDidChange];\n}\n\n- (void)progressDidChange {\n    self.progressView.alpha = self.progress >= 1 ? 0 : 1;\n    [self layoutProgressView];\n    \n    self.accessibilityValue = [progressNumberFormatter stringFromNumber:@(self.progress)];\n    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self);\n}\n\n- (void)setProgress:(float)progress animated:(BOOL)animated {\n    if (animated) {\n        if (progress > 0 && progress < 1.0 && self.progressView.alpha <= CGFLOAT_MIN) {\n            // progressView was hidden. Make it visible first.\n            self.progressView.alpha = 1;\n        }\n        \n        void(^completion)(BOOL) = ^(BOOL finished){\n            [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{\n                self.progressView.alpha = self.progress >= 1 ? 0 : 1;\n            } completion:nil];\n        };\n        \n        if (progress > self.progress || self.progress >= 1) {\n            // Progress increased: ease out.\n            [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{\n                [self _setProgress:progress];\n            } completion:completion];\n        } else {\n            // Progress decreased: bounce.\n            [UIView animateWithDuration:0.3 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:0 animations:^{\n                [self _setProgress:progress];\n            } completion:completion];\n        }\n    } else {\n        self.progress = progress;\n    }\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRProgressOverlayView.h",
    "content": "//\n//  MRProgressOverlayView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 09.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n@class MRProgressOverlayView;\n\n\n/** (MRProgressOverlayViewStopBlock) */\ntypedef void(^MRProgressOverlayViewStopBlock)(MRProgressOverlayView *progressOverlayView);\n\n/** (MRProgressOverlayViewMode) */\ntypedef NS_ENUM(NSUInteger, MRProgressOverlayViewMode){\n    /** Progress is shown using a large round activity indicator view. (MRActivityIndicatorView) This is the default. */\n    MRProgressOverlayViewModeIndeterminate,\n    /** Progress is shown using a round, pie-chart like, progress view. (MRCircularProgressView) */\n    MRProgressOverlayViewModeDeterminateCircular,\n    /** Progress is shown using a horizontal progress bar. (UIProgressView) */\n    MRProgressOverlayViewModeDeterminateHorizontalBar,\n    /** Shows primarily a label. Progress is shown using a small activity indicator. (MRActivityIndicatorView) */\n    MRProgressOverlayViewModeIndeterminateSmall,\n    /** Shows primarily a label. Progress is shown using a small activity indicator. (UIActivityIndicatorView in UIActivityIndicatorViewStyleGray) */\n    MRProgressOverlayViewModeIndeterminateSmallDefault,\n    /** Shows a checkmark. (MRCheckmarkIconView) */\n    MRProgressOverlayViewModeCheckmark,\n    /** Shows a cross. (MRCrossIconView) */\n    MRProgressOverlayViewModeCross,\n    /** Shows a custom view. (UIView) */\n    MRProgressOverlayViewModeCustom,\n};\n\n\n/**\n Progress HUD to be shown over a whole view controller's view or window.\n Similar look to UIAlertView.\n */\n@interface MRProgressOverlayView : UIView\n\n/**\n Creates a new overlay, adds it to provided view and shows it. The counterpart to this method is dismissOverlayForView:animated.\n \n @param view The view that the overlay will be added to\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @return A reference to the created overlay.\n */\n+ (instancetype)showOverlayAddedTo:(UIView *)view animated:(BOOL)animated;\n\n/**\n Creates a new overlay, adds it to provided view and shows it. The counterpart to this method is dismissOverlayForView:animated.\n \n @param view The view that the overlay will be added to\n @param title Title label text\n @param mode Visualization mode\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @return A reference to the created overlay.\n */\n+ (instancetype)showOverlayAddedTo:(UIView *)view title:(NSString *)title mode:(MRProgressOverlayViewMode)mode animated:(BOOL)animated;\n\n/**\n Creates a new overlay, adds it to provided view and shows it. The counterpart to this method is dismissOverlayForView:animated.\n \n @param view The view that the overlay will be added to\n @param title Title label text\n @param mode Visualization mode\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @param stopBlock Block, which will be called when stop button is tapped.\n @return A reference to the created overlay.\n */\n+ (instancetype)showOverlayAddedTo:(UIView *)view title:(NSString *)title mode:(MRProgressOverlayViewMode)mode animated:(BOOL)animated stopBlock:(MRProgressOverlayViewStopBlock)stopBlock;\n\n/**\n Finds the top-most overlay subview and hides it. The counterpart to this method is showOverlayAddedTo:animated:.\n \n @param view The view that is going to be searched for a overlay subview.\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @return YES if a overlay was found and removed, NO otherwise.\n */\n+ (BOOL)dismissOverlayForView:(UIView *)view animated:(BOOL)animated;\n\n/**\n Finds the top-most overlay subview and hides it. The counterpart to this method is showOverlayAddedTo:animated:.\n \n @param view The view that is going to be searched for a overlay subview.\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @param completionBlock block will be called, when the animation has finished.\n @return YES if a overlay was found and removed, NO otherwise.\n */\n+ (BOOL)dismissOverlayForView:(UIView *)view animated:(BOOL)animated completion:(void(^)())completionBlock;\n\n/**\n Finds all the overlay subviews and hides them.\n \n @param view The view that is going to be searched for overlay subviews.\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @return the number of overlays found and removed.\n */\n+ (NSUInteger)dismissAllOverlaysForView:(UIView *)view animated:(BOOL)animated;\n\n/**\n Finds all the overlay subviews and hides them.\n \n @param view The view that is going to be searched for overlay subviews.\n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @param completionBlock block will be called, when the animation has finished.\n @return the number of overlays found and removed.\n */\n+ (NSUInteger)dismissAllOverlaysForView:(UIView *)view animated:(BOOL)animated completion:(void(^)())completionBlock;\n\n/**\n Finds the top-most overlay subview and returns it.\n \n @param view The view that is going to be searched.\n @return A reference to the last overlay subview discovered.\n */\n+ (instancetype)overlayForView:(UIView *)view;\n\n/**\n Finds all overlay subviews and returns them.\n \n @param view The view that is going to be searched.\n @return All found overlay views (array of MBProgressOverlayView objects).\n */\n+ (NSArray *)allOverlaysForView:(UIView *)view;\n\n/**\n Allows customization of blur effect.\n \n If you override this method, you are responsible for adding the view to hierachy.\n The view will not be retained.\n The cornerRadius of the layer of the returnValue will be initialized.\n */\n- (UIView *)createBlurView;\n\n/**\n Visualisation mode.\n \n How the progress should be visualised.\n */\n@property (nonatomic, assign) MRProgressOverlayViewMode mode;\n\n/**\n Current progress.\n \n Use associated setter for non animated changes. Otherwises use setProgress:aniamted:.\n */\n@property (nonatomic, assign) float progress;\n\n/**\n Title label text.\n \n By default \"Loading ...\".\n This will automatically call setTitleLabelAttributedText: with current string attributes.\n */\n@property (nonatomic, strong) NSString *titleLabelText UI_APPEARANCE_SELECTOR;\n\n/**\n Title label attributed text.\n */\n@property (nonatomic, strong) NSAttributedString *titleLabelAttributedText;\n\n/**\n Title label.\n \n Use this reference to customize titleLabel appearance.\n If you want to customize the titleLabel's text attributes, use setTitleLabelText:.\n Attention:\n Never set titleLabel.text manually. This would unset titleLabel.attributedText where the layout relies on.\n */\n@property (readonly, weak) UILabel *titleLabel;\n\n/**\n Mode view.\n \n Should only be customized when in MRProgressOverlayViewModeCustom. In other modes you will get the documented\n components. When mode is changed to MRProgressOverlayViewModeCustom from another, this property will be initialized\n with a new UIView instance. You should make sure to call setMode: first. You are responsible to set the frame size.\n */\n@property (nonatomic, strong) UIView *modeView;\n\n/**\n Block, which will be called when stop button is tapped.\n \n Use this to set a block, which is callend when UIControlEventTouchUpInside is fired on the mode view's stop button,\n if available. The receiver will not be hidden or dismissed, automatically.\n */\n@property (nonatomic, copy) MRProgressOverlayViewStopBlock stopBlock;\n\n/**\n Change the tint color of the mode views.\n \n Redeclared to document usage, internally tintColorDidChange is used.\n \n @param tintColor The new tint color\n */\n- (void)setTintColor:(UIColor *)tintColor;\n\n/**\n Change progress animated.\n \n The animation will be always linear.\n \n @param progress The new progress value.\n @param animated Specify YES to animate the change or NO if you do not want the change to be animated.\n */\n- (void)setProgress:(float)progress animated:(BOOL)animated;\n\n/**\n Show the progress view.\n \n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n */\n- (void)show:(BOOL)animated;\n\n/**\n Hide the progress view.\n \n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n */\n- (void)hide:(BOOL)animated;\n\n/**\n Hide the progress view and remove on animation completion from the view hierachy.\n \n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n */\n- (void)dismiss:(BOOL)animated;\n\n/**\n Hide the progress view and remove on animation completion from the view hierachy.\n \n @param animated Specify YES to animate the transition or NO if you do not want the transition to be animated.\n @param completionBlock block will be called, when the animation has finished.\n */\n- (void)dismiss:(BOOL)animated completion:(void(^)())completionBlock;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRProgressOverlayView.m",
    "content": "//\n//  MRProgressOverlayView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 09.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <QuartzCore/QuartzCore.h>\n#import <CoreGraphics/CoreGraphics.h>\n#import \"MRProgressOverlayView.h\"\n#import \"MRActivityIndicatorView.h\"\n#import \"MRBlurView.h\"\n#import \"MRCircularProgressView.h\"\n#import \"MRIconView.h\"\n#import \"MRProgressHelper.h\"\n\n\nstatic const CGFloat MRProgressOverlayViewCornerRadius = 7;\nstatic const CGFloat MRProgressOverlayViewMotionEffectExtent = 10;\n\n\n@interface MRProgressOverlayView () {\n    NSDictionary *_savedAttributes;\n}\n\n@property (nonatomic, weak, readwrite) UIView *dialogView;\n@property (nonatomic, weak, readwrite) UIView *blurView;\n@property (nonatomic, weak, readwrite) UILabel *titleLabel;\n\n- (UIView *)createModeView;\n- (UIView *)createViewForMode:(MRProgressOverlayViewMode)mode;\n\n- (MRActivityIndicatorView *)createActivityIndicatorView;\n- (MRActivityIndicatorView *)createSmallActivityIndicatorView;\n- (UIActivityIndicatorView *)createSmallDefaultActivityIndicatorView;\n- (MRCircularProgressView *)createCircularProgressView;\n- (UIProgressView *)createHorizontalBarProgressView;\n- (MRIconView *)createCheckmarkIconView;\n- (MRIconView *)createCrossIconView;\n- (UIView *)createCustomView;\n\n- (void)showModeView:(UIView *)modeView;\n- (void)hideModeView:(UIView *)modeView;\n\n- (BOOL)mayStop;\n\n- (void)setSubviewTransform:(CGAffineTransform)transform alpha:(CGFloat)alpha;\n\n- (void)registerForNotificationCenter;\n- (void)unregisterFromNotificationCenter;\n- (void)deviceOrientationDidChange:(NSNotification *)notification;\n\n- (void)registerForKVO;\n- (void)unregisterFromKVO;\n- (NSArray *)observableKeypaths;\n\n- (CGAffineTransform)transformForOrientation;\n\n- (NSDictionary *)titleTextAttributesToCopy;\n\n@end\n\n\n@implementation MRProgressOverlayView\n\nstatic void *MRProgressOverlayViewObservationContext = &MRProgressOverlayViewObservationContext;\n\n#pragma mark - Static helper methods\n\n+ (instancetype)showOverlayAddedTo:(UIView *)view animated:(BOOL)animated {\n    MRProgressOverlayView *overlayView = [self new];\n    [view addSubview:overlayView];\n    [overlayView show:animated];\n    return overlayView;\n}\n\n+ (instancetype)showOverlayAddedTo:(UIView *)view title:(NSString *)title mode:(MRProgressOverlayViewMode)mode animated:(BOOL)animated {\n    MRProgressOverlayView *overlayView = [self new];\n    overlayView.mode = mode;\n    overlayView.titleLabelText = title;\n    [view addSubview:overlayView];\n    [overlayView show:animated];\n    return overlayView;\n}\n\n+ (instancetype)showOverlayAddedTo:(UIView *)view title:(NSString *)title mode:(MRProgressOverlayViewMode)mode animated:(BOOL)animated stopBlock:(MRProgressOverlayViewStopBlock)stopBlock {\n    MRProgressOverlayView *overlayView = [self new];\n    overlayView.mode = mode;\n    overlayView.titleLabelText = title;\n    overlayView.stopBlock = stopBlock;\n    [view addSubview:overlayView];\n    [overlayView show:animated];\n    return overlayView;\n}\n\n+ (BOOL)dismissOverlayForView:(UIView *)view animated:(BOOL)animated {\n    return [self dismissOverlayForView:view animated:animated completion:nil];\n}\n\n+ (BOOL)dismissOverlayForView:(UIView *)view animated:(BOOL)animated completion:(void(^)())completionBlock {\n    MRProgressOverlayView *overlayView = [self overlayForView:view];\n    if (overlayView) {\n        [overlayView dismiss:animated completion:completionBlock];\n        return YES;\n    }\n    return NO;\n}\n\n+ (NSUInteger)dismissAllOverlaysForView:(UIView *)view animated:(BOOL)animated {\n    return [self dismissAllOverlaysForView:view animated:animated completion:nil];\n}\n\n+ (NSUInteger)dismissAllOverlaysForView:(UIView *)view animated:(BOOL)animated completion:(void(^)())completionBlock {\n    NSArray *views = [self allOverlaysForView:view];\n    for (MRProgressOverlayView *overlayView in views) {\n        [overlayView dismiss:animated completion:completionBlock];\n    }\n    return views.count;\n}\n\n+ (instancetype)overlayForView:(UIView *)view {\n    NSEnumerator *subviewsEnum = view.subviews.reverseObjectEnumerator;\n    for (UIView *subview in subviewsEnum) {\n        if ([subview isKindOfClass:self]) {\n            return (MRProgressOverlayView *)subview;\n        }\n    }\n    return nil;\n}\n\n+ (NSArray *)allOverlaysForView:(UIView *)view {\n    NSMutableArray *overlays = [NSMutableArray new];\n    NSArray *subviews = view.subviews;\n    for (UIView *view in subviews) {\n        if ([view isKindOfClass:self]) {\n            [overlays addObject:view];\n        }\n    }\n    return overlays;\n}\n\n\n#pragma mark - Initialization\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (void)commonInit {\n    self.accessibilityViewIsModal = YES;\n    \n    self.hidden = YES;\n    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;\n    \n    const CGFloat cornerRadius = MRProgressOverlayViewCornerRadius;\n    \n    // Create blurView\n    self.blurView = [self createBlurView];\n    self.blurView.layer.cornerRadius = cornerRadius;\n    \n    // Create container with contents\n    UIView *dialogView = [UIView new];\n    [self addSubview:dialogView];\n    self.dialogView = dialogView;\n    [self applyMotionEffects];\n    \n    // Style the dialog to match the iOS7 UIAlertView\n    dialogView.backgroundColor = UIColor.clearColor;\n    dialogView.layer.cornerRadius = cornerRadius;\n    dialogView.layer.shadowRadius = cornerRadius + 5;\n    dialogView.layer.shadowOpacity = 0.1f;\n    dialogView.layer.shadowOffset = CGSizeMake(-(cornerRadius+5)/2.0f, -(cornerRadius+5)/2.0f);\n    \n    // Create titleLabel\n    UILabel *titleLabel = [UILabel new];\n    self.titleLabel = titleLabel;\n    self.titleLabel.attributedText = [[NSAttributedString alloc] initWithString:@\"Loading ...\" attributes:@{\n        NSForegroundColorAttributeName: UIColor.blackColor,\n        NSFontAttributeName:            [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline],\n        NSKernAttributeName:            NSNull.null,  // turn on auto-kerning\n    }];\n    titleLabel.accessibilityTraits = UIAccessibilityTraitHeader;\n    titleLabel.textAlignment = NSTextAlignmentCenter;\n    titleLabel.numberOfLines = 0;\n    titleLabel.lineBreakMode = NSLineBreakByWordWrapping;\n    [dialogView addSubview:titleLabel];\n    \n    // Create modeView\n    [self createModeView];\n    \n    // Observe key paths and notification center\n    [self registerForKVO];\n    [self registerForNotificationCenter];\n    \n    [self tintColorDidChange];\n}\n\n\n#pragma mark - Clean up\n\n- (void)dealloc {\n    [self unregisterFromKVO];\n    [self unregisterFromNotificationCenter];\n}\n\n\n#pragma mark - Notifications\n\n- (void)registerForNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center addObserver:self selector:@selector(deviceOrientationDidChange:) name:UIDeviceOrientationDidChangeNotification object:nil];\n}\n\n- (void)unregisterFromNotificationCenter {\n    NSNotificationCenter *center = NSNotificationCenter.defaultCenter;\n    [center removeObserver:self];\n}\n\n- (void)deviceOrientationDidChange:(NSNotification *)notification {\n    if ([self.superview isKindOfClass:UIWindow.class]) {\n        [UIView animateWithDuration:0.3 animations:^{\n            [self manualLayoutSubviews];\n        }];\n    } else {\n        [self manualLayoutSubviews];\n    }\n}\n\n\n#pragma mark - Key-Value-Observing\n\n- (void)registerForKVO {\n    for (NSString *keyPath in self.observableKeypaths) {\n        [self addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionPrior context:MRProgressOverlayViewObservationContext];\n    }\n}\n\n- (void)unregisterFromKVO {\n    for (NSString *keyPath in self.observableKeypaths) {\n        [self removeObserver:self forKeyPath:keyPath];\n    }\n}\n\n- (NSArray *)observableKeypaths {\n    return @[@\"titleLabel.text\"];\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {\n    if (context == MRProgressOverlayViewObservationContext) {\n        if ([keyPath isEqualToString:@\"titleLabel.text\"]) {\n            if ([change[NSKeyValueChangeNotificationIsPriorKey] boolValue]) {\n                _savedAttributes = self.titleTextAttributesToCopy;\n                return;\n            } else {\n                if (!_savedAttributes) {\n                    self.titleLabelText = self.titleLabel.text;\n                    #if DEBUG\n                        NSLog(@\"** WARNING - Instance of %@ used automatically setTitleLabelText: internally, instead of titleLabel.text, but some text attributes may been lost.\",\n                              NSStringFromClass(self.class));\n                    #endif\n                } else {\n                    self.titleLabelText = (id)[[NSAttributedString alloc] initWithString:self.titleLabel.text attributes:_savedAttributes];\n                    _savedAttributes = nil;\n                }\n            }\n        }\n        [self manualLayoutSubviews];\n        return;\n    }\n    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];\n}\n\n\n#pragma mark - Create subviews\n\n- (UIView *)createBlurView {\n    UIView *blurView = [MRBlurView new];\n    blurView.alpha = 0.98;\n    [self addSubview:blurView];\n    \n    return blurView;\n}\n\n- (UIView *)createModeView {\n    UIView *modeView = [self createViewForMode:self.mode];\n    self.modeView = modeView;\n    modeView.tintColor = self.tintColor;\n    \n    if ([modeView conformsToProtocol:@protocol(MRStopableView)]\n        && [modeView respondsToSelector:@selector(stopButton)]) {\n        UIButton *stopButton = [((id<MRStopableView>)modeView) stopButton];\n        [stopButton addTarget:self action:@selector(modeViewStopButtonTouchUpInside) forControlEvents:UIControlEventTouchUpInside];\n    }\n    \n    return modeView;\n}\n\n- (void)setModeView:(UIView *)modeView {\n    _modeView = modeView;\n    [self.dialogView addSubview:modeView];\n}\n\n- (UIView *)createViewForMode:(MRProgressOverlayViewMode)mode {\n    switch (mode) {\n        case MRProgressOverlayViewModeIndeterminate:\n            return [self createActivityIndicatorView];\n        \n        case MRProgressOverlayViewModeIndeterminateSmall:\n            return [self createSmallActivityIndicatorView];\n        \n        case MRProgressOverlayViewModeIndeterminateSmallDefault:\n            return [self createSmallDefaultActivityIndicatorView];\n        \n        case MRProgressOverlayViewModeDeterminateCircular:\n            return [self createCircularProgressView];\n        \n        case MRProgressOverlayViewModeDeterminateHorizontalBar:\n            return [self createHorizontalBarProgressView];\n        \n        case MRProgressOverlayViewModeCheckmark:\n            return [self createCheckmarkIconView];\n        \n        case MRProgressOverlayViewModeCross:\n            return [self createCrossIconView];\n            \n        case MRProgressOverlayViewModeCustom:\n            return [self createCustomView];\n    }\n    return nil;\n}\n\n\n#pragma mark - Mode view factory methods\n\n- (MRActivityIndicatorView *)createActivityIndicatorView {\n    // Create activity indicator for indeterminate mode\n    MRActivityIndicatorView *activityIndicatorView = [MRActivityIndicatorView new];\n    return activityIndicatorView;\n}\n\n- (MRActivityIndicatorView *)createSmallActivityIndicatorView {\n    // Create small activity indicator for text mode\n    MRActivityIndicatorView *smallActivityIndicatorView = [MRActivityIndicatorView new];\n    smallActivityIndicatorView.hidesWhenStopped = YES;\n    return smallActivityIndicatorView;\n}\n\n- (UIActivityIndicatorView *)createSmallDefaultActivityIndicatorView {\n    // Create small default activity indicator for text mode\n    UIActivityIndicatorView *smallDefaultActivityIndicatorView = [UIActivityIndicatorView new];\n    smallDefaultActivityIndicatorView.hidesWhenStopped = YES;\n    smallDefaultActivityIndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;\n    return smallDefaultActivityIndicatorView;\n}\n\n- (MRCircularProgressView *)createCircularProgressView {\n    // Create circular progress view for determinate circular mode\n    MRCircularProgressView *circularProgressView = [MRCircularProgressView new];\n    return circularProgressView;\n}\n\n- (UIProgressView *)createHorizontalBarProgressView {\n    // Create horizontal progress bar for determinate horizontal bar mode\n    UIProgressView *horizontalBarProgressView = [UIProgressView new];\n    return horizontalBarProgressView;\n}\n\n- (MRIconView *)createCheckmarkIconView {\n    // Create checkmark icon view for checkmark mode\n    MRCheckmarkIconView *checkmarkIconView = [MRCheckmarkIconView new];\n    return checkmarkIconView;\n}\n\n- (MRIconView *)createCrossIconView {\n    // Create cross icon view for cross mode\n    MRCrossIconView *crossIconView = [MRCrossIconView new];\n    return crossIconView;\n}\n\n- (UIView *)createCustomView {\n    // Create custom base view\n    return [UIView new];\n}\n\n\n#pragma mark - Title label text\n\n- (NSDictionary *)titleTextAttributesToCopy {\n    if (self.titleLabel.text.length > 0) {\n        return [self.titleLabel.attributedText attributesAtIndex:0 effectiveRange:NULL];\n    } else {\n        return @{};\n    }\n}\n\n- (void)setTitleLabelText:(NSString *)titleLabelText {\n    self.titleLabelAttributedText = [[NSAttributedString alloc] initWithString:titleLabelText attributes:self.titleTextAttributesToCopy];\n    [self manualLayoutSubviews];\n}\n\n- (NSString *)titleLabelText {\n    return self.titleLabel.text;\n}\n\n- (void)setTitleLabelAttributedText:(NSAttributedString *)titleLabelAttributedText {\n    self.titleLabel.attributedText = titleLabelAttributedText;\n    [self manualLayoutSubviews];\n}\n\n- (NSAttributedString *)titleLabelAttributedText {\n    return self.titleLabel.attributedText;\n}\n\n\n#pragma mark - Tint color\n\n- (void)setTintColor:(UIColor *)tintColor {\n    // Implemented to silent warning\n    super.tintColor = tintColor;\n}\n\n- (void)tintColorDidChange {\n    [super tintColorDidChange];\n    self.modeView.tintColor = self.tintColor;\n}\n\n\n#pragma mark - Mode\n\n- (void)setMode:(MRProgressOverlayViewMode)mode {\n    [self hideModeView:self.modeView];\n    \n    _mode = mode;\n    \n    [self showModeView:[self createModeView]];\n    [self updateModeViewMayStop];\n    \n    if (!self.hidden) {\n        [self manualLayoutSubviews];\n    }\n}\n\n- (void)showModeView:(UIView *)modeView {\n    modeView.hidden = NO;\n    if ([modeView respondsToSelector:@selector(startAnimating)]) {\n        [modeView performSelector:@selector(startAnimating)];\n    }\n}\n\n- (void)hideModeView:(UIView *)modeView {\n    modeView.hidden = YES;\n    if ([modeView respondsToSelector:@selector(stopAnimating)]) {\n        [modeView performSelector:@selector(stopAnimating)];\n    }\n}\n\n\n#pragma mark - Stop button\n\n- (void)setStopBlock:(MRProgressOverlayViewStopBlock)stopBlock {\n    _stopBlock = stopBlock;\n    \n    if (![self updateModeViewMayStop]) {\n        #if DEBUG\n            NSLog(@\"** WARNING - %@: %@ is only valid to call when the mode view supports %@ declared in %@!\",\n                  NSStringFromClass(self.class),\n                  NSStringFromSelector(_cmd),\n                  NSStringFromSelector(@selector(setMayStop:)),\n                  NSStringFromProtocol(@protocol(MRStopableView)));\n        #endif\n    }\n}\n\n- (BOOL)mayStop {\n    return _stopBlock != nil;\n}\n\n- (BOOL)updateModeViewMayStop {\n    if ([self.modeView conformsToProtocol:@protocol(MRStopableView)]\n        && [self.modeView respondsToSelector:@selector(setMayStop:)]) {\n        [((id<MRStopableView>)self.modeView) setMayStop:self.mayStop];\n        return YES;\n    }\n    return NO;\n}\n\n- (void)modeViewStopButtonTouchUpInside {\n    if (self.stopBlock) {\n        self.stopBlock(self);\n    }\n}\n\n\n#pragma mark - A11y\n\n- (BOOL)accessibilityPerformEscape {\n    if (self.mayStop) {\n        [self modeViewStopButtonTouchUpInside];\n        return YES;\n    } else {\n        return NO;\n    }\n}\n\n\n#pragma mark - Transitions\n\n- (void)setSubviewTransform:(CGAffineTransform)transform alpha:(CGFloat)alpha {\n    self.blurView.transform = transform;\n    self.blurView.alpha = alpha;\n    self.dialogView.transform = transform;\n    self.dialogView.alpha = alpha;\n}\n\n- (void)show:(BOOL)animated {\n    [self showModeView:self.modeView];\n    \n    [self manualLayoutSubviews];\n    \n    if (animated) {\n        [self setSubviewTransform:CGAffineTransformMakeScale(1.3f, 1.3f) alpha:0.5f];\n        self.backgroundColor = UIColor.clearColor;\n    }\n    \n    self.hidden = NO;\n    \n    void(^animBlock)() = ^{\n        [self setSubviewTransform:CGAffineTransformIdentity alpha:1.0f];\n        self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.4f];\n    };\n    \n    if (animated) {\n        [UIView animateWithDuration:0.2f delay:0.0 options:UIViewAnimationOptionCurveEaseInOut\n                         animations:animBlock\n                         completion:nil];\n    } else {\n        animBlock();\n    }\n    \n    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);\n    UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, self.titleLabelText);\n}\n\n- (void)dismiss:(BOOL)animated {\n    [self dismiss:animated completion:nil];\n}\n\n- (void)dismiss:(BOOL)animated completion:(void(^)())completionBlock {\n    [self hide:animated completion:^{\n        [self removeFromSuperview];\n        if (completionBlock) {\n            completionBlock();\n        }\n    }];\n}\n\n- (void)hide:(BOOL)animated {\n    [self hide:animated completion:nil];\n}\n\n- (void)hide:(BOOL)animated completion:(void(^)())completionBlock {\n    [self setSubviewTransform:CGAffineTransformIdentity alpha:1.0f];\n    \n    void(^animBlock)() = ^{\n        [self setSubviewTransform:CGAffineTransformMakeScale(0.6f, 0.6f) alpha:0.0f];\n        self.backgroundColor = UIColor.clearColor;\n    };\n    \n    void(^animCompletionBlock)(BOOL) = ^(BOOL finished) {\n        self.hidden = YES;\n        [self hideModeView:self.modeView];\n        \n        UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil);\n        \n        if (completionBlock) {\n            completionBlock();\n        }\n    };\n    \n    if (animated) {\n        [UIView animateWithDuration:0.2f delay:0.0 options:UIViewAnimationOptionCurveEaseInOut\n                         animations:animBlock\n                         completion:animCompletionBlock];\n    } else {\n        animBlock();\n        animCompletionBlock(YES);\n    }\n}\n\n\n#pragma mark - Layout\n\n- (CGAffineTransform)transformForOrientation {\n    if ([self.superview isKindOfClass:UIWindow.class]) {\n        return CGAffineTransformMakeRotation(MRRotationForStatusBarOrientation());\n    }\n    return CGAffineTransformIdentity;\n}\n\n// Don't overwrite layoutSubviews here. This would cause issues with animation.\n- (void)manualLayoutSubviews {\n    self.transform = self.transformForOrientation;\n    \n    CGRect bounds = self.superview.bounds;\n    UIEdgeInsets insets = UIEdgeInsetsZero;\n    \n    if ([self.superview isKindOfClass:[UIScrollView class]]) {\n        UIScrollView *scrollView = (UIScrollView *)self.superview;\n        insets = scrollView.contentInset;\n    }\n    \n    self.center = CGPointMake((bounds.size.width - insets.left - insets.right) / 2.0f,\n                              (bounds.size.height - insets.top - insets.bottom) / 2.0f);\n\n    if ([self.superview isKindOfClass:UIWindow.class] && UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation)) {\n        // Swap width and height\n        self.bounds = (CGRect){CGPointZero, {bounds.size.height, bounds.size.width}};\n    } else {\n        self.bounds = (CGRect){CGPointZero, bounds.size};\n    }\n    \n    const CGFloat dialogPadding = 15;\n    const CGFloat modePadding = 30;\n    const CGFloat dialogMargin = 10;\n    const CGFloat dialogMinWidth = 150;\n    \n    const BOOL hasSmallIndicator = self.mode == MRProgressOverlayViewModeIndeterminateSmall\n        || self.mode == MRProgressOverlayViewModeIndeterminateSmallDefault;\n    const BOOL isTextNonEmpty = self.titleLabel.text.length > 0;\n    \n    CGFloat dialogWidth = hasSmallIndicator ? CGRectGetWidth(bounds) - dialogMargin * 2 : dialogMinWidth;\n    if (self.mode == MRProgressOverlayViewModeCustom) {\n        dialogWidth = self.modeView.frame.size.width + 2*modePadding;\n    }\n    \n    CGFloat y = (isTextNonEmpty || hasSmallIndicator) ? 7 : modePadding;\n    \n    CGSize modeViewSize;\n    if (hasSmallIndicator) {\n        modeViewSize = CGSizeMake(20, 20);\n    }\n    \n    if (!self.titleLabel.hidden && isTextNonEmpty) {\n        const CGFloat innerViewWidth = dialogWidth - 2*dialogPadding;\n        \n        CGFloat titleLabelMinX = dialogPadding;\n        CGFloat titleLabelMaxWidth = innerViewWidth;\n        CGFloat offset = 0;\n        \n        if (hasSmallIndicator) {\n            offset = modeViewSize.width + 7;\n        }\n        \n        titleLabelMinX += offset;\n        titleLabelMaxWidth -= offset;\n        \n        y += 3;\n        \n        CGSize titleLabelMaxSize = CGSizeMake(titleLabelMaxWidth, self.bounds.size.height);\n        CGRect boundingRect = [self.titleLabel.attributedText boundingRectWithSize:titleLabelMaxSize\n                                                                           options:NSStringDrawingUsesLineFragmentOrigin\n                                                                           context:nil];\n        CGSize titleLabelSize = CGSizeMake(MRCGFloatCeil(boundingRect.size.width),\n                                           MRCGFloatCeil(boundingRect.size.height));\n        CGPoint titleLabelOrigin;\n        if (hasSmallIndicator) {\n            CGFloat titleLabelMinWidth = dialogMinWidth - 2*dialogPadding - offset;\n            if (titleLabelSize.width > titleLabelMinWidth) {\n                dialogWidth = titleLabelSize.width + offset + 2*dialogPadding;\n                titleLabelOrigin = CGPointMake(titleLabelMinX, y);\n            } else {\n                dialogWidth = dialogMinWidth;\n                titleLabelOrigin = CGPointMake(titleLabelMinX + (titleLabelMinWidth - titleLabelSize.width) / 2.0f, y);\n            }\n            \n            CGPoint modeViewOrigin = CGPointMake(titleLabelOrigin.x - offset,\n                                                 y + (titleLabelSize.height - modeViewSize.height) / 2.0f);\n            CGRect modeViewFrame = {modeViewOrigin, modeViewSize};\n            self.modeView.frame = modeViewFrame;\n        } else {\n            titleLabelOrigin = CGPointMake(titleLabelMinX + (titleLabelMaxWidth - titleLabelSize.width) / 2.0f, y);\n        }\n        \n        CGRect titleLabelFrame = {titleLabelOrigin, titleLabelSize};\n        self.titleLabel.frame = titleLabelFrame;\n        \n        y += CGRectGetMaxY(titleLabelFrame);\n    } else if (hasSmallIndicator) {\n        dialogWidth = modeViewSize.width + 2*y;\n        \n        CGPoint modeViewOrigin = CGPointMake(y, y);\n        CGRect modeViewFrame = {modeViewOrigin, modeViewSize};\n        self.modeView.frame = modeViewFrame;\n        \n        y += CGRectGetMaxY(modeViewFrame);\n    }\n    \n    if (!hasSmallIndicator) {\n        const CGFloat innerViewWidth = dialogWidth - 2*modePadding;\n        \n        CGRect modeViewFrame;\n        CGFloat paddingBottom = 0;\n        \n        if (self.mode != MRProgressOverlayViewModeDeterminateHorizontalBar) {\n            modeViewFrame = CGRectMake(modePadding, y, innerViewWidth, innerViewWidth);\n            paddingBottom = isTextNonEmpty ? 20 : modePadding;\n        } else {\n            modeViewFrame = CGRectMake(10, y, dialogWidth-20, 5);\n            paddingBottom = 15;\n        }\n        \n        self.modeView.frame = modeViewFrame;\n        y += modeViewFrame.size.height + paddingBottom;\n    }\n    \n    {\n        self.dialogView.frame = MRCenterCGSizeInCGRect(CGSizeMake(dialogWidth, y), self.bounds);\n        \n        self.blurView.frame = self.dialogView.frame;\n    }\n}\n\n\n#pragma mark - Control progress\n\n- (void)setProgress:(float)progress {\n    [self setProgress:progress animated:NO];\n}\n\n- (void)setProgress:(float)progress animated:(BOOL)animated {\n    NSParameterAssert(progress >= 0 && progress <= 1);\n    _progress = progress;\n    [self applyProgressAnimated:(BOOL)animated];\n}\n    \n- (void)applyProgressAnimated:(BOOL)animated {\n    if ([self.modeView respondsToSelector:@selector(setProgress:animated:)]) {\n        [((id)self.modeView) setProgress:self.progress animated:animated];\n    } else if ([self.modeView respondsToSelector:@selector(setProgress:)]) {\n        if (animated) {\n            #if DEBUG\n                NSLog(@\"** WARNING - %@: %@ is only valid to call when receiver is in a determinate mode or custom view supports %@!\",\n                      NSStringFromClass(self.class),\n                      NSStringFromSelector(_cmd),\n                      NSStringFromSelector(@selector(setProgress:animated:)));\n            #endif\n        }\n        [((id)self.modeView) setProgress:self.progress];\n    } else {\n        NSAssert(self.mode == MRProgressOverlayViewModeDeterminateCircular\n                 || self.mode == MRProgressOverlayViewModeDeterminateHorizontalBar,\n                 @\"Mode must support %@, but doesnot!\", NSStringFromSelector(@selector(setProgress:animated:)));\n        #if DEBUG\n            NSLog(@\"** ERROR - %@: %@ or %@ are only valid to call when receiver is in a determinate mode!\",\n                  NSStringFromClass(self.class),\n                  NSStringFromSelector(@selector(setProgress:)),\n                  NSStringFromSelector(_cmd));\n        #endif\n    }\n}\n\n\n#pragma mark - Helper to create UIMotionEffects\n\n- (UIInterpolatingMotionEffect *)motionEffectWithKeyPath:(NSString *)keyPath type:(UIInterpolatingMotionEffectType)type {\n    UIInterpolatingMotionEffect *effect = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:keyPath type:type];\n    effect.minimumRelativeValue = @(-MRProgressOverlayViewMotionEffectExtent);\n    effect.maximumRelativeValue = @(MRProgressOverlayViewMotionEffectExtent);\n    return effect;\n}\n\n- (void)applyMotionEffects {\n    UIMotionEffectGroup *motionEffectGroup = [[UIMotionEffectGroup alloc] init];\n    motionEffectGroup.motionEffects = @[[self motionEffectWithKeyPath:@\"center.x\" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis],\n                                        [self motionEffectWithKeyPath:@\"center.y\" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis]];\n    [self.dialogView addMotionEffect:motionEffectGroup];\n    [self.blurView addMotionEffect:motionEffectGroup];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRProgressView.h",
    "content": "//\n//  MRProgressView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 31.05.14.\n//  Copyright (c) 2014 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n/**\n This class is only a intermediate step between the concrete custom progress view\n implementation provided in this library and UIKit's base class UIView and declaring\n the common interface of those custom views, which is similar to UIProgressView.\n This has the advantage that we can define an usual category on this class to extend\n the functionality of all other custom progress view subclasses provided by this library.\n */\n@interface MRProgressView : UIView {\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wobjc-interface-ivars\"\n@protected\n    float _progress;\n}\n#pragma clang diagnostic pop\n\n/**\n Current progress. Use associated setter for non animated changes. Otherwises use setProgress:aniamted:.\n */\n@property (nonatomic, assign) float progress;\n\n/**\n Change progress animated.\n \n The animation will be always linear.\n \n @note See this as declared abstract. This MUST be overriden in subclasses.\n \n @param progress The new progress value.\n @param animated Specify YES to animate the change or NO if you do not want the change to be animated.\n */\n- (void)setProgress:(float)progress animated:(BOOL)animated;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRProgressView.m",
    "content": "//\n//  MRProgressView.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 31.05.14.\n//  Copyright (c) 2014 Marius Rackwitz. All rights reserved.\n//\n\n#import \"MRProgressView.h\"\n\n\n@implementation MRProgressView\n\n- (void) __attribute__((noreturn)) setProgress:(float)progress animated:(BOOL)animated  {\n    @throw [NSException exceptionWithName:NSInternalInconsistencyException\n                                   reason:[NSString stringWithFormat:@\"You must override selector '%@' in %@ or a intermediate class!\",\n                                           NSStringFromSelector(_cmd), NSStringFromClass(self.class)]\n                                 userInfo:nil];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRStopButton.h",
    "content": "//\n//  MRStopButton.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 27.12.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n/**\n Stop button used by progress views to stop the related and visualised running task.\n */\n@interface MRStopButton : UIButton\n\n/**\n Size ratio in comparision to the parent view\n \n The ratio by which the size of the click area will be resized in comparision to the parent size in default state.\n A positive value means that the stop button is smaller than the parent view.\n A negative value means that the stop button is bigger than the parent view.\n By default it has the value 0.3.\n \n The method frameThatFits: will ensure that this property is applied. It has to be called by the parent view in the\n layoutSubviews by class contract.\n */\n@property (nonatomic, assign) CGFloat sizeRatio;\n@property (nonatomic, assign) CGSize fixedSize;\n/**\n Highlighted size ratio in comparision to the default state\n \n The ratio by which the size of the click area will be resized, while touch is tracked inside.\n A positive value means that the stop button will be shrinked.\n A negative value means that the stop button will be enlarged.\n By default it has the value 0.9.\n */\n@property (nonatomic, assign) CGFloat highlightedSizeRatio;\n\n/**\n Asks the view to calculate and return the frame to be displayed in its parent.\n \n @param parentSize   size of the parent node in the view hierachy\n */\n- (CGRect)frameThatFits:(CGRect)parentSize;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRStopButton.m",
    "content": "//\n//  MRStopButton.m\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 27.12.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import \"MRStopButton.h\"\n#import \"MRProgressHelper.h\"\n\n\nstatic CGFloat const MRStopButtonMinSize = 44.0;\n\n\n@interface MRStopButton ()\n\n@property (nonatomic, weak, readwrite) CAShapeLayer *shapeLayer;\n\n@end\n\n\n@implementation MRStopButton\n\n- (id)initWithFrame:(CGRect)frame {\n    self = [super initWithFrame:frame];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (id)initWithCoder:(NSCoder *)aDecoder {\n    self = [super initWithCoder:aDecoder];\n    if (self) {\n        [self commonInit];\n    }\n    return self;\n}\n\n- (void)commonInit {\n    self.accessibilityLabel = NSLocalizedString(@\"Stop\", @\"Accessibility label for stop button\");\n    self.accessibilityHint = NSLocalizedString(@\"Stop the activity\", @\"Accessibility hint for stop button\");\n    self.accessibilityTraits = UIAccessibilityTraitButton;\n    \n    self.sizeRatio = 0.3;\n    self.highlightedSizeRatio = 0.9;\n    \n    CAShapeLayer *shapeLayer = [CAShapeLayer new];\n    [self.layer addSublayer:shapeLayer];\n    self.shapeLayer= shapeLayer;\n    \n    [self addTarget:self action:@selector(didTouchDown) forControlEvents:UIControlEventTouchDown];\n    [self addTarget:self action:@selector(didTouchUpInside) forControlEvents:UIControlEventTouchUpInside];\n    \n    [self tintColorDidChange];\n}\n\n- (CGRect)frameThatFits:(CGRect)parentBounds {\n    if(!CGSizeEqualToSize(self.fixedSize, CGSizeZero))\n    {\n        CGSize viewSize = self.fixedSize;\n        return MRCenterCGSizeInCGRect(viewSize, parentBounds);\n    }\n    CGFloat sizeValue = MIN(parentBounds.size.width, parentBounds.size.height);\n    CGSize viewSize = CGSizeMake(sizeValue, sizeValue);\n    const CGFloat insetSizeRatio = (1 - self.sizeRatio) / 2.0;\n    return CGRectInset(MRCenterCGSizeInCGRect(viewSize, parentBounds),\n                       sizeValue * insetSizeRatio,\n                       sizeValue * insetSizeRatio);\n\n}\n\n- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {\n    if (self.frame.size.width >= MRStopButtonMinSize || self.frame.size.height >= MRStopButtonMinSize) {\n        return [super pointInside:point withEvent:event];\n    } else {\n        CGFloat maxOffsetX = MAX(0, (MRStopButtonMinSize - self.frame.size.width) / 2.0);\n        CGFloat maxOffsetY = MAX(0, (MRStopButtonMinSize - self.frame.size.height) / 2.0);\n        CGRect hitRect = CGRectInset(self.bounds, -maxOffsetX, -maxOffsetY);\n        return CGRectContainsPoint(hitRect, point);\n    }\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    \n    CGRect frame = self.bounds;\n    \n    if (self.tracking && self .touchInside) {\n        const CGFloat insetSizeRatio = (1 - self.highlightedSizeRatio) / 2.0;\n        frame = CGRectInset(frame,\n                            frame.size.width * insetSizeRatio,\n                            frame.size.height * insetSizeRatio);\n    }\n    \n    self.shapeLayer.frame = frame;\n}\n\n- (void)tintColorDidChange {\n    [super tintColorDidChange];\n    self.shapeLayer.backgroundColor = self.tintColor.CGColor;\n}\n\n- (void)didTouchDown {\n    [UIView animateWithDuration:0.1 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{\n        [self layoutSubviews];\n    } completion:nil];\n}\n\n- (void)didTouchUpInside {\n    [UIView animateWithDuration:0.2 delay:0 usingSpringWithDamping:0.5 initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{\n        [self layoutSubviews];\n    } completion:nil];\n}\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Components/MRStopableView.h",
    "content": "//\n//  MRStopableView.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 11.01.14.\n//  Copyright (c) 2014 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n\n/**\n This protocol can be implemented by progress views, which supports a stop button, to stop the related and visualised\n running task.\n */\n@protocol MRStopableView <NSObject>\n\n/**\n A Boolean value that controls whether the receiver shows a stop button.\n \n If the value of this property is NO (the default), the receiver doesnot show a stop button. If the mayStop property is\n YES a stop button will be shown. You can catch fired events like known from UIButton by the property stopButton.\n */\n@property (nonatomic, assign) BOOL mayStop;\n\n/**\n A button, which should only be shown if mayStop is equal to YES.\n \n The button is in the middle of the control.\n */\n@property (nonatomic, readonly, weak) UIButton *stopButton;\n\n@end\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/MRProgress.h",
    "content": "//\n//  MRProgress.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 20.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_ActivityIndicator\n#import \"MRActivityIndicatorView.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_Blur\n#import \"MRBlurView.h\"\n#import \"UIImage+MRImageEffects.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_Circular\n#import \"MRCircularProgressView.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_Icons\n#import \"MRIconView.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_MessageInterceptor\n#import \"MRMessageInterceptor.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_NavigationBarProgress\n#import \"MRNavigationBarProgressView.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_Overlay\n#import \"MRProgressOverlayView.h\"\n#endif\n\n#ifdef COCOAPODS_POD_AVAILABLE_MRProgress_WeakProxy\n#import \"MRWeakProxy.h\"\n#endif\n\n#else\n\n#import \"MRActivityIndicatorView.h\"\n#import \"MRCircularProgressView.h\"\n#import \"MRIconView.h\"\n#import \"MRNavigationBarProgressView.h\"\n#import \"MRProgressOverlayView.h\"\n\n#endif\n"
  },
  {
    "path": "Modified Pods/MRProgress/src/Utils/MRProgressHelper.h",
    "content": "//\n//  MRProgressHelper.h\n//  MRProgress\n//\n//  Created by Marius Rackwitz on 14.10.13.\n//  Copyright (c) 2013 Marius Rackwitz. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import <CoreGraphics/CoreGraphics.h>\n\n\nstatic inline CGFloat MRCGFloatCeil(CGFloat);\n\n#if defined(__LP64__) && __LP64__\n    static inline CGFloat MRCGFloatCeil(CGFloat x) {\n        return ceil(x);\n    }\n#else\n    static inline CGFloat MRCGFloatCeil(CGFloat x) {\n        return ceilf(x);\n    }\n#endif\n\n\nstatic inline CGRect MRCenterCGSizeInCGRect(CGSize innerRectSize, CGRect outerRect) {\n    CGRect innerRect;\n    innerRect.size = innerRectSize;\n    innerRect.origin.x = outerRect.origin.x + (outerRect.size.width  - innerRectSize.width)  / 2.0f;\n    innerRect.origin.y = outerRect.origin.y + (outerRect.size.height - innerRectSize.height) / 2.0f;\n    return innerRect;\n}\n\n\nstatic inline CGFloat MRRotationForStatusBarOrientation() {\n    UIInterfaceOrientation orientation = UIApplication.sharedApplication.statusBarOrientation;\n    if (orientation == UIInterfaceOrientationLandscapeLeft) {\n        return -M_PI_2;\n    } else if (orientation == UIInterfaceOrientationLandscapeRight) {\n        return M_PI_2;\n    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {\n        return M_PI;\n    }\n    return 0;\n}\n"
  },
  {
    "path": "Podfile",
    "content": "project 'Dash/Dash iOS.xcodeproj'\nplatform :ios, \"9.0\"\ninhibit_all_warnings!\n\ntarget \"Dash\" do\n    pod 'MRProgress', :path => 'Modified Pods/MRProgress/MRProgress.podspec'\n    # Commented out a bunch of stuff in MRBlurView's redraw, otherwise the overlay progress makes the entire screen flicker when it is first shown\n    # MRStopButton has support for whole sizes (their calculations ended up with non-integral frames)\n    # Also overwrote pointInside: for MRCircularProgressView...\n    # Removed AccessibilityValueChangeNotify because it causes VoiceOver to stall\n    pod 'KissXML', :path => 'Modified Pods/KissXML-5.1.2/KissXML.podspec'\n    # Modified to make addChild: remove parent\n    pod 'UIAlertView+Blocks'\n    pod 'UIActionSheet+Blocks'\n    pod 'AutoCoding'\n    pod 'DZNEmptyDataSet', :git => 'https://github.com/benrudhart/DZNEmptyDataSet.git'\n    pod 'JGMethodSwizzler'\n    pod 'DTBonjour', :path => 'Modified Pods/DTBonjour/DTBonjour.podspec'\n    # Modified to add originating IP address support to DTBonjourDataConnection\n    # Also modified to send a delegate message when a connection closes\n    # Replaced asserts() with ifs() in DTBonjourServer start\n    \n    pod 'Reachability'\n    pod 'SAMKeychain'\n    pod 'NSTimer-Blocks'\n    pod 'GZIP'\n    target \"Dash App Store\" do\n        pod 'HockeySDK'\n    end\nend\n\npost_install do | installer |\n    require 'fileutils'\n    FileUtils.cp_r('Pods/Target Support Files/Pods-Dash/Pods-Dash-acknowledgements.plist', 'Dash/Settings.bundle/Cocoa_Pods_Acknowledgements.plist', :remove_destination => true)\nend\n"
  },
  {
    "path": "Pods/AutoCoding/AutoCoding/AutoCoding.h",
    "content": "//\n//  AutoCoding.h\n//\n//  Version 2.2.3\n//\n//  Created by Nick Lockwood on 19/11/2011.\n//  Copyright (c) 2011 Charcoal Design\n//\n//  Distributed under the permissive zlib License\n//  Get the latest version from here:\n//\n//  https://github.com/nicklockwood/AutoCoding\n//\n//  This software is provided 'as-is', without any express or implied warranty.\n//  In no event will the authors be held liable for any damages arising from the\n//  use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//  claim that you wrote the original software. If you use this software in a\n//  product, an acknowledgment in the product documentation would be appreciated\n//  but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//  misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface NSObject (AutoCoding) <NSSecureCoding>\n\n/**\n * Returns a dictionary containing the names and classes of all the properties of\n * the class that will be automatically saved, loaded and copied when the object\n * is archived using `NSKeyedArchiver/Unarchiver`. The values of the dictionary\n * represent the class used to encode each property (e.g. `NSString` for strings,\n * `NSNumber` for numeric values or booleans, `NSValue` for structs, etc).\n *\n * This dictionary is automatically generated by scanning the properties defined\n * in the class definition at runtime. Read-only and private properties will also\n * be coded as long as they have KVC-compliant ivar names (i.e. the ivar matches\n * the property name, or is the same but with a _ prefix). Any properties that\n * are not backed by an ivar, or whose ivar name does not match the property name\n * will not be encoded (this is a design feature, not a limitation - it makes it\n * easier to exclude properties from encoding)\n *\n * It is not normally necessary to override this method unless you wish to add\n * ivars for coding that do not have matching property definitions, or if you\n * wish to code virtual properties (properties or setter/getter method pairs that\n * are not backed by an ivar). If you wish to exclude certain properties from the\n * serialisation process, you can deliberately give them an non KVC-compliant\n * ivar name (see above).\n *\n * Note that this method only returns the properties defined on a particular\n * class and not any properties that are inherited from its superclasses. You\n * *do not* need to call `[super codableProperties]` if you override this method.\n */\n+ (NSDictionary<NSString *, Class> *)codableProperties;\n\n/**\n * Populates the object's properties using the provided `NSCoder` object, based\n * on the `codableProperties` dictionary. This is called internally by the\n * `initWithCoder:` method, but may be useful if you wish to initialise an object\n * from a coded archive after it has already been created. You could even\n * initialise the object by merging the results of several different archives by\n * calling `setWithCoder:` more than once.\n */\n - (void)setWithCoder:(NSCoder *)aDecoder;\n\n/**\n * Returns all the codable properties of the object, including those that are\n * inherited from superclasses. You should not override this method - if you\n * want to add additional properties, override the `+codableProperties` class\n * method instead.\n */\n@property (nonatomic, readonly) NSDictionary<NSString *, Class> *codableProperties;\n \n/**\n * Returns a dictionary of the values of all the codable properties of the\n * object. It is equivalent to calling `dictionaryWithValuesForKeys:` with the\n * result of `object.codableProperties.allKeys` as the parameter.\n */\n@property (nonatomic, readonly) NSDictionary<NSString *, id> *dictionaryRepresentation;\n\n/**\n * Attempts to load the file using the following sequence: 1) If the file is an\n * NSCoded archive, load the root object and return it; 2) If the file is an\n * ordinary Plist, load and return the root object; 3) Return the raw data as an\n * `NSData` object. If the de-serialised object is not a subclass of the class\n * being used to load it, an exception will be thrown (to avoid this, call the\n * method on `NSObject` instead of a specific subclass).\n */\n+ (nullable instancetype)objectWithContentsOfFile:(NSString *)path;\n\n/**\n * Attempts to write the file to disk. This method is overridden by the\n * equivalent methods for `NSData`, `NSDictionary` and `NSArray`, which save the\n * file as a human-readable XML Plist rather than a binary NSCoded Plist archive,\n * but the `objectWithContentsOfFile:` method will correctly de-serialise these\n * again anyway. For any other object it will serialise the object using the\n * `NSCoding` protocol and write out the file as a NSCoded binary Plist archive.\n * Returns `YES` on success and `NO` on failure.\n */\n- (BOOL)writeToFile:(NSString *)filePath atomically:(BOOL)useAuxiliaryFile;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/AutoCoding/AutoCoding/AutoCoding.m",
    "content": "//\n//  AutoCoding.m\n//\n//  Version 2.2.3\n//\n//  Created by Nick Lockwood on 19/11/2011.\n//  Copyright (c) 2011 Charcoal Design\n//\n//  Distributed under the permissive zlib License\n//  Get the latest version from here:\n//\n//  https://github.com/nicklockwood/AutoCoding\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//  claim that you wrote the original software. If you use this software\n//  in a product, an acknowledgment in the product documentation would be\n//  appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//  misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n#import \"AutoCoding.h\"\n#import <objc/runtime.h>\n\n\n#pragma clang diagnostic ignored \"-Wgnu\"\n#pragma clang diagnostic ignored \"-Wpartial-availability\"\n#pragma clang diagnostic ignored \"-Wobjc-designated-initializers\"\n\n\nstatic NSString *const AutocodingException = @\"AutocodingException\";\n\n\n@implementation NSObject (AutoCoding)\n\n+ (BOOL)supportsSecureCoding\n{\n    return YES;\n}\n\n+ (instancetype)objectWithContentsOfFile:(NSString *)filePath\n{\n    //load the file\n    NSData *data = [NSData dataWithContentsOfFile:filePath];\n    \n    //attempt to deserialise data as a plist\n    id object = nil;\n    if (data)\n    {\n        NSPropertyListFormat format;\n        object = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:&format error:NULL];\n       \n\t\t//success?\n\t\tif (object)\n\t\t{\n\t\t\t//check if object is an NSCoded unarchive\n\t\t\tif ([object respondsToSelector:@selector(objectForKeyedSubscript:)] && ((NSDictionary *)object)[@\"$archiver\"])\n\t\t\t{\n\t\t\t\tobject = [NSKeyedUnarchiver unarchiveObjectWithData:data];\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\t//return raw data\n\t\t\tobject = data;\n\t\t}\n    }\n    \n\t//return object\n\treturn object;\n}\n\n- (BOOL)writeToFile:(NSString *)filePath atomically:(BOOL)useAuxiliaryFile\n{\n    //note: NSData, NSDictionary and NSArray already implement this method\n    //and do not save using NSCoding, however the objectWithContentsOfFile\n    //method will correctly recover these objects anyway\n    \n    //archive object\n    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];\n    return [data writeToFile:filePath atomically:useAuxiliaryFile];\n}\n\n+ (NSDictionary<NSString *, Class> *)codableProperties\n{\n    //deprecated\n    SEL deprecatedSelector = NSSelectorFromString(@\"uncodableProperties\");\n    NSArray *uncodableProperties = nil;\n    if ([self respondsToSelector:deprecatedSelector] || [self instancesRespondToSelector:deprecatedSelector])\n    {\n        uncodableProperties = [self valueForKey:@\"uncodableProperties\"];\n        NSLog(@\"AutoCoding Warning: uncodableProperties method is no longer supported. Use ivars, or synthesize your properties using non-KVC-compliant names to avoid coding them instead.\");\n    }\n    \n    unsigned int propertyCount;\n    __autoreleasing NSMutableDictionary *codableProperties = [NSMutableDictionary dictionary];\n    objc_property_t *properties = class_copyPropertyList(self, &propertyCount);\n    for (unsigned int i = 0; i < propertyCount; i++)\n    {\n        //get property name\n        objc_property_t property = properties[i];\n        const char *propertyName = property_getName(property);\n        __autoreleasing NSString *key = @(propertyName);\n\n        //check if codable\n        if (![uncodableProperties containsObject:key])\n        {\n            //get property type\n            Class propertyClass = nil;\n            char *typeEncoding = property_copyAttributeValue(property, \"T\");\n            switch (typeEncoding[0])\n            {\n                case '@':\n                {\n                    if (strlen(typeEncoding) >= 3)\n                    {\n                        char *className = strndup(typeEncoding + 2, strlen(typeEncoding) - 3);\n                        __autoreleasing NSString *name = @(className);\n                        NSRange range = [name rangeOfString:@\"<\"];\n                        if (range.location != NSNotFound)\n                        {\n                            name = [name substringToIndex:range.location];\n                        }\n                        propertyClass = NSClassFromString(name) ?: [NSObject class];\n                        free(className);\n                    }\n                    break;\n                }\n                case 'c':\n                case 'i':\n                case 's':\n                case 'l':\n                case 'q':\n                case 'C':\n                case 'I':\n                case 'S':\n                case 'L':\n                case 'Q':\n                case 'f':\n                case 'd':\n                case 'B':\n                {\n                    propertyClass = [NSNumber class];\n                    break;\n                }\n                case '{':\n                {\n                    propertyClass = [NSValue class];\n                    break;\n                }\n            }\n            free(typeEncoding);\n            \n            if (propertyClass)\n            {\n                //check if there is a backing ivar\n                char *ivar = property_copyAttributeValue(property, \"V\");\n                if (ivar)\n                {\n                    //check if ivar has KVC-compliant name\n                    __autoreleasing NSString *ivarName = @(ivar);\n                    if ([ivarName isEqualToString:key] || [ivarName isEqualToString:[@\"_\" stringByAppendingString:key]])\n                    {\n                        //no setter, but setValue:forKey: will still work\n                        codableProperties[key] = propertyClass;\n                    }\n                    free(ivar);\n                }\n                else\n                {\n                    //check if property is dynamic and readwrite\n                    char *dynamic = property_copyAttributeValue(property, \"D\");\n                    char *readonly = property_copyAttributeValue(property, \"R\");\n                    if (dynamic && !readonly)\n                    {\n                        //no ivar, but setValue:forKey: will still work\n                        codableProperties[key] = propertyClass;\n                    }\n                    free(dynamic);\n                    free(readonly);\n                }\n            }\n        }\n    }\n    \n    free(properties);\n    return codableProperties;\n}\n\n- (NSDictionary<NSString *, Class> *)codableProperties\n{\n    __autoreleasing NSDictionary *codableProperties = objc_getAssociatedObject([self class], _cmd);\n    if (!codableProperties)\n    {\n        codableProperties = [NSMutableDictionary dictionary];\n        Class subclass = [self class];\n        while (subclass != [NSObject class])\n        {\n            [(NSMutableDictionary *)codableProperties addEntriesFromDictionary:[subclass codableProperties]];\n            subclass = [subclass superclass];\n        }\n        codableProperties = [NSDictionary dictionaryWithDictionary:codableProperties];\n        \n        //make the association atomically so that we don't need to bother with an @synchronize\n        objc_setAssociatedObject([self class], _cmd, codableProperties, OBJC_ASSOCIATION_RETAIN);\n    }\n    return codableProperties;\n}\n\n- (NSDictionary<NSString *, id> *)dictionaryRepresentation\n{\n    NSMutableDictionary *dict = [NSMutableDictionary dictionary];\n    for (__unsafe_unretained NSString *key in self.codableProperties)\n    {\n        id value = [self valueForKey:key];\n        if (value) dict[key] = value;\n    }\n    return dict;\n}\n\n- (void)setWithCoder:(NSCoder *)aDecoder\n{\n    BOOL secureAvailable = [aDecoder respondsToSelector:@selector(decodeObjectOfClass:forKey:)];\n    BOOL secureSupported = [[self class] supportsSecureCoding];\n    NSDictionary *properties = self.codableProperties;\n    for (NSString *key in properties)\n    {\n        id object = nil;\n        Class propertyClass = properties[key];\n        if (secureAvailable)\n        {\n            object = [aDecoder decodeObjectOfClass:propertyClass forKey:key];\n        }\n        else\n        {\n            object = [aDecoder decodeObjectForKey:key];\n        }\n        if (object)\n        {\n            if (secureSupported && ![object isKindOfClass:propertyClass] && object != [NSNull null])\n            {\n                [NSException raise:AutocodingException format:@\"Expected '%@' to be a %@, but was actually a %@\", key, propertyClass, [object class]];\n            }\n            [self setValue:object forKey:key];\n        }\n    }\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder\n{\n    [self setWithCoder:aDecoder];\n    return self;\n}\n\n- (void)encodeWithCoder:(NSCoder *)aCoder\n{\n    for (NSString *key in self.codableProperties)\n    {\n        id object = [self valueForKey:key];\n        if (object) [aCoder encodeObject:object forKey:key];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/AutoCoding/LICENCE.md",
    "content": "AutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution."
  },
  {
    "path": "Pods/AutoCoding/README.md",
    "content": "[![Build Status](https://travis-ci.org/nicklockwood/AutoCoding.svg)](https://travis-ci.org/nicklockwood/AutoCoding)\n\n\nPurpose\n--------------\n\nAutoCoding is a category on NSObject that provides automatic support for NSCoding to any object. This means that rather than having to implement the `initWithCoder:` and `encodeWithCoder:` methods yourself, all the model classes in your app can be saved or loaded from a file without you needing to write any additional code.\n\nOf course no automated system can read your mind, so AutoCoding does place certain restrictions on how you design your classes; For example, you should avoid using structs that are not already NSCoding-compliant via NSValue.\n\nUse of AutoCoding is by no means and all-or-nothing decision. You are free to implement your own NSCoding or NSCopying methods on any class in your project and they will simply override the automatically generated methods.\n\n\nSupported OS & SDK Versions\n-----------------------------\n\n* Supported build target - iOS 11.0 / Mac OS 10.12 (Xcode 9.0)\n* Earliest supported deployment target - iOS 9.0 / Mac OS 10.10\n* Earliest compatible deployment target - iOS 4.3 / Mac OS 10.6\n\nNOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this OS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly.\n\n\nARC Compatibility\n------------------\n\nAutoCoding is compatible with both ARC and non-ARC compile targets.\n\n\nThread Safety\n--------------\n\nAutoCoding is fully thread-safe.\n\n\nInstallation\n--------------\n\nTo use the AutoCoding category in your project, just drag the AutoCoding.h and .m files into your project.\n\n\nSecurity\n-------------------\n\nAs of version 2.0, AutoCoding supports the NSSecureCoding protocol automatically, and returns YES for the `+supportsSecureCoding` method for all objects by default. In addition to this, assuming you do not override `+supportsSecureCoding` to return NO, AutoCoding will automatically throw an exception when attempting to decode a class whose type doesn't match the property it is being assigned to. This makes it much harder for a malicious party to craft an NSCoded  file that, when loaded by your app, will cause it to execute code that you didn't intend it to.\n\n\nNSCopying\n------------------\n\nAs of version 2.1, NSCopying is no longer implemented automatically, as this caused some compatibility problems with Core Data NSManagedObjects. If you wish to implement copying, this can be done quite easily by looping over the codableProperties keys and copying those properties individually to a new instance of the object (as follows):\n\n    - (id)copyWithZone:(id)zone\n    {\n        id copy = [[[self class] alloc] init];\n        for (NSString *key in self.codableProperties)\n        {\n            [copy setValue:[self valueForKey:key] forKey:key];\n        }\n        return copy;\n    }\n    \nIn order to properly support NSCopying, you should also override the `-hash` and `-isEqual:` methods for any object you intend to use with copying, so that a copied object has the same hash value and is equal to the original.\n\n\nTips\n--------------------------------------\n\n1. To exclude certain properties of your object from being encoded, you can do so in any of the following ways:\n\n    * Only use an ivar, without declaring a matching @property.\n    * Change the name of the ivar to something that is not KVC compliant (i.e. not the same as the property, or the property name with an _ prefix). You can do this using the @synthesize method, e.g. @synthesize foo = unencodableFoo;\n    * Override the +codableProperties method\n\n2. If you want to perform initialisation of the class post or prior to the properties being loaded via NSCoding, override the `setWithCoder:` method and call the super-implementation before or after applying your own logic, like this:\n\n        - (void)setWithCoder:(NSCoder *)coder\n        {\n            //pre-initialisation\n            [super setWithCoder:coder];\n            //post-initialisation\n        }\n\n    Note that unlike in previous versions, the `init` method is not called when using `initWithCoder:`.\n\n3. If you want to perform some cleanup or post-processing or substitute a different object after the object has been loaded via NSCoding, you can use the `awakeAfterUsingCoder:` method, which is defined in the NSObject class reference.\n\n4. You can add additional coding/decoding logic by overriding the `setWithCoder:` and/or `encodeWithCoder:` methods. As long as you call the [super ...] implementation, the auto-coding will still function.\n\n5. If you wish to substitute a different class for properties of a given type - for example if you have changed the name of a class but wish to retain compatibility with files saved using the old class name, you can substitute a different class for a given name by using the `[NSKeyedUnArchiver setClass:forClassName:]` method.\n\n6. If you have properties of a type that doesn't support NSCoding (e.g. a struct), and you wish to code them yourself by applying a conversion function, mark the property as unecodable by changing its ivar name and override the `setWithCoder:` and `encodeWithCoder:` methods (remembering to call the super-implementations of those methods to automatically load and save the other properties of the object). Like this:\n\n        @synthesize uncodableProperty = noencode_uncodableProperty; //non-KVC-compliant name\n        \n        - (void)setWithCoder:(NSCoder *)coder\n        {\n            [super setWithCoder:coder];\n            self.uncodableProperty = DECODE_VALUE([coder decodeObjectForKey:@\"uncodableProperty\"]);\n        }\n        \n        - (void)encodeWithCoder:(NSCoder *)coder\n        {\n            [super encodeWithCoder:coder];\n            [coder encodeObject:ENCODE_VALUE(self.newProperty) forKey:@\"uncodableProperty\"];\n        }\n\n7. If you have changed the name of a property, but want to check for the existence of the old key name for backwards compatibility, override the `setWithCoder:` method and add a check for the old property as follows:\n\n        - (void)setWithCoder:(NSCoder *)coder\n        {\n            [super setWithCoder:coder];\n            self.newProperty = [coder objectForKey:@\"oldProperty\"] ?: self.newProperty;\n        }\n\n8. If you have changed the name of a property, but want to load *and save* it using the old key name for backwards compatibility, give the new property a non-KVC-compliant ivar name and override the `setWithCoder:`/`encodeWithCoder:` methods to save and load the property using the old name (remembering to call the super-implementations of those methods to automatically load and save the other properties of the object). Like this:\n\n        @synthesize newProperty = noencode_newProperty; //non-KVC-compliant name\n        \n        - (void)setWithCoder:(NSCoder *)coder\n        {\n            [super setWithCoder:coder];\n            self.newProperty = [coder objectForKey:@\"oldProperty\"];\n        }\n        \n        - (void)encodeWithCoder:(NSCoder *)coder\n        {\n            [super encodeWithCoder:coder];\n            [coder encodeObject:self.newProperty forKey:@\"oldProperty\"];\n        }\n        \n        \nRelease Notes\n--------------\n \nVersion 2.2.3\n\n- Updated for Xcode 9\n- Fixed nullability annotation error in header\n\nVersion 2.2.2\n \n- Fixed warnings on latest Xcode\n- Added nullability and lightweight generics\n- Moved method and property documentation into the header file\n\nVersion 2.2.1\n\n- Added missing <Foundation/Foundation.h> import, required on Xcode 6.x\n\nVersion 2.2\n\n- Now supports @dynamic properties, allowing AutoCoding to be used with NSManagedObjects\n- Added support for additional integer types\n- Fixed unit tests\n\nVersion 2.1\n\n- Removed automatic NSCopying implementation (see README for details)\n- The +codableProperties method will no longer include properties whose ivars are not KVC compliant, even if they are readwrite. This makes it easier to mark readwrite properties as uncodable without needing to override methods\n- The +uncodableProperties method is now deprecated\n- dictionaryRepresentation method will now no longer include NSNull entries for nil values (these will simply be omitted from the result instead)\n- Now complies with the -Weverything warning level\n\nVersion 2.0.3\n\n- Now complies with the -Wextra warning level\n\nVersion 2.0.2\n\n- Fixed longstanding issue where uncodableProperties / uncodableKeys was ignored for readonly properties. \n\nVersion 2.0.1\n\n- Fixed bug where AutoCoding's NSCopying implementation was not compatible with properties using copy semantics due to lack of a copyWithZone: implementation.\n- Now returns YES for respondsToSelector:@selector(copyWithZone:).\n\nVersion 2.0\n\n- AutoCoding now implements the NSSecureCoding protocol automatically\n- AutoCoding now detects property types automatically and throws an exception by default if encoded classes to not match the expected type\n- Autocoding 2.0 is data-compatible with previous releases, but may require code changes when upgrading.\n\nVersion 1.3.1\n\n- Fixed issue with CoreData where AutoCoding's copyWithZone: implementation conflicted with NSManagedObjects\n- Due to changes in the automatic NSCopying implementation, calling `[super copyWithZone:]` will no longer work. If you need to do this, override the `copy` method and call `[super copy]` instead\n- Added Podspec file\n\nVersion 1.3\n\n- AutoCoding no longer attempts to encode virtual properties. Only ivar-backed properties will be encoded\n- Added dictionaryRepresentation method for quickly accessing all properties of a class\n- The codableKeys and uncodableKeys methods are now class methods, allowing them to be used more easily in factory methods \n- The class-level codable/uncodableKeys methods now only return the properties for the class on which they are called, not all of its superclasses as well\n- It is no longer necessary to call [super codableKeys] or [super uncodableKeys] and merge arrays when overriding the codableKeys or uncodableKeys class methods on a subclass (overriding the codableKeys instance method is not recommended)\n\nVersion 1.2.1\n\n- writeToFile:atomically: method now returns a BOOL to indicate success\n- Changed category file names\n\nVersion 1.2\n\n- Read-only properties can now be copied and coded as long as they have a KVC compliant ivar (i.e. one whose name matches the property or the property with the _ prefix)\n- initWithCoder: no longer calls [self init], in compliance with Apple docs\n- codableKeys method now uses caching for better performance\n- Exposed previously private setWithCoder: method used by BaseModel library\n\nVersion 1.1.2\n\n- Switched constructor to return new type-safe `instancetype` instead of id, making it easier to use dot-syntax property accessors on loaded instances.\n\nVersion 1.1.1\n\n- Read-only properties are now excluded from codableKeys\n- Added unit tests\n\nVersion 1.1\n\n- Added automatic NSCopying implementation\n- writeToFile now obeys the useAuxiliaryFile parameter\n\nVersion 1.0\n\n- Initial release\n"
  },
  {
    "path": "Pods/DZNEmptyDataSet/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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"
  },
  {
    "path": "Pods/DZNEmptyDataSet/README.md",
    "content": "DZNEmptyDataSet\n=================\n\n[![Pod Version](http://img.shields.io/cocoapods/v/DZNEmptyDataSet.svg)](http://cocoadocs.org/docsets/DZNEmptyDataSet/)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![License](http://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT)\n\n### Projects using this library\n\n[Add your project to the list here](https://github.com/dzenbot/DZNEmptyDataSet/wiki/Projects-using-DZNEmptyDataSet) and provide a (320px wide) render of the result.\n\n\n### The Empty Data Set Pattern\nAlso known as *[Empty State](http://emptystat.es/)* or *[Blank Slate](http://patternry.com/p=blank-slate/)*.\n\nMost applications show lists of content (data sets), which many turn out to be empty at one point, specially for new users with blank accounts. Empty screens create confusion by not being clear about what's going on, if there is an error/bug or if the user is supposed to do something within your app to be able to consume the content.\n\nPlease read this very interesting article about [*Designing For The Empty States*](http://tympanus.net/codrops/2013/01/09/designing-for-the-empty-states/).\n\n![Screenshots_Row1](https://raw.githubusercontent.com/dzenbot/UITableView-DataSet/master/Examples/Applications/Screenshots/Screenshots_row1.png)\n![Screenshots_Row2](https://raw.githubusercontent.com/dzenbot/UITableView-DataSet/master/Examples/Applications/Screenshots/Screenshots_row2.png)\n(*These are real life examples, available in the 'Applications' sample project*)\n\n**[Empty Data Sets](http://pttrns.com/?did=1&scid=30)** are helpful for:\n* Avoiding white-screens and communicating to your users why the screen is empty.\n* Calling to action (particularly as an onboarding process).\n* Avoiding other interruptive mechanisms like showing error alerts.\n* Beeing consistent and improving the user experience.\n* Delivering a brand presence.\n\n\n### Features\n* Compatible with UITableView and UICollectionView. Also compatible with UISearchDisplayController and UIScrollView.\n* Gives multiple possibilities of layout and appearance, by showing an image and/or title label and/or description label and/or button.\n* Uses NSAttributedString for easier appearance customisation.\n* Uses auto-layout to automagically center the content to the tableview, with auto-rotation support. Also accepts custom vertical and horizontal alignment.\n* Background color customisation.\n* Allows tap gesture on the whole tableview rectangle (useful for resigning first responder or similar actions).\n* For more advanced customisation, it allows a custom view.\n* Compatible with Storyboard.\n* Compatible with iOS 6 or later.\n* Compatible with iPhone and iPad.\n* **App Store ready**\n\nThis library has been designed in a way where you won't need to extend UITableView or UICollectionView class. It will still work when using UITableViewController or UICollectionViewController.\nBy just conforming to DZNEmptyDataSetSource & DZNEmptyDataSetDelegate, you will be able to fully customize the content and appearance of the empty states for your application.\n\n\n## Installation\n\nAvailable in [Cocoa Pods](http://cocoapods.org/?q=DZNEmptyDataSet)\n```ruby\npod 'DZNEmptyDataSet'\n```\nTo integrate DZNEmptyDataSet into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"dzenbot/DZNEmptyDataSet\"\n```\n\n\n## How to use\nFor complete documentation, [visit CocoaPods' auto-generated doc](http://cocoadocs.org/docsets/DZNEmptyDataSet/)\n\n### Import\n```objc\n#import \"UIScrollView+EmptyDataSet.h\"\n```\n\n### Protocol Conformance\nConform to datasource and/or delegate.\n```objc\n@interface MainViewController : UITableViewController <DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>\n\n- (void)viewDidLoad\n{\n    [super viewDidLoad];\n\n    self.tableView.emptyDataSetSource = self;\n    self.tableView.emptyDataSetDelegate = self;\n    \n    // A little trick for removing the cell separators\n    self.tableView.tableFooterView = [UIView new];\n}\n```\n\n### Data Source Implementation\nReturn the content you want to show on the empty state, and take advantage of NSAttributedString features to customise the text appearance.\n\nThe image for the empty state:\n```objc\n- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return [UIImage imageNamed:@\"empty_placeholder\"];\n}\n```\n\nThe image view animation\n```objc\n- (CAAnimation *)imageAnimationForEmptyDataSet:(UIScrollView *)scrollView\n{\n    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @\"transform\"];\n    \n    animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];\n    animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0.0, 0.0, 1.0)];\n    \n    animation.duration = 0.25;\n    animation.cumulative = YES;\n    animation.repeatCount = MAXFLOAT;\n    \n    return animation;\n}\n```\n\nThe attributed string for the title of the empty state:\n```objc\n- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView\n{\n    NSString *text = @\"Please Allow Photo Access\";\n    \n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:18.0f],\n                                 NSForegroundColorAttributeName: [UIColor darkGrayColor]};\n    \n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];\n}\n```\n\nThe attributed string for the description of the empty state:\n```objc\n- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView\n{\n    NSString *text = @\"This allows you to share photos from your library and save photos to your camera roll.\";\n    \n    NSMutableParagraphStyle *paragraph = [NSMutableParagraphStyle new];\n    paragraph.lineBreakMode = NSLineBreakByWordWrapping;\n    paragraph.alignment = NSTextAlignmentCenter;\n    \n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:14.0f],\n                                 NSForegroundColorAttributeName: [UIColor lightGrayColor],\n                                 NSParagraphStyleAttributeName: paragraph};\n                                 \n    return [[NSAttributedString alloc] initWithString:text attributes:attributes];                      \n}\n```\n\nThe attributed string to be used for the specified button state:\n```objc\n- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state\n{\n    NSDictionary *attributes = @{NSFontAttributeName: [UIFont boldSystemFontOfSize:17.0f]};\n\n    return [[NSAttributedString alloc] initWithString:@\"Continue\" attributes:attributes];\n}\n```\n\nor the image to be used for the specified button state:\n```objc\n- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state\n{\n    return [UIImage imageNamed:@\"button_image\"];\n}\n```\n\nThe background color for the empty state:\n```objc\n- (UIColor *)backgroundColorForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return [UIColor whiteColor];\n}\n```\n\nIf you need a more complex layout, you can return a custom view instead:\n```objc\n- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView\n{\n    UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];\n    [activityView startAnimating];\n    return activityView;\n}\n```\n\nAdditionally, you can also adjust the vertical alignment of the content view (ie: useful when there is tableHeaderView visible):\n```objc\n- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return -self.tableView.tableHeaderView.frame.size.height/2.0f;\n}\n```\n\nFinally, you can separate components from each other (default separation is 11 pts):\n```objc\n- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView\n{\n    return 20.0f;\n}\n```\n\n\n### Delegate Implementation\nReturn the behaviours you would expect from the empty states, and receive the user events.\n\nAsks to know if the empty state should be rendered and displayed (Default is YES) :\n```objc\n- (BOOL)emptyDataSetShouldDisplay:(UIScrollView *)scrollView\n{\n    return YES;\n}\n```\n\nAsks for interaction permission (Default is YES) :\n```objc\n- (BOOL)emptyDataSetShouldAllowTouch:(UIScrollView *)scrollView\n{\n    return YES;\n}\n```\n\nAsks for scrolling permission (Default is NO) :\n```objc\n- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView\n{\n    return YES;\n}\n```\n\nAsks for image view animation permission (Default is NO) :\n```objc\n- (BOOL) emptyDataSetShouldAllowImageViewAnimate:(UIScrollView *)scrollView\n{\n    return YES;\n}\n```\n\nNotifies when the dataset view was tapped:\n```objc\n- (void)emptyDataSetDidTapView:(UIScrollView *)scrollView\n{\n    // Do something\n}\n```\n\nNotifies when the data set call to action button was tapped:\n```objc\n- (void)emptyDataSetDidTapButton:(UIScrollView *)scrollView\n{\n    // Do something\n}\n```\n\n### Refresh layout\nIf you need to refresh the empty state layout, simply call:\n\n```objc\n[self.tableView reloadData];\n```\nor\n```objc\n[self.collectionView reloadData];\n```\ndepending of which you are using.\n\n### Force layout update\nYou can also call `[self.tableView reloadEmptyDataSet]` to invalidate the current empty state layout and trigger a layout update, bypassing `-reloadData`. This might be useful if you have a lot of logic on your data source that you want to avoid calling, when not needed. `[self.tableView reloadEmptyDataSet]` is the only way to refresh content when using with UIScrollView.\n\n\n## Sample projects\n\n#### Applications\nThis project replicates several popular application's empty states (~20) with their exact content and appearance, such as Airbnb, Dropbox, Facebook, Foursquare, and many others. See how easy and flexible it is to customize the appearance of your empty states. You can also use this project as a playground to test things.\n\n#### Countries\nThis project shows a list of the world countries loaded from CoreData. It uses NSFecthedResultController for filtering search. When searching and no content is matched, a simple empty state is shown. See how to interact between the UITableViewDataSource and the DZNEmptyDataSetSource protocols, while using a typical CoreData stack.\n\n#### Colors\nThis project is a simple example of how this library also works with UICollectionView and UISearchDisplayController, while using Storyboards.\n\n\n## Collaboration\nFeel free to collaborate with ideas, issues and/or pull requests.\n\n\n## License\n(The MIT License)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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"
  },
  {
    "path": "Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.h",
    "content": "//\n//  UIScrollView+EmptyDataSet.h\n//  DZNEmptyDataSet\n//  https://github.com/dzenbot/DZNEmptyDataSet\n//\n//  Created by Ignacio Romero Zurbuchen on 6/20/14.\n//  Copyright (c) 2014 DZN Labs. All rights reserved.\n//  Licence: MIT-Licence\n//\n\n#import <UIKit/UIKit.h>\n\n@protocol DZNEmptyDataSetSource;\n@protocol DZNEmptyDataSetDelegate;\n\n/**\n A drop-in UITableView/UICollectionView superclass category for showing empty datasets whenever the view has no content to display.\n @discussion It will work automatically, by just conforming to DZNEmptyDataSetSource, and returning the data you want to show.\n */\n@interface UIScrollView (EmptyDataSet)\n\n/** The empty datasets data source. */\n@property (nonatomic, weak) IBOutlet id <DZNEmptyDataSetSource> emptyDataSetSource;\n/** The empty datasets delegate. */\n@property (nonatomic, weak) IBOutlet id <DZNEmptyDataSetDelegate> emptyDataSetDelegate;\n/** YES if any empty dataset is visible. */\n@property (nonatomic, readonly, getter = isEmptyDataSetVisible) BOOL emptyDataSetVisible;\n\n/**\n Reloads the empty dataset content receiver.\n @discussion Call this method to force all the data to refresh. Calling -reloadData is similar, but this forces only the empty dataset to reload, not the entire table view or collection view.\n */\n- (void)reloadEmptyDataSet;\n\n@end\n\n\n/**\n The object that acts as the data source of the empty datasets.\n @discussion The data source must adopt the DZNEmptyDataSetSource protocol. The data source is not retained. All data source methods are optional.\n */\n@protocol DZNEmptyDataSetSource <NSObject>\n@optional\n\n/**\n Asks the data source for the title of the dataset.\n The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.\n \n @param scrollView A scrollView subclass informing the data source.\n @return An attributed string for the dataset title, combining font, text color, text pararaph style, etc.\n */\n- (NSAttributedString *)titleForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n Asks the data source for the description of the dataset.\n The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.\n \n @param scrollView A scrollView subclass informing the data source.\n @return An attributed string for the dataset description text, combining font, text color, text pararaph style, etc.\n */\n- (NSAttributedString *)descriptionForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n Asks the data source for the image of the dataset.\n \n @param scrollView A scrollView subclass informing the data source.\n @return An image for the dataset.\n */\n- (UIImage *)imageForEmptyDataSet:(UIScrollView *)scrollView;\n\n\n/**\n Asks the data source for a tint color of the image dataset. Default is nil.\n \n @param scrollView A scrollView subclass object informing the data source.\n @return A color to tint the image of the dataset.\n */\n- (UIColor *)imageTintColorForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n *  Asks the data source for the image animation of the dataset.\n *\n *  @param scrollView A scrollView subclass object informing the delegate.\n *\n *  @return image animation\n */\n- (CAAnimation *) imageAnimationForEmptyDataSet:(UIScrollView *) scrollView;\n\n/**\n Asks the data source for the title to be used for the specified button state.\n The dataset uses a fixed font style by default, if no attributes are set. If you want a different font style, return a attributed string.\n \n @param scrollView A scrollView subclass object informing the data source.\n @param state The state that uses the specified title. The possible values are described in UIControlState.\n @return An attributed string for the dataset button title, combining font, text color, text pararaph style, etc.\n */\n- (NSAttributedString *)buttonTitleForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state;\n\n/**\n Asks the data source for the image to be used for the specified button state.\n This method will override buttonTitleForEmptyDataSet:forState: and present the image only without any text.\n \n @param scrollView A scrollView subclass object informing the data source.\n @param state The state that uses the specified title. The possible values are described in UIControlState.\n @return An image for the dataset button imageview.\n */\n- (UIImage *)buttonImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state;\n\n/**\n Asks the data source for a background image to be used for the specified button state.\n There is no default style for this call.\n \n @param scrollView A scrollView subclass informing the data source.\n @param state The state that uses the specified image. The values are described in UIControlState.\n @return An attributed string for the dataset button title, combining font, text color, text pararaph style, etc.\n */\n- (UIImage *)buttonBackgroundImageForEmptyDataSet:(UIScrollView *)scrollView forState:(UIControlState)state;\n\n/**\n Asks the data source for the background color of the dataset. Default is clear color.\n \n @param scrollView A scrollView subclass object informing the data source.\n @return A color to be applied to the dataset background view.\n */\n- (UIColor *)backgroundColorForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n Asks the data source for a custom view to be displayed instead of the default views such as labels, imageview and button. Default is nil.\n Use this method to show an activity view indicator for loading feedback, or for complete custom empty data set.\n Returning a custom view will ignore -offsetForEmptyDataSet and -spaceHeightForEmptyDataSet configurations.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return The custom view.\n */\n- (UIView *)customViewForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n Asks the data source for a offset for vertical and horizontal alignment of the content. Default is CGPointZero.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return The offset for vertical and horizontal alignment.\n */\n- (CGPoint)offsetForEmptyDataSet:(UIScrollView *)scrollView DEPRECATED_MSG_ATTRIBUTE(\"Use -verticalOffsetForEmptyDataSet:\");\n- (CGFloat)verticalOffsetForEmptyDataSet:(UIScrollView *)scrollView;\n\n/**\n Asks the data source for a vertical space between elements. Default is 11 pts.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return The space height between elements.\n */\n- (CGFloat)spaceHeightForEmptyDataSet:(UIScrollView *)scrollView;\n\n@end\n\n\n/**\n The object that acts as the delegate of the empty datasets.\n @discussion The delegate can adopt the DZNEmptyDataSetDelegate protocol. The delegate is not retained. All delegate methods are optional.\n \n @discussion All delegate methods are optional. Use this delegate for receiving action callbacks.\n */\n@protocol DZNEmptyDataSetDelegate <NSObject>\n@optional\n\n/**\n Asks the delegate to know if the empty dataset should fade in when displayed. Default is YES.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return YES if the empty dataset should fade in.\n */\n- (BOOL)emptyDataSetShouldFadeIn:(UIScrollView *)scrollView;\n\n/**\n Asks the delegate to know if the empty dataset should be rendered and displayed. Default is YES.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return YES if the empty dataset should show.\n */\n- (BOOL)emptyDataSetShouldDisplay:(UIScrollView *)scrollView;\n\n/**\n Asks the delegate for touch permission. Default is YES.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return YES if the empty dataset receives touch gestures.\n */\n- (BOOL)emptyDataSetShouldAllowTouch:(UIScrollView *)scrollView;\n\n/**\n Asks the delegate for scroll permission. Default is NO.\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return YES if the empty dataset is allowed to be scrollable.\n */\n- (BOOL)emptyDataSetShouldAllowScroll:(UIScrollView *)scrollView;\n\n/**\n Asks the delegate for image view animation permission. Default is NO.\n Make sure to return a valid CAAnimation object from imageAnimationForEmptyDataSet:\n \n @param scrollView A scrollView subclass object informing the delegate.\n @return YES if the empty dataset is allowed to animate\n */\n- (BOOL)emptyDataSetShouldAnimateImageView:(UIScrollView *)scrollView;\n\n/**\n Tells the delegate that the empty dataset view was tapped.\n Use this method either to resignFirstResponder of a textfield or searchBar.\n \n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetDidTapView:(UIScrollView *)scrollView DEPRECATED_MSG_ATTRIBUTE(\"Use emptyDataSet:didTapView:\");\n\n/**\n Tells the delegate that the action button was tapped.\n \n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetDidTapButton:(UIScrollView *)scrollView DEPRECATED_MSG_ATTRIBUTE(\"Use emptyDataSet:didTapButton:\");\n\n/**\n Tells the delegate that the empty dataset view was tapped.\n Use this method either to resignFirstResponder of a textfield or searchBar.\n \n @param scrollView A scrollView subclass informing the delegate.\n @param view the view tapped by the user\n */\n- (void)emptyDataSet:(UIScrollView *)scrollView didTapView:(UIView *)view;\n\n/**\n Tells the delegate that the action button was tapped.\n \n @param scrollView A scrollView subclass informing the delegate.\n @param button the button tapped by the user\n */\n- (void)emptyDataSet:(UIScrollView *)scrollView didTapButton:(UIButton *)button;\n\n/**\n Tells the delegate that the empty data set will appear.\n\n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetWillAppear:(UIScrollView *)scrollView;\n\n/**\n Tells the delegate that the empty data set did appear.\n\n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetDidAppear:(UIScrollView *)scrollView;\n\n/**\n Tells the delegate that the empty data set will disappear.\n\n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetWillDisappear:(UIScrollView *)scrollView;\n\n/**\n Tells the delegate that the empty data set did disappear.\n\n @param scrollView A scrollView subclass informing the delegate.\n */\n- (void)emptyDataSetDidDisappear:(UIScrollView *)scrollView;\n\n@end\n"
  },
  {
    "path": "Pods/DZNEmptyDataSet/Source/UIScrollView+EmptyDataSet.m",
    "content": "//\n//  UIScrollView+EmptyDataSet.m\n//  DZNEmptyDataSet\n//  https://github.com/dzenbot/DZNEmptyDataSet\n//\n//  Created by Ignacio Romero Zurbuchen on 6/20/14.\n//  Copyright (c) 2014 DZN Labs. All rights reserved.\n//  Licence: MIT-Licence\n//\n\n#import \"UIScrollView+EmptyDataSet.h\"\n#import <objc/runtime.h>\n\n@interface UIView (DZNConstraintBasedLayoutExtensions)\n\n- (NSLayoutConstraint *)equallyRelatedConstraintWithView:(UIView *)view attribute:(NSLayoutAttribute)attribute;\n\n@end\n\n@interface DZNEmptyDataSetView : UIView\n\n@property (nonatomic, readonly) UIView *contentView;\n@property (nonatomic, readonly) UILabel *titleLabel;\n@property (nonatomic, readonly) UILabel *detailLabel;\n@property (nonatomic, readonly) UIImageView *imageView;\n@property (nonatomic, readonly) UIButton *button;\n@property (nonatomic, strong) UIView *customView;\n@property (nonatomic, strong) UITapGestureRecognizer *tapGesture;\n\n@property (nonatomic, assign) CGFloat verticalOffset;\n@property (nonatomic, assign) CGFloat verticalSpace;\n\n@property (nonatomic, assign) BOOL fadeInOnDisplay;\n\n- (void)setupConstraints;\n- (void)prepareForReuse;\n\n@end\n\n\n#pragma mark - UIScrollView+EmptyDataSet\n\nstatic char const * const kEmptyDataSetSource =     \"emptyDataSetSource\";\nstatic char const * const kEmptyDataSetDelegate =   \"emptyDataSetDelegate\";\nstatic char const * const kEmptyDataSetView =       \"emptyDataSetView\";\n\n#define kEmptyImageViewAnimationKey @\"com.dzn.emptyDataSet.imageViewAnimation\"\n\n@interface UIScrollView () <UIGestureRecognizerDelegate>\n@property (nonatomic, readonly) DZNEmptyDataSetView *emptyDataSetView;\n@end\n\n@implementation UIScrollView (DZNEmptyDataSet)\n\n#pragma mark - Getters (Public)\n\n- (id<DZNEmptyDataSetSource>)emptyDataSetSource\n{\n    return objc_getAssociatedObject(self, kEmptyDataSetSource);\n}\n\n- (id<DZNEmptyDataSetDelegate>)emptyDataSetDelegate\n{\n    return objc_getAssociatedObject(self, kEmptyDataSetDelegate);\n}\n\n- (BOOL)isEmptyDataSetVisible\n{\n    UIView *view = objc_getAssociatedObject(self, kEmptyDataSetView);\n    return view ? !view.hidden : NO;\n}\n\n\n#pragma mark - Getters (Private)\n\n- (DZNEmptyDataSetView *)emptyDataSetView\n{\n    DZNEmptyDataSetView *view = objc_getAssociatedObject(self, kEmptyDataSetView);\n    \n    if (!view)\n    {\n        view = [DZNEmptyDataSetView new];\n        view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;\n        view.hidden = YES;\n        \n        view.tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dzn_didTapContentView:)];\n        view.tapGesture.delegate = self;\n        [view addGestureRecognizer:view.tapGesture];\n        \n        [self setEmptyDataSetView:view];\n    }\n    return view;\n}\n\n- (BOOL)dzn_canDisplay\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource conformsToProtocol:@protocol(DZNEmptyDataSetSource)]) {\n        if ([self isKindOfClass:[UITableView class]] || [self isKindOfClass:[UICollectionView class]] || [self isKindOfClass:[UIScrollView class]]) {\n            return YES;\n        }\n    }\n    \n    return NO;\n}\n\n- (NSInteger)dzn_itemsCount\n{\n    NSInteger items = 0;\n    \n    if (![self respondsToSelector:@selector(dataSource)]) {\n        return items;\n    }\n    \n    if ([self isKindOfClass:[UITableView class]]) {\n        \n        id <UITableViewDataSource> dataSource = [self performSelector:@selector(dataSource)];\n        UITableView *tableView = (UITableView *)self;\n        \n        NSInteger sections = 1;\n        if ([dataSource respondsToSelector:@selector(numberOfSectionsInTableView:)]) {\n            sections = [dataSource numberOfSectionsInTableView:tableView];\n        }\n        \n        for (NSInteger i = 0; i < sections; i++) {\n            items += [dataSource tableView:tableView numberOfRowsInSection:i];\n        }\n    }\n    else if ([self isKindOfClass:[UICollectionView class]]) {\n        \n        id <UICollectionViewDataSource> dataSource = [self performSelector:@selector(dataSource)];\n        UICollectionView *collectionView = (UICollectionView *)self;\n        \n        NSInteger sections = 1;\n        if ([dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]) {\n            sections = [dataSource numberOfSectionsInCollectionView:collectionView];\n        }\n        \n        for (NSInteger i = 0; i < sections; i++) {\n            items += [dataSource collectionView:collectionView numberOfItemsInSection:i];\n        }\n    }\n    \n    return items;\n}\n\n\n#pragma mark - Data Source Getters\n\n- (NSAttributedString *)dzn_titleLabelString\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(titleForEmptyDataSet:)]) {\n        NSAttributedString *string = [self.emptyDataSetSource titleForEmptyDataSet:self];\n        if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @\"You must return a valid NSAttributedString object -titleForEmptyDataSet:\");\n        return string;\n    }\n    return nil;\n}\n\n- (NSAttributedString *)dzn_detailLabelString\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(descriptionForEmptyDataSet:)]) {\n        NSAttributedString *string = [self.emptyDataSetSource descriptionForEmptyDataSet:self];\n        if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @\"You must return a valid NSAttributedString object -descriptionForEmptyDataSet:\");\n        return string;\n    }\n    return nil;\n}\n\n- (UIImage *)dzn_image\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageForEmptyDataSet:)]) {\n        UIImage *image = [self.emptyDataSetSource imageForEmptyDataSet:self];\n        if (image) NSAssert([image isKindOfClass:[UIImage class]], @\"You must return a valid UIImage object for -imageForEmptyDataSet:\");\n        return image;\n    }\n    return nil;\n}\n\n- (CAAnimation *) dzn_imageAnimation\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageAnimationForEmptyDataSet:)]) {\n        CAAnimation *imageAnimation = [self.emptyDataSetSource imageAnimationForEmptyDataSet:self];\n        if (imageAnimation) NSAssert([imageAnimation isKindOfClass:[CAAnimation class]], @\"You must return a valid UIImage object for -imageForEmptyDataSet:\");\n        return imageAnimation;\n    }\n    return nil;\n}\n\n- (UIColor *)dzn_imageTintColor\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(imageTintColorForEmptyDataSet:)]) {\n        UIColor *color = [self.emptyDataSetSource imageTintColorForEmptyDataSet:self];\n        if (color) NSAssert([color isKindOfClass:[UIColor class]], @\"You must return a valid UIColor object -imageTintColorForEmptyDataSet:\");\n        return color;\n    }\n    return nil;\n}\n\n- (NSAttributedString *)dzn_buttonTitleForState:(UIControlState)state\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonTitleForEmptyDataSet:forState:)]) {\n        NSAttributedString *string = [self.emptyDataSetSource buttonTitleForEmptyDataSet:self forState:state];\n        if (string) NSAssert([string isKindOfClass:[NSAttributedString class]], @\"You must return a valid NSAttributedString object for -buttonTitleForEmptyDataSet:forState:\");\n        return string;\n    }\n    return nil;\n}\n\n- (UIImage *)dzn_buttonImageForState:(UIControlState)state\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonImageForEmptyDataSet:forState:)]) {\n        UIImage *image = [self.emptyDataSetSource buttonImageForEmptyDataSet:self forState:state];\n        if (image) NSAssert([image isKindOfClass:[UIImage class]], @\"You must return a valid UIImage object for -buttonImageForEmptyDataSet:forState:\");\n        return image;\n    }\n    return nil;\n}\n\n- (UIImage *)dzn_buttonBackgroundImageForState:(UIControlState)state\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(buttonBackgroundImageForEmptyDataSet:forState:)]) {\n        UIImage *image = [self.emptyDataSetSource buttonBackgroundImageForEmptyDataSet:self forState:state];\n        if (image) NSAssert([image isKindOfClass:[UIImage class]], @\"You must return a valid UIImage object for -buttonBackgroundImageForEmptyDataSet:forState:\");\n        return image;\n    }\n    return nil;\n}\n\n- (UIColor *)dzn_dataSetBackgroundColor\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(backgroundColorForEmptyDataSet:)]) {\n        UIColor *color = [self.emptyDataSetSource backgroundColorForEmptyDataSet:self];\n        if (color) NSAssert([color isKindOfClass:[UIColor class]], @\"You must return a valid UIColor object -backgroundColorForEmptyDataSet:\");\n        return color;\n    }\n    return [UIColor clearColor];\n}\n\n- (UIView *)dzn_customView\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(customViewForEmptyDataSet:)]) {\n        UIView *view = [self.emptyDataSetSource customViewForEmptyDataSet:self];\n        if (view) NSAssert([view isKindOfClass:[UIView class]], @\"You must return a valid UIView object for -customViewForEmptyDataSet:\");\n        return view;\n    }\n    return nil;\n}\n\n- (CGFloat)dzn_verticalOffset\n{\n    CGFloat offset = 0.0;\n    \n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(verticalOffsetForEmptyDataSet:)]) {\n        offset = [self.emptyDataSetSource verticalOffsetForEmptyDataSet:self];\n    }\n    return offset;\n}\n\n- (CGFloat)dzn_verticalSpace\n{\n    if (self.emptyDataSetSource && [self.emptyDataSetSource respondsToSelector:@selector(spaceHeightForEmptyDataSet:)]) {\n        return [self.emptyDataSetSource spaceHeightForEmptyDataSet:self];\n    }\n    return 0.0;\n}\n\n\n#pragma mark - Delegate Getters & Events (Private)\n\n- (BOOL)dzn_shouldFadeIn {\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldFadeIn:)]) {\n        return [self.emptyDataSetDelegate emptyDataSetShouldFadeIn:self];\n    }\n    return YES;\n}\n\n- (BOOL)dzn_shouldDisplay\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldDisplay:)]) {\n        return [self.emptyDataSetDelegate emptyDataSetShouldDisplay:self];\n    }\n    return YES;\n}\n\n- (BOOL)dzn_isTouchAllowed\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAllowTouch:)]) {\n        return [self.emptyDataSetDelegate emptyDataSetShouldAllowTouch:self];\n    }\n    return YES;\n}\n\n- (BOOL)dzn_isScrollAllowed\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAllowScroll:)]) {\n        return [self.emptyDataSetDelegate emptyDataSetShouldAllowScroll:self];\n    }\n    return NO;\n}\n\n- (BOOL)dzn_isImageViewAnimateAllow\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetShouldAnimateImageView:)]) {\n        return [self.emptyDataSetDelegate emptyDataSetShouldAnimateImageView:self];\n    }\n    return NO;\n}\n\n- (void)dzn_willAppear\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetWillAppear:)]) {\n        [self.emptyDataSetDelegate emptyDataSetWillAppear:self];\n    }\n}\n\n- (void)dzn_didAppear\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidAppear:)]) {\n        [self.emptyDataSetDelegate emptyDataSetDidAppear:self];\n    }\n}\n\n- (void)dzn_willDisappear\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetWillDisappear:)]) {\n        [self.emptyDataSetDelegate emptyDataSetWillDisappear:self];\n    }\n}\n\n- (void)dzn_didDisappear\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidDisappear:)]) {\n        [self.emptyDataSetDelegate emptyDataSetDidDisappear:self];\n    }\n}\n\n- (void)dzn_didTapContentView:(id)sender\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSet:didTapView:)]) {\n        [self.emptyDataSetDelegate emptyDataSet:self didTapView:sender];\n    }\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n    else if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidTapView:)]) {\n        [self.emptyDataSetDelegate emptyDataSetDidTapView:self];\n    }\n#pragma clang diagnostic pop\n}\n\n- (void)dzn_didTapDataButton:(id)sender\n{\n    if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSet:didTapButton:)]) {\n        [self.emptyDataSetDelegate emptyDataSet:self didTapButton:sender];\n    }\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n    else if (self.emptyDataSetDelegate && [self.emptyDataSetDelegate respondsToSelector:@selector(emptyDataSetDidTapButton:)]) {\n        [self.emptyDataSetDelegate emptyDataSetDidTapButton:self];\n    }\n#pragma clang diagnostic pop\n}\n\n\n#pragma mark - Setters (Public)\n\n- (void)setEmptyDataSetSource:(id<DZNEmptyDataSetSource>)datasource\n{\n    if (!datasource || ![self dzn_canDisplay]) {\n        [self dzn_invalidate];\n    }\n    \n    objc_setAssociatedObject(self, kEmptyDataSetSource, datasource, OBJC_ASSOCIATION_ASSIGN);\n    \n    // We add method sizzling for injecting -dzn_reloadData implementation to the native -reloadData implementation\n    [self swizzleIfPossible:@selector(reloadData)];\n    \n    // Exclusively for UITableView, we also inject -dzn_reloadData to -endUpdates\n    if ([self isKindOfClass:[UITableView class]]) {\n        [self swizzleIfPossible:@selector(endUpdates)];\n    }\n}\n\n- (void)setEmptyDataSetDelegate:(id<DZNEmptyDataSetDelegate>)delegate\n{\n    if (!delegate) {\n        [self dzn_invalidate];\n    }\n    \n    objc_setAssociatedObject(self, kEmptyDataSetDelegate, delegate, OBJC_ASSOCIATION_ASSIGN);\n}\n\n\n#pragma mark - Setters (Private)\n\n- (void)setEmptyDataSetView:(DZNEmptyDataSetView *)view\n{\n    objc_setAssociatedObject(self, kEmptyDataSetView, view, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n\n#pragma mark - Reload APIs (Public)\n\n- (void)reloadEmptyDataSet\n{\n    [self dzn_reloadEmptyDataSet];\n}\n\n\n#pragma mark - Reload APIs (Private)\n\n- (void)dzn_reloadEmptyDataSet\n{\n    if (![self dzn_canDisplay]) {\n        return;\n    }\n    \n    if ([self dzn_shouldDisplay] && [self dzn_itemsCount] == 0)\n    {\n        // Notifies that the empty dataset view will appear\n        [self dzn_willAppear];\n        \n        DZNEmptyDataSetView *view = self.emptyDataSetView;\n        \n        if (!view.superview) {\n            [self addSubview:view];\n\n            // Send the view all the way to the back, in case a header and/or footer is present, as well as for sectionHeaders or any other content\n            [self sendSubviewToBack:view];\n\n            // make sure the y origin of view is 0. adding it to a scrollView may have changed it\n            CGRect frame = view.frame;\n            frame.origin.y = 0;\n            view.frame = frame;\n        }\n        \n        // Removing view resetting the view and its constraints it very important to guarantee a good state\n        [view prepareForReuse];\n        \n        UIView *customView = [self dzn_customView];\n        \n        // If a non-nil custom view is available, let's configure it instead\n        if (customView) {\n            view.customView = customView;\n        }\n        else {\n            // Get the data from the data source\n            NSAttributedString *titleLabelString = [self dzn_titleLabelString];\n            NSAttributedString *detailLabelString = [self dzn_detailLabelString];\n            \n            UIImage *buttonImage = [self dzn_buttonImageForState:UIControlStateNormal];\n            NSAttributedString *buttonTitle = [self dzn_buttonTitleForState:UIControlStateNormal];\n            \n            UIImage *image = [self dzn_image];\n            UIColor *imageTintColor = [self dzn_imageTintColor];\n            UIImageRenderingMode renderingMode = imageTintColor ? UIImageRenderingModeAlwaysTemplate : UIImageRenderingModeAlwaysOriginal;\n            \n            view.verticalSpace = [self dzn_verticalSpace];\n            \n            // Configure Image\n            if (image) {\n                if ([image respondsToSelector:@selector(imageWithRenderingMode:)]) {\n                    view.imageView.image = [image imageWithRenderingMode:renderingMode];\n                    view.imageView.tintColor = imageTintColor;\n                }\n                else {\n                    // iOS 6 fallback: insert code to convert imaged if needed\n                    view.imageView.image = image;\n                }\n            }\n            \n            // Configure title label\n            if (titleLabelString) {\n                view.titleLabel.attributedText = titleLabelString;\n            }\n            \n            // Configure detail label\n            if (detailLabelString) {\n                view.detailLabel.attributedText = detailLabelString;\n            }\n            \n            // Configure button\n            if (buttonImage) {\n                [view.button setImage:buttonImage forState:UIControlStateNormal];\n                [view.button setImage:[self dzn_buttonImageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted];\n            }\n            else if (buttonTitle) {\n                [view.button setAttributedTitle:buttonTitle forState:UIControlStateNormal];\n                [view.button setAttributedTitle:[self dzn_buttonTitleForState:UIControlStateHighlighted] forState:UIControlStateHighlighted];\n                [view.button setBackgroundImage:[self dzn_buttonBackgroundImageForState:UIControlStateNormal] forState:UIControlStateNormal];\n                [view.button setBackgroundImage:[self dzn_buttonBackgroundImageForState:UIControlStateHighlighted] forState:UIControlStateHighlighted];\n            }\n        }\n        \n        // Configure offset\n        view.verticalOffset = [self dzn_verticalOffset];\n        \n        // Configure the empty dataset view\n        view.backgroundColor = [self dzn_dataSetBackgroundColor];\n        view.hidden = NO;\n        view.clipsToBounds = YES;\n        \n        // Configure empty dataset userInteraction permission\n        view.userInteractionEnabled = [self dzn_isTouchAllowed];\n        \n        // Configure empty dataset fade in display\n        view.fadeInOnDisplay = [self dzn_shouldFadeIn];\n        \n        [view setupConstraints];\n        [view layoutIfNeeded];\n        \n        // Configure scroll permission\n        self.scrollEnabled = [self dzn_isScrollAllowed];\n        \n        // Configure image view animation\n        if ([self dzn_isImageViewAnimateAllow])\n        {\n            CAAnimation *animation = [self dzn_imageAnimation];\n            \n            if (animation) {\n                [self.emptyDataSetView.imageView.layer addAnimation:animation forKey:kEmptyImageViewAnimationKey];\n            }\n        }\n        else if ([self.emptyDataSetView.imageView.layer animationForKey:kEmptyImageViewAnimationKey]) {\n            [self.emptyDataSetView.imageView.layer removeAnimationForKey:kEmptyImageViewAnimationKey];\n        }\n        \n        // Notifies that the empty dataset view did appear\n        [self dzn_didAppear];\n    }\n    else if (self.isEmptyDataSetVisible) {\n        [self dzn_invalidate];\n    }\n}\n\n- (void)dzn_invalidate\n{\n    // Notifies that the empty dataset view will disappear\n    [self dzn_willDisappear];\n    \n    if (self.emptyDataSetView) {\n        [self.emptyDataSetView prepareForReuse];\n        [self.emptyDataSetView removeFromSuperview];\n        \n        [self setEmptyDataSetView:nil];\n    }\n    \n    self.scrollEnabled = YES;\n    \n    // Notifies that the empty dataset view did disappear\n    [self dzn_didDisappear];\n}\n\n\n#pragma mark - Method Swizzling\n\nstatic NSMutableDictionary *_impLookupTable;\nstatic NSString *const DZNSwizzleInfoPointerKey = @\"pointer\";\nstatic NSString *const DZNSwizzleInfoOwnerKey = @\"owner\";\nstatic NSString *const DZNSwizzleInfoSelectorKey = @\"selector\";\n\n// Based on Bryce Buchanan's swizzling technique http://blog.newrelic.com/2014/04/16/right-way-to-swizzle/\n// And Juzzin's ideas https://github.com/juzzin/JUSEmptyViewController\n\nvoid dzn_original_implementation(id self, SEL _cmd)\n{\n    // Fetch original implementation from lookup table\n    NSString *key = dzn_implementationKey(self, _cmd);\n    \n    NSDictionary *swizzleInfo = [_impLookupTable objectForKey:key];\n    NSValue *impValue = [swizzleInfo valueForKey:DZNSwizzleInfoPointerKey];\n    \n    IMP impPointer = [impValue pointerValue];\n    \n    // We then inject the additional implementation for reloading the empty dataset\n    // Doing it before calling the original implementation does update the 'isEmptyDataSetVisible' flag on time.\n    [self dzn_reloadEmptyDataSet];\n    \n    // If found, call original implementation\n    if (impPointer) {\n        ((void(*)(id,SEL))impPointer)(self,_cmd);\n    }\n}\n\nNSString *dzn_implementationKey(id target, SEL selector)\n{\n    if (!target || !selector) {\n        return nil;\n    }\n    \n    Class baseClass;\n    if ([target isKindOfClass:[UITableView class]]) baseClass = [UITableView class];\n    else if ([target isKindOfClass:[UICollectionView class]]) baseClass = [UICollectionView class];\n    else if ([target isKindOfClass:[UIScrollView class]]) baseClass = [UIScrollView class];\n    else return nil;\n    \n    NSString *className = NSStringFromClass([baseClass class]);\n    \n    NSString *selectorName = NSStringFromSelector(selector);\n    return [NSString stringWithFormat:@\"%@_%@\",className,selectorName];\n}\n\n- (void)swizzleIfPossible:(SEL)selector\n{\n    // Check if the target responds to selector\n    if (![self respondsToSelector:selector]) {\n        return;\n    }\n    \n    // Create the lookup table\n    if (!_impLookupTable) {\n        _impLookupTable = [[NSMutableDictionary alloc] initWithCapacity:2];\n    }\n    \n    // We make sure that setImplementation is called once per class kind, UITableView or UICollectionView.\n    for (NSDictionary *info in [_impLookupTable allValues]) {\n        Class class = [info objectForKey:DZNSwizzleInfoOwnerKey];\n        NSString *selectorName = [info objectForKey:DZNSwizzleInfoSelectorKey];\n        \n        if ([selectorName isEqualToString:NSStringFromSelector(selector)]) {\n            if ([self isKindOfClass:class]) {\n                return;\n            }\n        }\n    }\n    \n    NSString *key = dzn_implementationKey(self, selector);\n    NSValue *impValue = [[_impLookupTable objectForKey:key] valueForKey:DZNSwizzleInfoPointerKey];\n    \n    // If the implementation for this class already exist, skip!!\n    if (impValue || !key) {\n        return;\n    }\n    \n    // Swizzle by injecting additional implementation\n    Method method = class_getInstanceMethod([self class], selector);\n    IMP dzn_newImplementation = method_setImplementation(method, (IMP)dzn_original_implementation);\n    \n    // Store the new implementation in the lookup table\n    NSDictionary *swizzledInfo = @{DZNSwizzleInfoOwnerKey: [self class],\n                                   DZNSwizzleInfoSelectorKey: NSStringFromSelector(selector),\n                                   DZNSwizzleInfoPointerKey: [NSValue valueWithPointer:dzn_newImplementation]};\n    \n    [_impLookupTable setObject:swizzledInfo forKey:key];\n}\n\n\n#pragma mark - UIGestureRecognizerDelegate Methods\n\n- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer\n{\n    if ([gestureRecognizer.view isEqual:self.emptyDataSetView]) {\n        return [self dzn_isTouchAllowed];\n    }\n    \n    return [super gestureRecognizerShouldBegin:gestureRecognizer];\n}\n\n- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer\n{\n    UIGestureRecognizer *tapGesture = self.emptyDataSetView.tapGesture;\n    \n    if ([gestureRecognizer isEqual:tapGesture] || [otherGestureRecognizer isEqual:tapGesture]) {\n        return YES;\n    }\n    \n    // defer to emptyDataSetDelegate's implementation if available\n    if ( (self.emptyDataSetDelegate != (id)self) && [self.emptyDataSetDelegate respondsToSelector:@selector(gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:)]) {\n        return [(id)self.emptyDataSetDelegate gestureRecognizer:gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer];\n    }\n    \n    return NO;\n}\n\n@end\n\n\n#pragma mark - DZNEmptyDataSetView\n\n@interface DZNEmptyDataSetView ()\n@end\n\n@implementation DZNEmptyDataSetView\n@synthesize contentView = _contentView;\n@synthesize titleLabel = _titleLabel, detailLabel = _detailLabel, imageView = _imageView, button = _button;\n\n#pragma mark - Initialization Methods\n\n- (instancetype)init\n{\n    self =  [super init];\n    if (self) {\n        [self addSubview:self.contentView];\n    }\n    return self;\n}\n\n- (void)didMoveToSuperview\n{\n    self.frame = self.superview.bounds;\n    \n    void(^fadeInBlock)(void) = ^{_contentView.alpha = 1.0;};\n    \n    if (self.fadeInOnDisplay) {\n        [UIView animateWithDuration:0.25\n                         animations:fadeInBlock\n                         completion:NULL];\n    }\n    else {\n        fadeInBlock();\n    }\n}\n\n\n#pragma mark - Getters\n\n- (UIView *)contentView\n{\n    if (!_contentView)\n    {\n        _contentView = [UIView new];\n        _contentView.translatesAutoresizingMaskIntoConstraints = NO;\n        _contentView.backgroundColor = [UIColor clearColor];\n        _contentView.userInteractionEnabled = YES;\n        _contentView.alpha = 0;\n    }\n    return _contentView;\n}\n\n- (UIImageView *)imageView\n{\n    if (!_imageView)\n    {\n        _imageView = [UIImageView new];\n        _imageView.translatesAutoresizingMaskIntoConstraints = NO;\n        _imageView.backgroundColor = [UIColor clearColor];\n        _imageView.contentMode = UIViewContentModeScaleAspectFit;\n        _imageView.userInteractionEnabled = NO;\n        _imageView.accessibilityIdentifier = @\"empty set background image\";\n        \n        [_contentView addSubview:_imageView];\n    }\n    return _imageView;\n}\n\n- (UILabel *)titleLabel\n{\n    if (!_titleLabel)\n    {\n        _titleLabel = [UILabel new];\n        _titleLabel.translatesAutoresizingMaskIntoConstraints = NO;\n        _titleLabel.backgroundColor = [UIColor clearColor];\n        \n        _titleLabel.font = [UIFont systemFontOfSize:27.0];\n        _titleLabel.textColor = [UIColor colorWithWhite:0.6 alpha:1.0];\n        _titleLabel.textAlignment = NSTextAlignmentCenter;\n        _titleLabel.lineBreakMode = NSLineBreakByWordWrapping;\n        _titleLabel.numberOfLines = 0;\n        _titleLabel.accessibilityIdentifier = @\"empty set title\";\n        \n        [_contentView addSubview:_titleLabel];\n    }\n    return _titleLabel;\n}\n\n- (UILabel *)detailLabel\n{\n    if (!_detailLabel)\n    {\n        _detailLabel = [UILabel new];\n        _detailLabel.translatesAutoresizingMaskIntoConstraints = NO;\n        _detailLabel.backgroundColor = [UIColor clearColor];\n        \n        _detailLabel.font = [UIFont systemFontOfSize:17.0];\n        _detailLabel.textColor = [UIColor colorWithWhite:0.6 alpha:1.0];\n        _detailLabel.textAlignment = NSTextAlignmentCenter;\n        _detailLabel.lineBreakMode = NSLineBreakByWordWrapping;\n        _detailLabel.numberOfLines = 0;\n        _detailLabel.accessibilityIdentifier = @\"empty set detail label\";\n        \n        [_contentView addSubview:_detailLabel];\n    }\n    return _detailLabel;\n}\n\n- (UIButton *)button\n{\n    if (!_button)\n    {\n        _button = [UIButton buttonWithType:UIButtonTypeCustom];\n        _button.translatesAutoresizingMaskIntoConstraints = NO;\n        _button.backgroundColor = [UIColor clearColor];\n        _button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;\n        _button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;\n        _button.accessibilityIdentifier = @\"empty set button\";\n        \n        [_button addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];\n        \n        [_contentView addSubview:_button];\n    }\n    return _button;\n}\n\n- (BOOL)canShowImage\n{\n    return (_imageView.image && _imageView.superview);\n}\n\n- (BOOL)canShowTitle\n{\n    return (_titleLabel.attributedText.string.length > 0 && _titleLabel.superview);\n}\n\n- (BOOL)canShowDetail\n{\n    return (_detailLabel.attributedText.string.length > 0 && _detailLabel.superview);\n}\n\n- (BOOL)canShowButton\n{\n    if ([_button attributedTitleForState:UIControlStateNormal].string.length > 0 || [_button imageForState:UIControlStateNormal]) {\n        return (_button.superview != nil) ? YES : NO;\n    }\n    return NO;\n}\n\n\n#pragma mark - Setters\n\n- (void)setCustomView:(UIView *)view\n{\n    if (!view) {\n        return;\n    }\n    \n    if (_customView) {\n        [_customView removeFromSuperview];\n        _customView = nil;\n    }\n    \n    _customView = view;\n    _customView.translatesAutoresizingMaskIntoConstraints = NO;\n    [self.contentView addSubview:_customView];\n}\n\n\n#pragma mark - Action Methods\n\n- (void)didTapButton:(id)sender\n{\n    SEL selector = NSSelectorFromString(@\"dzn_didTapDataButton:\");\n    \n    if ([self.superview respondsToSelector:selector]) {\n        [self.superview performSelector:selector withObject:sender afterDelay:0.0f];\n    }\n}\n\n- (void)removeAllConstraints\n{\n    [self removeConstraints:self.constraints];\n    [_contentView removeConstraints:_contentView.constraints];\n}\n\n- (void)prepareForReuse\n{\n    [self.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];\n    \n    _titleLabel = nil;\n    _detailLabel = nil;\n    _imageView = nil;\n    _button = nil;\n    _customView = nil;\n    \n    [self removeAllConstraints];\n}\n\n\n#pragma mark - Auto-Layout Configuration\n\n- (void)setupConstraints\n{\n    // First, configure the content view constaints\n    // The content view must alway be centered to its superview\n    NSLayoutConstraint *centerXConstraint = [self equallyRelatedConstraintWithView:self.contentView attribute:NSLayoutAttributeCenterX];\n    NSLayoutConstraint *centerYConstraint = [self equallyRelatedConstraintWithView:self.contentView attribute:NSLayoutAttributeCenterY];\n    \n    [self addConstraint:centerXConstraint];\n    [self addConstraint:centerYConstraint];\n    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"H:|[contentView]|\" options:0 metrics:nil views:@{@\"contentView\": self.contentView}]];\n    \n    // When a custom offset is available, we adjust the vertical constraints' constants\n    if (self.verticalOffset != 0 && self.constraints.count > 0) {\n        centerYConstraint.constant = self.verticalOffset;\n    }\n    \n    // If applicable, set the custom view's constraints\n    if (_customView) {\n        [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"V:|[contentView]|\" options:0 metrics:nil views:@{@\"contentView\": self.contentView}]];\n        \n        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"H:|[customView]|\" options:0 metrics:nil views:@{@\"customView\":_customView}]];\n        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"V:|[customView]|\" options:0 metrics:nil views:@{@\"customView\":_customView}]];\n    }\n    else {\n        CGFloat width = CGRectGetWidth(self.frame) ? : CGRectGetWidth([UIScreen mainScreen].bounds);\n        CGFloat padding = roundf(width/16.0);\n        CGFloat verticalSpace = self.verticalSpace ? : 11.0; // Default is 11 pts\n        \n        NSMutableArray *subviewStrings = [NSMutableArray array];\n        NSMutableDictionary *views = [NSMutableDictionary dictionary];\n        NSDictionary *metrics = @{@\"padding\": @(padding)};\n        \n        // Assign the image view's horizontal constraints\n        if (_imageView.superview) {\n            \n            [subviewStrings addObject:@\"imageView\"];\n            views[[subviewStrings lastObject]] = _imageView;\n            \n            [self.contentView addConstraint:[self.contentView equallyRelatedConstraintWithView:_imageView attribute:NSLayoutAttributeCenterX]];\n        }\n        \n        // Assign the title label's horizontal constraints\n        if ([self canShowTitle]) {\n            \n            [subviewStrings addObject:@\"titleLabel\"];\n            views[[subviewStrings lastObject]] = _titleLabel;\n            \n            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"H:|-(padding@750)-[titleLabel(>=0)]-(padding@750)-|\"\n                                                                                     options:0 metrics:metrics views:views]];\n        }\n        // or removes from its superview\n        else {\n            [_titleLabel removeFromSuperview];\n            _titleLabel = nil;\n        }\n        \n        // Assign the detail label's horizontal constraints\n        if ([self canShowDetail]) {\n            \n            [subviewStrings addObject:@\"detailLabel\"];\n            views[[subviewStrings lastObject]] = _detailLabel;\n            \n            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"H:|-(padding@750)-[detailLabel(>=0)]-(padding@750)-|\"\n                                                                                     options:0 metrics:metrics views:views]];\n        }\n        // or removes from its superview\n        else {\n            [_detailLabel removeFromSuperview];\n            _detailLabel = nil;\n        }\n        \n        // Assign the button's horizontal constraints\n        if ([self canShowButton]) {\n            \n            [subviewStrings addObject:@\"button\"];\n            views[[subviewStrings lastObject]] = _button;\n            \n            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@\"H:|-(padding@750)-[button(>=0)]-(padding@750)-|\"\n                                                                                     options:0 metrics:metrics views:views]];\n        }\n        // or removes from its superview\n        else {\n            [_button removeFromSuperview];\n            _button = nil;\n        }\n        \n        \n        NSMutableString *verticalFormat = [NSMutableString new];\n        \n        // Build a dynamic string format for the vertical constraints, adding a margin between each element. Default is 11 pts.\n        for (int i = 0; i < subviewStrings.count; i++) {\n            \n            NSString *string = subviewStrings[i];\n            [verticalFormat appendFormat:@\"[%@]\", string];\n            \n            if (i < subviewStrings.count-1) {\n                [verticalFormat appendFormat:@\"-(%.f@750)-\", verticalSpace];\n            }\n        }\n        \n        // Assign the vertical constraints to the content view\n        if (verticalFormat.length > 0) {\n            [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:[NSString stringWithFormat:@\"V:|%@|\", verticalFormat]\n                                                                                     options:0 metrics:metrics views:views]];\n        }\n    }\n}\n\n- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event\n{\n    UIView *hitView = [super hitTest:point withEvent:event];\n    \n    // Return any UIControl instance such as buttons, segmented controls, switches, etc.\n    if ([hitView isKindOfClass:[UIControl class]]) {\n        return hitView;\n    }\n    \n    // Return either the contentView or customView\n    if ([hitView isEqual:_contentView] || [hitView isEqual:_customView]) {\n        return hitView;\n    }\n    \n    return nil;\n}\n\n@end\n\n\n#pragma mark - UIView+DZNConstraintBasedLayoutExtensions\n\n@implementation UIView (DZNConstraintBasedLayoutExtensions)\n\n- (NSLayoutConstraint *)equallyRelatedConstraintWithView:(UIView *)view attribute:(NSLayoutAttribute)attribute\n{\n    return [NSLayoutConstraint constraintWithItem:view\n                                        attribute:attribute\n                                        relatedBy:NSLayoutRelationEqual\n                                           toItem:self\n                                        attribute:attribute\n                                       multiplier:1.0\n                                         constant:0.0];\n}\n\n@end\n"
  },
  {
    "path": "Pods/GZIP/GZIP/GZIP.h",
    "content": "@import Foundation;\n\n//! Project version number for GZIP.\nFOUNDATION_EXPORT double GZIPVersionNumber;\n\n//! Project version string for GZIP.\nFOUNDATION_EXPORT const unsigned char GZIPVersionString[];\n\n#import <GZIP/NSData+GZIP.h>\n"
  },
  {
    "path": "Pods/GZIP/GZIP/NSData+GZIP.h",
    "content": "//\n//  GZIP.h\n//\n//  Version 1.2.1\n//\n//  Created by Nick Lockwood on 03/06/2012.\n//  Copyright (C) 2012 Charcoal Design\n//\n//  Distributed under the permissive zlib License\n//  Get the latest version from here:\n//\n//  https://github.com/nicklockwood/GZIP\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//  claim that you wrote the original software. If you use this software\n//  in a product, an acknowledgment in the product documentation would be\n//  appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//  misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n\n#import <Foundation/Foundation.h>\n\n\n@interface NSData (GZIP)\n\n- (nullable NSData *)gzippedDataWithCompressionLevel:(float)level;\n- (nullable NSData *)gzippedData;\n- (nullable NSData *)gunzippedData;\n- (BOOL)isGzippedData;\n\n@end\n"
  },
  {
    "path": "Pods/GZIP/GZIP/NSData+GZIP.m",
    "content": "//\n//  GZIP.m\n//\n//  Version 1.2.1\n//\n//  Created by Nick Lockwood on 03/06/2012.\n//  Copyright (C) 2012 Charcoal Design\n//\n//  Distributed under the permissive zlib License\n//  Get the latest version from here:\n//\n//  https://github.com/nicklockwood/GZIP\n//\n//  This software is provided 'as-is', without any express or implied\n//  warranty.  In no event will the authors be held liable for any damages\n//  arising from the use of this software.\n//\n//  Permission is granted to anyone to use this software for any purpose,\n//  including commercial applications, and to alter it and redistribute it\n//  freely, subject to the following restrictions:\n//\n//  1. The origin of this software must not be misrepresented; you must not\n//  claim that you wrote the original software. If you use this software\n//  in a product, an acknowledgment in the product documentation would be\n//  appreciated but is not required.\n//\n//  2. Altered source versions must be plainly marked as such, and must not be\n//  misrepresented as being the original software.\n//\n//  3. This notice may not be removed or altered from any source distribution.\n//\n\n\n#import \"NSData+GZIP.h\"\n#import <zlib.h>\n\n\n#pragma clang diagnostic ignored \"-Wcast-qual\"\n\n\n@implementation NSData (GZIP)\n\n- (NSData *)gzippedDataWithCompressionLevel:(float)level\n{\n    if (self.length == 0 || [self isGzippedData])\n    {\n        return self;\n    }\n\n    z_stream stream;\n    stream.zalloc = Z_NULL;\n    stream.zfree = Z_NULL;\n    stream.opaque = Z_NULL;\n    stream.avail_in = (uint)self.length;\n    stream.next_in = (Bytef *)(void *)self.bytes;\n    stream.total_out = 0;\n    stream.avail_out = 0;\n\n    static const NSUInteger ChunkSize = 16384;\n\n    NSMutableData *output = nil;\n    int compression = (level < 0.0f)? Z_DEFAULT_COMPRESSION: (int)(roundf(level * 9));\n    if (deflateInit2(&stream, compression, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK)\n    {\n        output = [NSMutableData dataWithLength:ChunkSize];\n        while (stream.avail_out == 0)\n        {\n            if (stream.total_out >= output.length)\n            {\n                output.length += ChunkSize;\n            }\n            stream.next_out = (uint8_t *)output.mutableBytes + stream.total_out;\n            stream.avail_out = (uInt)(output.length - stream.total_out);\n            deflate(&stream, Z_FINISH);\n        }\n        deflateEnd(&stream);\n        output.length = stream.total_out;\n    }\n\n    return output;\n}\n\n- (NSData *)gzippedData\n{\n    return [self gzippedDataWithCompressionLevel:-1.0f];\n}\n\n- (NSData *)gunzippedData\n{\n    if (self.length == 0 || ![self isGzippedData])\n    {\n        return self;\n    }\n\n    z_stream stream;\n    stream.zalloc = Z_NULL;\n    stream.zfree = Z_NULL;\n    stream.avail_in = (uint)self.length;\n    stream.next_in = (Bytef *)self.bytes;\n    stream.total_out = 0;\n    stream.avail_out = 0;\n\n    NSMutableData *output = nil;\n    if (inflateInit2(&stream, 47) == Z_OK)\n    {\n        int status = Z_OK;\n        output = [NSMutableData dataWithCapacity:self.length * 2];\n        while (status == Z_OK)\n        {\n            if (stream.total_out >= output.length)\n            {\n                output.length += self.length / 2;\n            }\n            stream.next_out = (uint8_t *)output.mutableBytes + stream.total_out;\n            stream.avail_out = (uInt)(output.length - stream.total_out);\n            status = inflate (&stream, Z_SYNC_FLUSH);\n        }\n        if (inflateEnd(&stream) == Z_OK)\n        {\n            if (status == Z_STREAM_END)\n            {\n                output.length = stream.total_out;\n            }\n        }\n    }\n\n    return output;\n}\n\n- (BOOL)isGzippedData\n{\n    const UInt8 *bytes = (const UInt8 *)self.bytes;\n    return (self.length >= 2 && bytes[0] == 0x1f && bytes[1] == 0x8b);\n}\n\n@end\n"
  },
  {
    "path": "Pods/GZIP/LICENCE.md",
    "content": "GZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution."
  },
  {
    "path": "Pods/GZIP/README.md",
    "content": "[![Build Status](https://travis-ci.org/nicklockwood/GZIP.svg)](https://travis-ci.org/nicklockwood/GZIP)\n\n\nPurpose\n--------------\n\nGZIP is category on NSData that provides simple gzip compression and decompression functionality.\n\n\nSupported OS & SDK Versions\n-----------------------------\n\n* Supported build target - iOS 10.3 / Mac OS 10.12 (Xcode 8.3)\n* Earliest supported deployment target - iOS 8.0 / Mac OS 10.9\n* Earliest compatible deployment target - iOS 8.0 / Mac OS 10.6\n\nNOTE: 'Supported' means that the library has been tested with this version. 'Compatible' means that the library should work on this iOS version (i.e. it doesn't rely on any unavailable SDK features) but is no longer being tested for compatibility and may require tweaking or bug fixes to run correctly.\n\n\nARC Compatibility\n------------------\n\nThe GZIP category will work correctly in either ARC or non-ARC projects without modification.\n\n\nThread Safety\n--------------\n\nAll the GZIP methods should be safe to call from multiple threads concurrently.\n\n\nInstallation\n--------------\n\nThe simplest way to install GZIP is to use CocoaPods, by adding the following to your Podfile:\n\n\tpod 'GZIP', '~> 1.2'\n\nAlternatively you can use Carthage, or if you prefer to install manually, drag the GZIP.xcodeproj into your project or workspace and include GZIP.framework under the linked libraries in your target.\n\n\nNSData Extensions\n----------------------\n\n    - (NSData *)gzippedDataWithCompressionLevel:(float)level;\n\nThis method will apply the gzip deflate algorithm and return the compressed data. The compression level is a floating point value between 0.0 and 1.0, with 0.0 meaning no compression and 1.0 meaning maximum compression.  A value of 0.1 will provide the fastest possible compression. If you supply a negative value, this will apply the default compression level, which is equivalent to a value of around 0.7.\n\n    - (NSData *)gzippedData;\n    \nThis method is equivalent to calling `gzippedDataWithCompressionLevel:` with the default compression level.\n    \n    - (NSData *)gunzippedData;\n    \nThis method will unzip data that was compressed using the deflate algorithm and return the result.\n\n    - (BOOL)isGzippedData;\n    \nThis method will return YES if the data is gzip-encoded.\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITAuthenticator.h",
    "content": "/*\n * Author: Stephan Diederich, Andreas Linde\n *\n * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"BITHockeyBaseManager.h\"\n\n/**\n * Identification Types\n */\ntypedef NS_ENUM(NSUInteger, BITAuthenticatorIdentificationType) {\n  /**\n   * Assigns this app an anonymous user id.\n   * <br/><br/>\n   * The user will not be asked anything and an anonymous ID will be generated.\n   * This helps identifying this installation being unique but HockeyApp won't be able\n   * to identify who actually is running this installation and on which device\n   * the app is installed.\n   */\n  BITAuthenticatorIdentificationTypeAnonymous,\n  /**\n   * Ask for the HockeyApp account email\n   * <br/><br/>\n   * This will present a user interface requesting the user to provide their\n   * HockeyApp user email address.\n   * <br/><br/>\n   * The provided email address has to match an email address of a registered\n   * HockeyApp user who is a member or tester of the app\n   */\n  BITAuthenticatorIdentificationTypeHockeyAppEmail,\n  /**\n   * Ask for the HockeyApp account by email and password\n   * <br/><br/>\n   * This will present a user interface requesting the user to provide their\n   * HockeyApp user credentials.\n   * <br/><br/>\n   * The provided user account has to match a registered HockeyApp user who is\n   * a member or tester of the app\n   */\n  BITAuthenticatorIdentificationTypeHockeyAppUser,\n  /**\n   * Identifies the current device\n   * <br/><br/>\n   * This will open the HockeyApp web page on the device in Safari and request the user\n   * to submit the device's unique identifier to the app. If the web page session is not aware\n   * of the current devices UDID, it will request the user to install the HockeyApp web clip\n   * which will provide the UDID to users session in the browser.\n   * <br/><br/>\n   * This requires the app to register an URL scheme. See the linked property and methods\n   * for further documentation on this.\n   */\n  BITAuthenticatorIdentificationTypeDevice,\n  /**\n   * Ask for the HockeyApp account email.\n   * <br/><br/>\n   * This will present a user interface requesting the user to start a Safari based\n   * flow to login to HockeyApp (if not already logged in) and to share the hockeyapp\n   * account's email.\n   * <br/><br/>\n   * If restrictApplicationUsage is enabled, the provided user account has to match a\n   * registered HockeyApp user who is a member or tester of the app.\n   * For identification purpose any HockeyApp user is allowed.\n   */\n  BITAuthenticatorIdentificationTypeWebAuth,\n};\n\n/**\n * Restriction enforcement styles\n *\n * Specifies how often the Authenticator checks if the user is allowed to use\n * this app.\n */\ntypedef NS_ENUM(NSUInteger, BITAuthenticatorAppRestrictionEnforcementFrequency) {\n  /**\n   * Checks if the user is allowed to use the app at the first time a version is started\n   */\n  BITAuthenticatorAppRestrictionEnforcementOnFirstLaunch,\n  /**\n   * Checks if the user is allowed to use the app every time the app becomes active\n   */\n  BITAuthenticatorAppRestrictionEnforcementOnAppActive,\n};\n\n@protocol BITAuthenticatorDelegate;\n\n\n/**\n * Identify and authenticate users of Ad-Hoc or Enterprise builds\n *\n * `BITAuthenticator` serves 2 purposes:\n *\n * 1. Identifying who is running your Ad-Hoc or Enterprise builds\n *    `BITAuthenticator` provides an identifier for the rest of the HockeySDK\n *    to work with, e.g. in-app update checks and crash reports.\n *\n * 2. Optional regular checking if an identified user is still allowed\n *    to run this application. The `BITAuthenticator` can be used to make\n *    sure only users who are testers of your app are allowed to run it.\n *\n * This module automatically disables itself when running in an App Store build by default!\n *\n * @warning It is mandatory to call `authenticateInstallation` somewhen after calling\n * `[[BITHockeyManager sharedHockeyManager] startManager]` or fully customize the identification\n * and validation workflow yourself.\n * If your app shows a modal view on startup, make sure to call `authenticateInstallation`\n * either once your modal view is fully presented (e.g. its `viewDidLoad:` method is processed)\n * or once your modal view is dismissed.\n */\n@interface BITAuthenticator : BITHockeyBaseManager\n\n#pragma mark - Configuration\n\n\n///-----------------------------------------------------------------------------\n/// @name Configuration\n///-----------------------------------------------------------------------------\n\n\n/**\n * Defines the identification mechanism to be used\n *\n * _Default_: `BITAuthenticatorIdentificationTypeAnonymous`\n *\n * @see BITAuthenticatorIdentificationType\n */\n@property (nonatomic, assign) BITAuthenticatorIdentificationType identificationType;\n\n\n/**\n * Enables or disables checking if the user is allowed to run this app\n *\n * If disabled, the Authenticator never validates, besides initial identification,\n * if the user is allowed to run this application.\n *\n * If enabled, the Authenticator checks depending on `restrictionEnforcementFrequency`\n * if the user is allowed to use this application.\n *\n * Enabling this property and setting `identificationType` to `BITAuthenticatorIdentificationTypeHockeyAppEmail`,\n * `BITAuthenticatorIdentificationTypeHockeyAppUser` or `BITAuthenticatorIdentificationTypeWebAuth` also allows\n * to remove access for users by removing them from the app's users list on HockeyApp.\n *\n *  _Default_: `NO`\n *\n * @warning if `identificationType` is set to `BITAuthenticatorIdentificationTypeAnonymous`,\n *          this property has no effect.\n *\n * @see BITAuthenticatorIdentificationType\n * @see restrictionEnforcementFrequency\n */\n@property (nonatomic, assign) BOOL restrictApplicationUsage;\n\n/**\n * Defines how often the BITAuthenticator checks if the user is allowed\n * to run this application\n *\n * This requires `restrictApplicationUsage` to be enabled.\n *\n * _Default_: `BITAuthenticatorAppRestrictionEnforcementOnFirstLaunch`\n *\n * @see BITAuthenticatorAppRestrictionEnforcementFrequency\n * @see restrictApplicationUsage\n */\n@property (nonatomic, assign) BITAuthenticatorAppRestrictionEnforcementFrequency restrictionEnforcementFrequency;\n\n/**\n * The authentication secret from HockeyApp. To find the right secret, \n * click on your app on the HockeyApp dashboard, then on Show next to \n * \"Secret:\".\n *\n * This is only needed if `identificationType` is set to `BITAuthenticatorIdentificationTypeHockeyAppEmail`\n *\n * @see identificationType\n */\n@property (nonatomic, copy) NSString *authenticationSecret;\n\n\n#pragma mark - Device based identification\n\n///-----------------------------------------------------------------------------\n/// @name Device based identification\n///-----------------------------------------------------------------------------\n\n\n/**\n * The baseURL of the webpage the user is redirected to if `identificationType` is\n * set to `BITAuthenticatorIdentificationTypeDevice`; defaults to https://rink.hockeyapp.net.\n *\n * @see identificationType\n */\n@property (nonatomic, strong) NSURL *webpageURL;\n\n/**\n * URL to query the device's id via external webpage\n * Built with the baseURL set in `webpageURL`.\n */\n- (NSURL*) deviceAuthenticationURL;\n\n/**\n * The url-scheme used to identify via `BITAuthenticatorIdentificationTypeDevice`\n *\n * Please make sure that the URL scheme is unique and not shared with other apps.\n *\n * If set to nil, the default scheme is used which is `ha<APP_ID>`.\n *\n * @see identificationType\n * @see handleOpenURL:sourceApplication:annotation:\n */\n@property (nonatomic, copy) NSString *urlScheme;\n\n/**\n Should be used by the app-delegate to forward handle application:openURL:sourceApplication:annotation: calls.\n \n This is required if `identificationType` is set to `BITAuthenticatorIdentificationTypeDevice`.\n Your app needs to implement the default `ha<APP_ID>` URL scheme or register its own scheme\n via `urlScheme`.\n BITAuthenticator checks if the given URL is actually meant to be parsed by it and will\n return NO if it doesn't think so. It does this by checking the 'host'-part of the URL to be 'authorize', as well\n as checking the protocol part.\n Please make sure that if you're using a custom URL scheme, it does _not_ conflict with BITAuthenticator's.\n If BITAuthenticator thinks the URL was meant to be an authorization URL, but could not find a valid token, it will\n reset the stored identification token and state.\n \n Sample usage (in AppDelegate):\n \n    - (BOOL)application:(UIApplication *)application\n                openURL:(NSURL *)url\n      sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {\n      if ([[BITHockeyManager sharedHockeyManager].authenticator handleOpenURL:url\n                                                            sourceApplication:sourceApplication\n                                                                   annotation:annotation]) {\n        return YES;\n      } else {\n        //do your own URL handling, return appropriate value\n      }\n      return NO;\n    }\n \n @param url Param `url` that was passed to the app\n @param sourceApplication Param `sourceApplication` that was passed to the app\n @param annotation Param `annotation` that was passed to the app\n \n @return YES if the URL request was handled, NO if the URL could not be handled/identified.\n \n @see identificationType\n @see urlScheme\n */\n- (BOOL) handleOpenURL:(NSURL *) url\n     sourceApplication:(NSString *) sourceApplication\n            annotation:(id) annotation;\n\n#pragma mark - Authentication\n\n///-----------------------------------------------------------------------------\n/// @name Authentication\n///-----------------------------------------------------------------------------\n\n/**\n * Invoked automatic identification and validation\n *\n * If the `BITAuthenticator` is in automatic mode this will initiate identifying\n * the current user according to the type specified in `identificationType` and\n * validate if the identified user is allowed to run this application.\n *\n * If the user is not yet identified it will present a modal view asking the user to\n * provide the required information.\n *\n * If your app provides it's own startup modal screen, e.g. a guide or a login, then\n * you might either call this method once that UI is fully presented or once\n * the user e.g. did actually login already.\n *\n * @warning You need to call this method in your code even if automatic mode is enabled!\n *\n * @see identificationType\n */\n- (void) authenticateInstallation;\n\n/**\n * Identifies the user according to the type specified in `identificationType`.\n *\n * If the `BITAuthenticator` is in manual mode, it's your responsibility to call\n * this method. Depending on the `identificationType`, this method\n * might present a viewController to let the user enter his/her credentials.\n *\n * If the Authenticator is in auto-mode, this is called by the authenticator itself\n * once needed.\n *\n * @see identificationType\n * @see authenticateInstallation\n * @see validateWithCompletion:\n *\n * @param completion Block being executed once identification completed. Be sure to properly dispatch code to the main queue if necessary.\n */\n- (void) identifyWithCompletion:(void(^)(BOOL identified, NSError *error)) completion;\n\n/**\n * Returns YES if this app is identified according to the setting in `identificationType`.\n *\n * Since the identification process is done asynchronously (contacting the server),\n * you need to observe the value change via KVO.\n *\n * @see identificationType\n */\n@property (nonatomic, assign, readonly, getter = isIdentified) BOOL identified;\n\n/**\n * Validates if the identified user is allowed to run this application. This checks\n * with the HockeyApp backend and calls the completion-block once completed.\n *\n * If the `BITAuthenticator` is in manual mode, it's your responsibility to call\n * this method. If the application is not yet identified, validation is not possible\n * and the completion-block is called with an error set.\n *\n * If the `BITAuthenticator` is in auto-mode, this is called by the authenticator itself\n * once needed.\n *\n * @see identificationType\n * @see authenticateInstallation\n * @see identifyWithCompletion:\n *\n * @param completion Block being executed once validation completed. Be sure to properly dispatch code to the main queue if necessary.\n */\n- (void) validateWithCompletion:(void(^)(BOOL validated, NSError *error)) completion;\n\n/**\n * Indicates if this installation is validated.\n */\n@property (nonatomic, assign, readonly, getter = isValidated) BOOL validated;\n\n/**\n * Removes all previously stored authentication tokens, UDIDs, etc.\n */\n- (void) cleanupInternalStorage;\n\n/**\n * Returns different values depending on `identificationType`. This can be used \n * by the application to identify the user.\n *\n * @see identificationType\n */\n- (NSString*) publicInstallationIdentifier;\n@end\n\n#pragma mark - Protocol\n\n/**\n * `BITAuthenticator` protocol\n */\n@protocol BITAuthenticatorDelegate <NSObject>\n\n@optional\n/**\n * If the authentication (or validation) needs to identify the user,\n * this delegate method is called with the viewController that we'll present.\n *\n * @param authenticator `BITAuthenticator` object\n * @param viewController `UIViewController` used to identify the user\n *\n */\n- (void) authenticator:(BITAuthenticator *)authenticator willShowAuthenticationController:(UIViewController*) viewController;\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITCrashAttachment.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import \"BITHockeyAttachment.h\"\n\n/**\n Deprecated: Provides support to add binary attachments to crash reports\n \n This class is not needed any longer and exists for compatibility purposes with\n HockeySDK-iOS 3.5.5.\n \n It is a subclass of `BITHockeyAttachment` which only provides an initializer\n that is compatible with the one of HockeySDK-iOS 3.5.5.\n \n This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`\n \n @see BITHockeyAttachment\n */\n@interface BITCrashAttachment : BITHockeyAttachment\n\n/**\n Create an BITCrashAttachment instance with a given filename and NSData object\n \n @param filename            The filename the attachment should get\n @param crashAttachmentData The attachment data as NSData\n @param contentType         The content type of your data as MIME type\n \n @return An instance of BITCrashAttachment\n */\n- (instancetype)initWithFilename:(NSString *)filename\n             crashAttachmentData:(NSData *)crashAttachmentData\n                     contentType:(NSString *)contentType;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITCrashDetails.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n *  Provides details about the crash that occurred in the previous app session\n */\n@interface BITCrashDetails : NSObject\n\n/**\n *  UUID for the crash report\n */\n@property (nonatomic, readonly, copy) NSString *incidentIdentifier;\n\n/**\n *  UUID for the app installation on the device\n */\n@property (nonatomic, readonly, copy) NSString *reporterKey;\n\n/**\n *  Signal that caused the crash\n */\n@property (nonatomic, readonly, copy) NSString *signal;\n\n/**\n *  Exception name that triggered the crash, nil if the crash was not caused by an exception\n */\n@property (nonatomic, readonly, copy) NSString *exceptionName;\n\n/**\n *  Exception reason, nil if the crash was not caused by an exception\n */\n@property (nonatomic, readonly, copy) NSString *exceptionReason;\n\n/**\n *  Date and time the app started, nil if unknown\n */\n@property (nonatomic, readonly, strong) NSDate *appStartTime;\n\n/**\n *  Date and time the crash occurred, nil if unknown\n */\n@property (nonatomic, readonly, strong) NSDate *crashTime;\n\n/**\n *  Operation System version string the app was running on when it crashed.\n */\n@property (nonatomic, readonly, copy) NSString *osVersion;\n\n/**\n *  Operation System build string the app was running on when it crashed\n *\n *  This may be unavailable.\n */\n@property (nonatomic, readonly, copy) NSString *osBuild;\n\n/**\n *  CFBundleShortVersionString value of the app that crashed\n *\n *  Can be `nil` if the crash was captured with an older version of the SDK\n *  or if the app doesn't set the value.\n */\n@property (nonatomic, readonly, copy) NSString *appVersion;\n\n/**\n *  CFBundleVersion value of the app that crashed\n */\n@property (nonatomic, readonly, copy) NSString *appBuild;\n\n/**\n *  Identifier of the app process that crashed\n */\n@property (nonatomic, readonly, assign) NSUInteger appProcessIdentifier;\n\n/**\n Indicates if the app was killed while being in foreground from the iOS\n \n If `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` is enabled, use this on startup\n to check if the app starts the first time after it was killed by iOS in the previous session.\n \n This can happen if it consumed too much memory or the watchdog killed the app because it\n took too long to startup or blocks the main thread for too long, or other reasons. See Apple\n documentation: https://developer.apple.com/library/ios/qa/qa1693/_index.html\n \n See `[BITCrashManager enableAppNotTerminatingCleanlyDetection]` for more details about which kind of kills can be detected.\n \n @warning This property only has a correct value, once `[BITHockeyManager startManager]` was\n invoked! In addition, it is automatically disabled while a debugger session is active!\n \n @see `[BITCrashManager enableAppNotTerminatingCleanlyDetection]`\n @see `[BITCrashManager didReceiveMemoryWarningInLastSession]`\n \n @return YES if the details represent an app kill instead of a crash\n */\n- (BOOL)isAppKill;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITCrashManager.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *         Kent Sutherland\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * Copyright (c) 2011 Andreas Linde & Kent Sutherland.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"BITHockeyBaseManager.h\"\n\n@class BITCrashDetails;\n@class BITCrashMetaData;\n\n\n/**\n * Custom block that handles the alert that prompts the user whether they want to send crash reports\n */\ntypedef void(^BITCustomAlertViewHandler)(void);\n\n\n/**\n * Crash Manager status\n */\ntypedef NS_ENUM(NSUInteger, BITCrashManagerStatus) {\n  /**\n   *\tCrash reporting is disabled\n   */\n  BITCrashManagerStatusDisabled = 0,\n  /**\n   *\tUser is asked each time before sending\n   */\n  BITCrashManagerStatusAlwaysAsk = 1,\n  /**\n   *\tEach crash report is send automatically\n   */\n  BITCrashManagerStatusAutoSend = 2\n};\n\n\n/**\n * Prototype of a callback function used to execute additional user code. Called upon completion of crash\n * handling, after the crash report has been written to disk.\n *\n * @param context The API client's supplied context value.\n *\n * @see `BITCrashManagerCallbacks`\n * @see `[BITCrashManager setCrashCallbacks:]`\n */\ntypedef void (*BITCrashManagerPostCrashSignalCallback)(void *context);\n\n/**\n * This structure contains callbacks supported by `BITCrashManager` to allow the host application to perform\n * additional tasks prior to program termination after a crash has occurred.\n *\n * @see `BITCrashManagerPostCrashSignalCallback`\n * @see `[BITCrashManager setCrashCallbacks:]`\n */\ntypedef struct BITCrashManagerCallbacks {\n  /** An arbitrary user-supplied context value. This value may be NULL. */\n  void *context;\n  \n  /**\n   * The callback used to report caught signal information.\n   */\n  BITCrashManagerPostCrashSignalCallback handleSignal;\n} BITCrashManagerCallbacks;\n\n\n/**\n * Crash Manager alert user input\n */\ntypedef NS_ENUM(NSUInteger, BITCrashManagerUserInput) {\n  /**\n   *  User chose not to send the crash report\n   */\n  BITCrashManagerUserInputDontSend = 0,\n  /**\n   *  User wants the crash report to be sent\n   */\n  BITCrashManagerUserInputSend = 1,\n  /**\n   *  User chose to always send crash reports\n   */\n  BITCrashManagerUserInputAlwaysSend = 2\n  \n};\n\n\n@protocol BITCrashManagerDelegate;\n\n/**\n The crash reporting module.\n \n This is the HockeySDK module for handling crash reports, including when distributed via the App Store.\n As a foundation it is using the open source, reliable and async-safe crash reporting framework\n [PLCrashReporter](https://code.google.com/p/plcrashreporter/).\n \n This module works as a wrapper around the underlying crash reporting framework and provides functionality to\n detect new crashes, queues them if networking is not available, present a user interface to approve sending\n the reports to the HockeyApp servers and more.\n \n It also provides options to add additional meta information to each crash report, like `userName`, `userEmail`\n via `BITHockeyManagerDelegate` protocol, and additional textual log information via `BITCrashManagerDelegate`\n protocol and a way to detect startup crashes so you can adjust your startup process to get these crash reports\n too and delay your app initialization.\n \n Crashes are send the next time the app starts. If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`,\n crashes will be send without any user interaction, otherwise an alert will appear allowing the users to decide\n whether they want to send the report or not. This module is not sending the reports right when the crash happens\n deliberately, because if is not safe to implement such a mechanism while being async-safe (any Objective-C code\n is _NOT_ async-safe!) and not causing more danger like a deadlock of the device, than helping. We found that users\n do start the app again because most don't know what happened, and you will get by far most of the reports.\n \n Sending the reports on startup is done asynchronously (non-blocking). This is the only safe way to ensure\n that the app won't be possibly killed by the iOS watchdog process, because startup could take too long\n and the app could not react to any user input when network conditions are bad or connectivity might be\n very slow.\n \n It is possible to check upon startup if the app crashed before using `didCrashInLastSession` and also how much\n time passed between the app launch and the crash using `timeIntervalCrashInLastSessionOccurred`. This allows you\n to add additional code to your app delaying the app start until the crash has been successfully send if the crash\n occurred within a critical startup timeframe, e.g. after 10 seconds. The `BITCrashManagerDelegate` protocol provides\n various delegates to inform the app about it's current status so you can continue the remaining app startup setup\n after sending has been completed. The documentation contains a guide\n [How to handle Crashes on startup](HowTo-Handle-Crashes-On-Startup) with an example on how to do that.\n \n More background information on this topic can be found in the following blog post by Landon Fuller, the\n developer of [PLCrashReporter](https://www.plcrashreporter.org), about writing reliable and\n safe crash reporting: [Reliable Crash Reporting](http://goo.gl/WvTBR)\n \n @warning If you start the app with the Xcode debugger attached, detecting crashes will _NOT_ be enabled!\n */\n\n@interface BITCrashManager : BITHockeyBaseManager\n\n\n///-----------------------------------------------------------------------------\n/// @name Configuration\n///-----------------------------------------------------------------------------\n\n/** Set the default status of the Crash Manager\n \n Defines if the crash reporting feature should be disabled, ask the user before\n sending each crash report or send crash reports automatically without\n asking.\n \n The default value is `BITCrashManagerStatusAlwaysAsk`. The user can switch to\n `BITCrashManagerStatusAutoSend` by choosing \"Always\" in the dialog (since \n `showAlwaysButton` default is _YES_).\n \n The current value is always stored in User Defaults with the key\n `BITCrashManagerStatus`.\n \n If you intend to implement a user setting to let them enable or disable\n crash reporting, this delegate should be used to return that value. You also\n have to make sure the new value is stored in the UserDefaults with the key\n `BITCrashManagerStatus`.\n \n @see BITCrashManagerStatus\n @see showAlwaysButton\n */\n@property (nonatomic, assign) BITCrashManagerStatus crashManagerStatus;\n\n\n/**\n *  Trap fatal signals via a Mach exception server.\n *\n *  By default the SDK is using the safe and proven in-process BSD Signals for catching crashes.\n *  This option provides an option to enable catching fatal signals via a Mach exception server\n *  instead.\n *\n *  We strongly advice _NOT_ to enable Mach exception handler in release versions of your apps!\n *\n *  Default: _NO_\n *\n * @warning The Mach exception handler executes in-process, and will interfere with debuggers when\n *  they attempt to suspend all active threads (which will include the Mach exception handler).\n *  Mach-based handling should _NOT_ be used when a debugger is attached. The SDK will not\n *  enabled catching exceptions if the app is started with the debugger running. If you attach\n *  the debugger during runtime, this may cause issues the Mach exception handler is enabled!\n * @see isDebuggerAttached\n */\n@property (nonatomic, assign, getter=isMachExceptionHandlerEnabled) BOOL enableMachExceptionHandler;\n\n\n/**\n *  Enable on device symbolication for system symbols\n *\n *  By default, the SDK does not symbolicate on the device, since this can\n *  take a few seconds at each crash. Also note that symbolication on the\n *  device might not be able to retrieve all symbols.\n *\n *  Enable if you want to analyze crashes on unreleased OS versions.\n *\n *  Default: _NO_\n */\n@property (nonatomic, assign, getter=isOnDeviceSymbolicationEnabled) BOOL enableOnDeviceSymbolication;\n\n\n/**\n *  EXPERIMENTAL: Enable heuristics to detect the app not terminating cleanly\n *\n *  This allows it to get a crash report if the app got killed while being in the foreground\n *  because of one of the following reasons:\n *\n *  - The main thread was blocked for too long\n *  - The app took too long to start up\n *  - The app tried to allocate too much memory. If iOS did send a memory warning before killing the app because of this reason, `didReceiveMemoryWarningInLastSession` returns `YES`.\n *  - Permitted background duration if main thread is running in an endless loop\n *  - App failed to resume in time if main thread is running in an endless loop\n *  - If `enableMachExceptionHandler` is not activated, crashed due to stack overflow will also be reported\n *\n *  The following kills can _NOT_ be detected:\n *\n *  - Terminating the app takes too long\n *  - Permitted background duration too long for all other cases\n *  - App failed to resume in time for all other cases\n *  - possibly more cases\n *\n *  Crash reports triggered by this mechanisms do _NOT_ contain any stack traces since the time of the kill\n *  cannot be intercepted and hence no stack trace of the time of the kill event can't be gathered.\n *\n *  The heuristic is implemented as follows:\n *  If the app never gets a `UIApplicationDidEnterBackgroundNotification` or `UIApplicationWillTerminateNotification`\n *  notification, PLCrashReporter doesn't detect a crash itself, and the app starts up again, it is assumed that\n *  the app got either killed by iOS while being in foreground or a crash occurred that couldn't be detected.\n *\n *  Default: _NO_\n *\n * @warning This is a heuristic and it _MAY_ report false positives! It has been tested with iOS 6.1 and iOS 7.\n * Depending on Apple changing notification events, new iOS version may cause more false positives!\n *\n * @see lastSessionCrashDetails\n * @see didReceiveMemoryWarningInLastSession\n * @see `BITCrashManagerDelegate considerAppNotTerminatedCleanlyReportForCrashManager:`\n * @see [Apple Technical Note TN2151](https://developer.apple.com/library/ios/technotes/tn2151/_index.html)\n * @see [Apple Technical Q&A QA1693](https://developer.apple.com/library/ios/qa/qa1693/_index.html)\n */\n@property (nonatomic, assign, getter = isAppNotTerminatingCleanlyDetectionEnabled) BOOL enableAppNotTerminatingCleanlyDetection;\n\n\n/**\n * Set the callbacks that will be executed prior to program termination after a crash has occurred\n *\n * PLCrashReporter provides support for executing an application specified function in the context\n * of the crash reporter's signal handler, after the crash report has been written to disk.\n *\n * Writing code intended for execution inside of a signal handler is exceptionally difficult, and is _NOT_ recommended!\n *\n * _Program Flow and Signal Handlers_\n *\n * When the signal handler is called the normal flow of the program is interrupted, and your program is an unknown state. Locks may be held, the heap may be corrupt (or in the process of being updated), and your signal handler may invoke a function that was being executed at the time of the signal. This may result in deadlocks, data corruption, and program termination.\n *\n * _Async-Safe Functions_\n *\n * A subset of functions are defined to be async-safe by the OS, and are safely callable from within a signal handler. If you do implement a custom post-crash handler, it must be async-safe. A table of POSIX-defined async-safe functions and additional information is available from the [CERT programming guide - SIG30-C](https://www.securecoding.cert.org/confluence/display/seccode/SIG30-C.+Call+only+asynchronous-safe+functions+within+signal+handlers).\n *\n * Most notably, the Objective-C runtime itself is not async-safe, and Objective-C may not be used within a signal handler.\n *\n * Documentation taken from PLCrashReporter: https://www.plcrashreporter.org/documentation/api/v1.2-rc2/async_safety.html\n *\n * @see BITCrashManagerPostCrashSignalCallback\n * @see BITCrashManagerCallbacks\n *\n * @param callbacks A pointer to an initialized PLCrashReporterCallback structure, see https://www.plcrashreporter.org/documentation/api/v1.2-rc2/struct_p_l_crash_reporter_callbacks.html\n */\n- (void)setCrashCallbacks: (BITCrashManagerCallbacks *) callbacks;\n\n\n/**\n Flag that determines if an \"Always\" option should be shown\n \n If enabled the crash reporting alert will also present an \"Always\" option, so\n the user doesn't have to approve every single crash over and over again.\n \n If If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`, this property\n has no effect, since no alert will be presented.\n\n Default: _YES_\n \n @see crashManagerStatus\n */\n@property (nonatomic, assign, getter=shouldShowAlwaysButton) BOOL showAlwaysButton;\n\n\n///-----------------------------------------------------------------------------\n/// @name Crash Meta Information\n///-----------------------------------------------------------------------------\n\n/**\n Indicates if the app crash in the previous session\n\n Use this on startup, to check if the app starts the first time after it crashed\n previously. You can use this also to disable specific events, like asking\n the user to rate your app.\n \n @warning This property only has a correct value, once `[BITHockeyManager startManager]` was\n invoked!\n \n @see lastSessionCrashDetails\n */\n@property (nonatomic, readonly) BOOL didCrashInLastSession;\n\n/**\n Provides an interface to pass user input from a custom alert to a crash report\n \n @param userInput Defines the users action wether to send, always send, or not to send the crash report.\n @param userProvidedMetaData The content of this optional BITCrashMetaData instance will be attached to the crash report and allows to ask the user for e.g. additional comments or info.\n \n @return Returns YES if the input is a valid option and successfully triggered further processing of the crash report\n \n @see BITCrashManagerUserInput\n @see BITCrashMetaData\n */\n- (BOOL)handleUserInput:(BITCrashManagerUserInput)userInput withUserProvidedMetaData:(BITCrashMetaData *)userProvidedMetaData;\n\n/**\n Lets you set a custom block which handles showing a custom UI and asking the user\n whether they want to send the crash report.\n \n This replaces the default alert the SDK would show!\n \n You can use this to present any kind of user interface which asks the user for additional information,\n e.g. what they did in the app before the app crashed.\n \n In addition to this you should always ask your users if they agree to send crash reports, send them\n always or not and return the result when calling `handleUserInput:withUserProvidedCrashDescription`.\n \n @param alertViewHandler A block that is responsible for loading, presenting and and dismissing your custom user interface which prompts the user if they want to send crash reports. The block is also responsible for triggering further processing of the crash reports.\n \n @warning This is not available when compiled for Watch OS!\n \n @warning Block needs to call the `[BITCrashManager handleUserInput:withUserProvidedMetaData:]` method!\n \n @warning This needs to be set before calling `[BITHockeyManager startManager]`!\n */\n- (void)setAlertViewHandler:(BITCustomAlertViewHandler)alertViewHandler;\n\n/**\n * Provides details about the crash that occurred in the last app session\n */\n@property (nonatomic, readonly) BITCrashDetails *lastSessionCrashDetails;\n\n\n/**\n Indicates if the app did receive a low memory warning in the last session\n \n It may happen that low memory warning where send but couldn't be logged, since iOS\n killed the app before updating the flag in the filesystem did complete.\n \n This property may be true in case of low memory kills, but it doesn't have to be! Apps\n can also be killed without the app ever receiving a low memory warning.\n \n Also the app could have received a low memory warning, but the reason for being killed was\n actually different.\n \n @warning This property only has a correct value, once `[BITHockeyManager startManager]` was\n invoked!\n \n @see enableAppNotTerminatingCleanlyDetection\n @see lastSessionCrashDetails\n */\n@property (nonatomic, readonly) BOOL didReceiveMemoryWarningInLastSession;\n\n\n/**\n Provides the time between startup and crash in seconds\n \n Use this in together with `didCrashInLastSession` to detect if the app crashed very\n early after startup. This can be used to delay app initialization until the crash\n report has been sent to the server or if you want to do any other actions like\n cleaning up some cache data etc.\n \n Note that sending a crash reports starts as early as 1.5 seconds after the application\n did finish launching!\n \n The `BITCrashManagerDelegate` protocol provides some delegates to inform if sending\n a crash report was finished successfully, ended in error or was cancelled by the user.\n \n *Default*: _-1_\n @see didCrashInLastSession\n @see BITCrashManagerDelegate\n */\n@property (nonatomic, readonly) NSTimeInterval timeIntervalCrashInLastSessionOccurred;\n\n\n///-----------------------------------------------------------------------------\n/// @name Helper\n///-----------------------------------------------------------------------------\n\n/**\n *  Detect if a debugger is attached to the app process\n *\n *  This is only invoked once on app startup and can not detect if the debugger is being\n *  attached during runtime!\n *\n *  @return BOOL if the debugger is attached on app startup\n */\n- (BOOL)isDebuggerAttached;\n\n\n/**\n * Lets the app crash for easy testing of the SDK\n *\n * The best way to use this is to trigger the crash with a button action.\n *\n * Make sure not to let the app crash in `applicationDidFinishLaunching` or any other\n * startup method! Since otherwise the app would crash before the SDK could process it.\n *\n * Note that our SDK provides support for handling crashes that happen early on startup.\n * Check the documentation for more information on how to use this.\n *\n * If the SDK detects an App Store environment, it will _NOT_ cause the app to crash!\n */\n- (void)generateTestCrash;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITCrashManagerDelegate.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n@class BITCrashManager;\n@class BITHockeyAttachment;\n\n/**\n The `BITCrashManagerDelegate` formal protocol defines methods further configuring\n the behaviour of `BITCrashManager`.\n */\n\n@protocol BITCrashManagerDelegate <NSObject>\n\n@optional\n\n\n///-----------------------------------------------------------------------------\n/// @name Additional meta data\n///-----------------------------------------------------------------------------\n\n/** Return any log string based data the crash report being processed should contain\n\n @param crashManager The `BITCrashManager` instance invoking this delegate\n @see attachmentForCrashManager:\n @see BITHockeyManagerDelegate userNameForHockeyManager:componentManager:\n @see BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:\n */\n-(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager;\n\n\n/** Return a BITHockeyAttachment object providing an NSData object the crash report\n being processed should contain\n \n Please limit your attachments to reasonable files to avoid high traffic costs for your users.\n \n Example implementation:\n \n     - (BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager {\n       NSData *data = [NSData dataWithContentsOfURL:@\"mydatafile\"];\n \n       BITHockeyAttachment *attachment = [[BITHockeyAttachment alloc] initWithFilename:@\"myfile.data\"\n                                                                  hockeyAttachmentData:data\n                                                                           contentType:@\"'application/octet-stream\"];\n       return attachment;\n     }\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n @see BITHockeyAttachment\n @see applicationLogForCrashManager:\n @see BITHockeyManagerDelegate userNameForHockeyManager:componentManager:\n @see BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:\n */\n-(BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager;\n\n\n\n///-----------------------------------------------------------------------------\n/// @name Alert\n///-----------------------------------------------------------------------------\n\n/** Invoked before the user is asked to send a crash report, so you can do additional actions.\n E.g. to make sure not to ask the user for an app rating :)\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n */\n-(void)crashManagerWillShowSubmitCrashReportAlert:(BITCrashManager *)crashManager;\n\n\n/** Invoked after the user did choose _NOT_ to send a crash in the alert\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n */\n-(void)crashManagerWillCancelSendingCrashReport:(BITCrashManager *)crashManager;\n\n\n/** Invoked after the user did choose to send crashes always in the alert\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n */\n-(void)crashManagerWillSendCrashReportsAlways:(BITCrashManager *)crashManager;\n\n\n///-----------------------------------------------------------------------------\n/// @name Networking\n///-----------------------------------------------------------------------------\n\n/** Invoked right before sending crash reports will start\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n */\n- (void)crashManagerWillSendCrashReport:(BITCrashManager *)crashManager;\n\n/** Invoked after sending crash reports failed\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n @param error The error returned from the NSURLSession call or `kBITCrashErrorDomain`\n with reason of type `BITCrashErrorReason`.\n */\n- (void)crashManager:(BITCrashManager *)crashManager didFailWithError:(NSError *)error;\n\n/** Invoked after sending crash reports succeeded\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n */\n- (void)crashManagerDidFinishSendingCrashReport:(BITCrashManager *)crashManager;\n\n///-----------------------------------------------------------------------------\n/// @name Experimental\n///-----------------------------------------------------------------------------\n\n/** Define if a report should be considered as a crash report\n \n Due to the risk, that these reports may be false positives, this delegates allows the\n developer to influence which reports detected by the heuristic should actually be reported.\n \n The developer can use the following property to get more information about the crash scenario:\n - `[BITCrashManager didReceiveMemoryWarningInLastSession]`: Did the app receive a low memory warning\n \n This allows only reports to be considered where at least one low memory warning notification was\n received by the app to reduce to possibility of having false positives.\n \n @param crashManager The `BITCrashManager` instance invoking this delegate\n @return `YES` if the heuristic based detected report should be reported, otherwise `NO`\n @see `[BITCrashManager didReceiveMemoryWarningInLastSession]`\n */\n-(BOOL)considerAppNotTerminatedCleanlyReportForCrashManager:(BITCrashManager *)crashManager;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITCrashMetaData.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n\n/**\n *  This class provides properties that can be attached to a crash report via a custom alert view flow\n */\n@interface BITCrashMetaData : NSObject\n\n/**\n *  User provided description that should be attached to the crash report as plain text\n */\n@property (nonatomic, copy) NSString *userProvidedDescription;\n\n/**\n *  User name that should be attached to the crash report\n */\n@property (nonatomic, copy) NSString *userName;\n\n/**\n *  User email that should be attached to the crash report\n */\n@property (nonatomic, copy) NSString *userEmail;\n\n/**\n *  User ID that should be attached to the crash report\n */\n@property (nonatomic, copy) NSString *userID;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITHockeyAttachment.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n Provides support to add binary attachments to crash reports and feedback messages\n \n This is used by `[BITCrashManagerDelegate attachmentForCrashManager:]`,\n `[BITFeedbackComposeViewController prepareWithItems:]` and\n `[BITFeedbackManager showFeedbackComposeViewWithPreparedItems:]`\n */\n@interface BITHockeyAttachment : NSObject<NSCoding>\n\n/**\n The filename the attachment should get\n */\n@property (nonatomic, readonly, copy) NSString *filename;\n\n/**\n The attachment data as NSData object\n */\n@property (nonatomic, readonly, strong) NSData *hockeyAttachmentData;\n\n/**\n The content type of your data as MIME type\n */\n@property (nonatomic, readonly, copy) NSString *contentType;\n\n/**\n Create an BITHockeyAttachment instance with a given filename and NSData object\n \n @param filename             The filename the attachment should get. If nil will get a automatically generated filename\n @param hockeyAttachmentData The attachment data as NSData. The instance will be ignore if this is set to nil!\n @param contentType          The content type of your data as MIME type. If nil will be set to \"application/octet-stream\"\n \n @return An instance of BITHockeyAttachment.\n */\n- (instancetype)initWithFilename:(NSString *)filename\n            hockeyAttachmentData:(NSData *)hockeyAttachmentData\n                     contentType:(NSString *)contentType;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITHockeyBaseManager.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n\n/**\n The internal superclass for all component managers\n \n */\n\n@interface BITHockeyBaseManager : NSObject\n\n///-----------------------------------------------------------------------------\n/// @name Modules\n///-----------------------------------------------------------------------------\n\n\n/**\n Defines the server URL to send data to or request data from\n \n By default this is set to the HockeyApp servers and there rarely should be a\n need to modify that.\n */\n@property (nonatomic, copy) NSString *serverURL;\n\n\n///-----------------------------------------------------------------------------\n/// @name User Interface\n///-----------------------------------------------------------------------------\n\n/**\n The UIBarStyle of the update user interface navigation bar.\n \n Default is UIBarStyleBlackOpaque\n @see navigationBarTintColor\n */\n@property (nonatomic, assign) UIBarStyle barStyle;\n\n/**\n The navigationbar tint color of the update user interface navigation bar.\n \n The navigationBarTintColor is used by default, you can either overwrite it `navigationBarTintColor`\n or define another `barStyle` instead.\n \n Default is RGB(25, 25, 25)\n @see barStyle\n */\n@property (nonatomic, strong) UIColor *navigationBarTintColor;\n\n/**\n The UIModalPresentationStyle for showing the update user interface when invoked\n with the update alert.\n */\n@property (nonatomic, assign) UIModalPresentationStyle modalPresentationStyle;\n\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITHockeyBaseViewController.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface BITHockeyBaseViewController : UITableViewController\n\n@property (nonatomic, readwrite) BOOL modalAnimated;\n\n- (instancetype)initWithModalStyle:(BOOL)modal;\n- (instancetype)initWithStyle:(UITableViewStyle)style modal:(BOOL)modal;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITHockeyManager.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *         Kent Sutherland\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n#import \"HockeySDKFeatureConfig.h\"\n#import \"HockeySDKEnums.h\"\n\n@protocol BITHockeyManagerDelegate;\n\n@class BITHockeyBaseManager;\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER\n@class BITCrashManager;\n#endif\n#if HOCKEYSDK_FEATURE_UPDATES\n@class BITUpdateManager;\n#endif\n#if HOCKEYSDK_FEATURE_STORE_UPDATES\n@class BITStoreUpdateManager;\n#endif\n#if HOCKEYSDK_FEATURE_FEEDBACK\n@class BITFeedbackManager;\n#endif\n#if HOCKEYSDK_FEATURE_AUTHENTICATOR\n@class BITAuthenticator;\n#endif\n#if HOCKEYSDK_FEATURE_METRICS\n@class BITMetricsManager;\n#endif\n\n/** \n The HockeySDK manager. Responsible for setup and management of all components\n \n This is the principal SDK class. It represents the entry point for the HockeySDK. The main promises of the class are initializing the SDK modules, providing access to global properties and to all modules. Initialization is divided into several distinct phases:\n \n 1. Setup the [HockeyApp](http://hockeyapp.net/) app identifier and the optional delegate: This is the least required information on setting up the SDK and using it. It does some simple validation of the app identifier and checks if the app is running from the App Store or not.\n 2. Provides access to the SDK modules `BITCrashManager`, `BITUpdateManager`, and `BITFeedbackManager`. This way all modules can be further configured to personal needs, if the defaults don't fit the requirements.\n 3. Configure each module.\n 4. Start up all modules.\n \n The SDK is optimized to defer everything possible to a later time while making sure e.g. crashes on startup can also be caught and each module executes other code with a delay some seconds. This ensures that applicationDidFinishLaunching will process as fast as possible and the SDK will not block the startup sequence resulting in a possible kill by the watchdog process.\n\n All modules do **NOT** show any user interface if the module is not activated or not integrated.\n `BITCrashManager`: Shows an alert on startup asking the user if he/she agrees on sending the crash report, if `[BITCrashManager crashManagerStatus]` is set to `BITCrashManagerStatusAlwaysAsk` (default)\n `BITUpdateManager`: Is automatically deactivated when the SDK detects it is running from a build distributed via the App Store. Otherwise if it is not deactivated manually, it will show an alert after startup informing the user about a pending update, if one is available. If the user then decides to view the update another screen is presented with further details and an option to install the update.\n `BITFeedbackManager`: If this module is deactivated or the user interface is nowhere added into the app, this module will not do anything. It will not fetch the server for data or show any user interface. If it is integrated, activated, and the user already used it to provide feedback, it will show an alert after startup if a new answer has been received from the server with the option to view it.\n \n Example:\n \n    [[BITHockeyManager sharedHockeyManager]\n      configureWithIdentifier:@\"<AppIdentifierFromHockeyApp>\"\n                     delegate:nil];\n    [[BITHockeyManager sharedHockeyManager] startManager];\n \n @warning The SDK is **NOT** thread safe and has to be set up on the main thread!\n \n @warning Most properties of all components require to be set **BEFORE** calling`startManager`!\n\n */\n\n#import \"HockeySDKNullability.h\"\nNS_ASSUME_NONNULL_BEGIN\n\n@interface BITHockeyManager: NSObject\n\n#pragma mark - Public Methods\n\n///-----------------------------------------------------------------------------\n/// @name Initialization\n///-----------------------------------------------------------------------------\n\n/**\n Returns a shared BITHockeyManager object\n \n @return A singleton BITHockeyManager instance ready use\n */\n+ (BITHockeyManager *)sharedHockeyManager;\n\n\n/**\n Initializes the manager with a particular app identifier\n \n Initialize the manager with a HockeyApp app identifier.\n \n    [[BITHockeyManager sharedHockeyManager]\n      configureWithIdentifier:@\"<AppIdentifierFromHockeyApp>\"];\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @param appIdentifier The app identifier that should be used.\n */\n- (void)configureWithIdentifier:(NSString *)appIdentifier;\n\n\n/**\n Initializes the manager with a particular app identifier and delegate\n \n Initialize the manager with a HockeyApp app identifier and assign the class that\n implements the optional protocols `BITHockeyManagerDelegate`, `BITCrashManagerDelegate` or\n `BITUpdateManagerDelegate`.\n \n    [[BITHockeyManager sharedHockeyManager]\n      configureWithIdentifier:@\"<AppIdentifierFromHockeyApp>\"\n                     delegate:nil];\n\n @see configureWithIdentifier:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @see BITHockeyManagerDelegate\n @see BITCrashManagerDelegate\n @see BITUpdateManagerDelegate\n @see BITFeedbackManagerDelegate\n @param appIdentifier The app identifier that should be used.\n @param delegate `nil` or the class implementing the option protocols\n */\n- (void)configureWithIdentifier:(NSString *)appIdentifier delegate:(nullable id<BITHockeyManagerDelegate>)delegate;\n\n\n/**\n Initializes the manager with an app identifier for beta, one for live usage and delegate\n \n Initialize the manager with different HockeyApp app identifiers for beta and live usage.\n All modules will automatically detect if the app is running in the App Store and use\n the live app identifier for that. In all other cases it will use the beta app identifier.\n And also assign the class that implements the optional protocols `BITHockeyManagerDelegate`,\n `BITCrashManagerDelegate` or `BITUpdateManagerDelegate`\n \n    [[BITHockeyManager sharedHockeyManager]\n      configureWithBetaIdentifier:@\"<AppIdentifierForBetaAppFromHockeyApp>\"\n                   liveIdentifier:@\"<AppIdentifierForLiveAppFromHockeyApp>\"\n                         delegate:nil];\n\n We recommend using one app entry on HockeyApp for your beta versions and another one for\n your live versions. The reason is that you will have way more beta versions than live\n versions, but on the other side get way more crash reports on the live version. Separating\n them into two different app entries makes it easier to work with the data. In addition\n you will likely end up having the same version number for a beta and live version which\n would mix different data into the same version. Also the live version does not require\n you to upload any IPA files, uploading only the dSYM package for crash reporting is\n just fine.\n\n @see configureWithIdentifier:\n @see configureWithIdentifier:delegate:\n @see startManager\n @see BITHockeyManagerDelegate\n @see BITCrashManagerDelegate\n @see BITUpdateManagerDelegate\n @see BITFeedbackManagerDelegate\n @param betaIdentifier The app identifier for the _non_ app store (beta) configurations\n @param liveIdentifier The app identifier for the app store configurations.\n @param delegate `nil` or the class implementing the optional protocols\n */\n- (void)configureWithBetaIdentifier:(NSString *)betaIdentifier liveIdentifier:(NSString *)liveIdentifier delegate:(nullable id<BITHockeyManagerDelegate>)delegate;\n\n\n/**\n Starts the manager and runs all modules\n \n Call this after configuring the manager and setting up all modules.\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n */\n- (void)startManager;\n\n#pragma mark - Public Properties\n\n///-----------------------------------------------------------------------------\n/// @name Modules\n///-----------------------------------------------------------------------------\n\n\n/**\n Set the delegate\n \n Defines the class that implements the optional protocol `BITHockeyManagerDelegate`.\n \n The delegate will automatically be propagated to all components. There is no need to set the delegate\n for each component individually.\n \n @warning This property needs to be set before calling `startManager`\n \n @see BITHockeyManagerDelegate\n @see BITCrashManagerDelegate\n @see BITUpdateManagerDelegate\n @see BITFeedbackManagerDelegate\n */\n@property (nonatomic, weak, nullable) id<BITHockeyManagerDelegate> delegate;\n\n\n/**\n Defines the server URL to send data to or request data from\n \n By default this is set to the HockeyApp servers and there rarely should be a\n need to modify that.\n Please be aware that the URL for `BITMetricsManager` needs to be set separately\n as this class uses a different endpoint!\n \n @warning This property needs to be set before calling `startManager`\n */\n@property (nonatomic, copy) NSString *serverURL;\n\n\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER\n\n/**\n Reference to the initialized BITCrashManager module\n\n Returns the BITCrashManager instance initialized by BITHockeyManager\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @see disableCrashManager\n */\n@property (nonatomic, strong, readonly) BITCrashManager *crashManager;\n\n\n/**\n Flag the determines whether the Crash Manager should be disabled\n \n If this flag is enabled, then crash reporting is disabled and no crashes will\n be send.\n \n Please note that the Crash Manager instance will be initialized anyway, but crash report\n handling (signal and uncaught exception handlers) will **not** be registered.\n\n @warning This property needs to be set before calling `startManager`\n\n *Default*: _NO_\n @see crashManager\n */\n@property (nonatomic, getter = isCrashManagerDisabled) BOOL disableCrashManager;\n\n#endif\n\n\n#if HOCKEYSDK_FEATURE_UPDATES\n\n/**\n Reference to the initialized BITUpdateManager module\n \n Returns the BITUpdateManager instance initialized by BITHockeyManager\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @see disableUpdateManager\n */\n@property (nonatomic, strong, readonly) BITUpdateManager *updateManager;\n\n\n/**\n Flag the determines whether the Update Manager should be disabled\n \n If this flag is enabled, then checking for updates and submitting beta usage\n analytics will be turned off!\n \n Please note that the Update Manager instance will be initialized anyway!\n \n @warning This property needs to be set before calling `startManager`\n\n *Default*: _NO_\n @see updateManager\n */\n@property (nonatomic, getter = isUpdateManagerDisabled) BOOL disableUpdateManager;\n\n#endif\n\n\n#if HOCKEYSDK_FEATURE_STORE_UPDATES\n\n/**\n Reference to the initialized BITStoreUpdateManager module\n \n Returns the BITStoreUpdateManager instance initialized by BITHockeyManager\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @see enableStoreUpdateManager\n */\n@property (nonatomic, strong, readonly) BITStoreUpdateManager *storeUpdateManager;\n\n\n/**\n Flag the determines whether the App Store Update Manager should be enabled\n \n If this flag is enabled, then checking for updates when the app runs from the\n app store will be turned on!\n \n Please note that the Store Update Manager instance will be initialized anyway!\n\n @warning This property needs to be set before calling `startManager`\n\n *Default*: _NO_\n @see storeUpdateManager\n */\n@property (nonatomic, getter = isStoreUpdateManagerEnabled) BOOL enableStoreUpdateManager;\n\n#endif\n\n\n#if HOCKEYSDK_FEATURE_FEEDBACK\n\n/**\n Reference to the initialized BITFeedbackManager module\n \n Returns the BITFeedbackManager instance initialized by BITHockeyManager\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n @see disableFeedbackManager\n */\n@property (nonatomic, strong, readonly) BITFeedbackManager *feedbackManager;\n\n\n/**\n Flag the determines whether the Feedback Manager should be disabled\n \n If this flag is enabled, then letting the user give feedback and\n get responses will be turned off!\n \n Please note that the Feedback Manager instance will be initialized anyway!\n\n @warning This property needs to be set before calling `startManager`\n\n *Default*: _NO_\n @see feedbackManager\n */\n@property (nonatomic, getter = isFeedbackManagerDisabled) BOOL disableFeedbackManager;\n\n#endif\n\n\n#if HOCKEYSDK_FEATURE_AUTHENTICATOR\n\n/**\n Reference to the initialized BITAuthenticator module\n \n Returns the BITAuthenticator instance initialized by BITHockeyManager\n \n @see configureWithIdentifier:delegate:\n @see configureWithBetaIdentifier:liveIdentifier:delegate:\n @see startManager\n */\n@property (nonatomic, strong, readonly) BITAuthenticator *authenticator;\n\n#endif\n\n#if HOCKEYSDK_FEATURE_METRICS\n\n/**\n Reference to the initialized BITMetricsManager module\n \n Returns the BITMetricsManager instance initialized by BITHockeyManager\n */\n@property (nonatomic, strong, readonly) BITMetricsManager *metricsManager;\n\n/**\n Flag the determines whether the BITMetricsManager should be disabled\n \n If this flag is enabled, then sending metrics data such as sessions and users \n will be turned off!\n \n Please note that the BITMetricsManager instance will be initialized anyway!\n  \n *Default*: _NO_\n @see metricsManager\n */\n@property (nonatomic, getter = isMetricsManagerDisabled) BOOL disableMetricsManager;\n\n#endif\n\n///-----------------------------------------------------------------------------\n/// @name Environment\n///-----------------------------------------------------------------------------\n\n\n/**\n Enum that indicates what kind of environment the application is installed and running in.\n \n This property can be used to disable or enable specific funtionality \n only when specific conditions are met.\n That could mean for example, to only enable debug UI elements \n when the app has been installed over HockeyApp but not in the AppStore.\n \n The underlying enum type at the moment only specifies values for the AppStore,\n TestFlight and Other. Other summarizes several different distribution methods\n and we might define additional specifc values for other environments in the future.\n \n @see BITEnvironment\n */\n@property (nonatomic, readonly) BITEnvironment appEnvironment;\n\n\n/**\n Returns the app installation specific anonymous UUID\n \n The value returned by this method is unique and persisted per app installation\n in the keychain.  It is also being used in crash reports as `CrashReporter Key`\n and internally when sending crash reports and feedback messages.\n \n This is not identical to the `[ASIdentifierManager advertisingIdentifier]` or\n the `[UIDevice identifierForVendor]`!\n */\n@property (nonatomic, readonly, copy) NSString *installString;\n\n\n/**\n Disable tracking the installation of an app on a device\n \n This will cause the app to generate a new `installString` value every time the\n app is cold started.\n \n This property is only considered in App Store Environment, since it would otherwise\n affect the `BITUpdateManager` and `BITAuthenticator` functionalities!\n \n @warning This property needs to be set before calling `startManager`\n \n *Default*: _NO_\n */\n@property (nonatomic, getter=isInstallTrackingDisabled) BOOL disableInstallTracking;\n\n///-----------------------------------------------------------------------------\n/// @name Debug Logging\n///-----------------------------------------------------------------------------\n\n/**\n This property is used indicate the amount of verboseness and severity for which\n you want to see log messages in the console.\n */\n@property (nonatomic, assign) BITLogLevel logLevel;\n\n/**\n Flag that determines whether additional logging output should be generated\n by the manager and all modules.\n \n This is ignored if the app is running in the App Store and reverts to the\n default value in that case.\n \n @warning This property needs to be set before calling `startManager`\n \n *Default*: _NO_\n */\n@property (nonatomic, assign, getter=isDebugLogEnabled) BOOL debugLogEnabled DEPRECATED_MSG_ATTRIBUTE(\"Use logLevel instead!\");\n\n/**\n Set a custom block that handles all the log messages that are emitted from the SDK.\n\n You can use this to reroute the messages that would normally be logged by `NSLog();`\n to your own custom logging framework.\n\n An example of how to do this with NSLogger:\n \n ```\n [[BITHockeyManager sharedHockeyManager] setLogHandler:^(BITLogMessageProvider messageProvider, BITLogLevel logLevel, const char *file, const char *function, uint line) {\n    LogMessageRawF(file, (int)line, function, @\"HockeySDK\", (int)logLevel-1, messageProvider());\n }];\n ```\n\n or with CocoaLumberjack:\n \n ```\n [[BITHockeyManager sharedHockeyManager] setLogHandler:^(BITLogMessageProvider messageProvider, BITLogLevel logLevel, const char *file, const char *function, uint line) {\n    [DDLog log:YES message:messageProvider() level:ddLogLevel flag:(DDLogFlag)(1 << (logLevel-1)) context:<#CocoaLumberjackContext#> file:file function:function line:line tag:nil];\n }];\n ```\n \n @param logHandler The block of type BITLogHandler that will process all logged messages.\n */\n- (void)setLogHandler:(BITLogHandler)logHandler;\n\n\n///-----------------------------------------------------------------------------\n/// @name Integration test\n///-----------------------------------------------------------------------------\n\n/**\n Pings the server with the HockeyApp app identifiers used for initialization\n \n Call this method once for debugging purposes to test if your SDK setup code\n reaches the server successfully.\n \n Once invoked, check the apps page on HockeyApp for a verification.\n \n If you setup the SDK with a beta and live identifier, a call to both app IDs will be done.\n\n This call is ignored if the app is running in the App Store!.\n */\n- (void)testIdentifier;\n\n\n///-----------------------------------------------------------------------------\n/// @name Additional meta data\n///-----------------------------------------------------------------------------\n\n/** Set the userid that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n\n The value can be set at any time and will be stored in the keychain on the current\n device only! To delete the value from the keychain set the value to `nil`.\n \n This property is optional and can be used as an alternative to the delegate. If you\n want to define specific data for each component, use the delegate instead which does\n overwrite the values set by this property.\n \n @warning When returning a non nil value, crash reports are not anonymous any more\n and the crash alerts will not show the word \"anonymous\"!\n \n @warning This property needs to be set before calling `startManager` to be considered\n for being added to crash reports as meta data.\n\n @see userName\n @see userEmail\n @see `[BITHockeyManagerDelegate userIDForHockeyManager:componentManager:]`\n */\n@property (nonatomic, copy, nullable) NSString *userID;\n\n\n/** Set the user name that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n \n The value can be set at any time and will be stored in the keychain on the current\n device only! To delete the value from the keychain set the value to `nil`.\n \n This property is optional and can be used as an alternative to the delegate. If you\n want to define specific data for each component, use the delegate instead which does\n overwrite the values set by this property.\n\n @warning When returning a non nil value, crash reports are not anonymous any more\n and the crash alerts will not show the word \"anonymous\"!\n\n @warning This property needs to be set before calling `startManager` to be considered\n for being added to crash reports as meta data.\n\n @see userID\n @see userEmail\n @see `[BITHockeyManagerDelegate userNameForHockeyManager:componentManager:]`\n */\n@property (nonatomic, copy, nullable) NSString *userName;\n\n\n/** Set the users email address that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n \n The value can be set at any time and will be stored in the keychain on the current\n device only! To delete the value from the keychain set the value to `nil`.\n \n This property is optional and can be used as an alternative to the delegate. If you\n want to define specific data for each component, use the delegate instead which does\n overwrite the values set by this property.\n \n @warning When returning a non nil value, crash reports are not anonymous any more\n and the crash alerts will not show the word \"anonymous\"!\n \n @warning This property needs to be set before calling `startManager` to be considered\n for being added to crash reports as meta data.\n\n @see userID\n @see userName\n @see [BITHockeyManagerDelegate userEmailForHockeyManager:componentManager:]\n */\n@property (nonatomic, copy, nullable) NSString *userEmail;\n\n\n///-----------------------------------------------------------------------------\n/// @name SDK meta data\n///-----------------------------------------------------------------------------\n\n/**\n Returns the SDK Version (CFBundleShortVersionString).\n */\n- (NSString *)version;\n\n/**\n Returns the SDK Build (CFBundleVersion) as a string.\n */\n- (NSString *)build;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITHockeyManagerDelegate.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n#import \"HockeySDKFeatureConfig.h\"\n\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER\n#import \"BITCrashManagerDelegate.h\"\n#endif\n\n#if HOCKEYSDK_FEATURE_UPDATES\n#import \"BITUpdateManagerDelegate.h\"\n#endif\n\n#if HOCKEYSDK_FEATURE_FEEDBACK\n#import \"BITFeedbackManagerDelegate.h\"\n#endif\n\n#if HOCKEYSDK_FEATURE_AUTHENTICATOR\n#import \"BITAuthenticator.h\"\n#endif\n\n@class BITHockeyManager;\n@class BITHockeyBaseManager;\n\n/**\n The `BITHockeyManagerDelegate` formal protocol defines methods further configuring\n  the behaviour of `BITHockeyManager`, as well as the delegate of the modules it manages.\n */\n\n@protocol BITHockeyManagerDelegate <NSObject\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER\n  , BITCrashManagerDelegate\n#endif\n#if HOCKEYSDK_FEATURE_UPDATES\n  , BITUpdateManagerDelegate\n#endif\n#if HOCKEYSDK_FEATURE_FEEDBACK\n  , BITFeedbackManagerDelegate\n#endif\n#if HOCKEYSDK_FEATURE_AUTHENTICATOR\n  , BITAuthenticatorDelegate\n#endif\n  >\n\n@optional\n\n\n///-----------------------------------------------------------------------------\n/// @name App Identifier usage\n///-----------------------------------------------------------------------------\n\n/**\n Implement to force the usage of the live identifier\n \n This is useful if you are e.g. distributing an enterprise app inside your company\n and want to use the `liveIdentifier` for that even though it is not running from\n the App Store.\n \n Example:\n \n     - (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager {\n     #ifdef (CONFIGURATION_AppStore)\n       return YES;\n     #endif\n       return NO;\n     }\n \n @param hockeyManager BITHockeyManager instance\n */\n- (BOOL)shouldUseLiveIdentifierForHockeyManager:(BITHockeyManager *)hockeyManager;\n\n\n///-----------------------------------------------------------------------------\n/// @name UI presentation\n///-----------------------------------------------------------------------------\n\n\n// optional parent view controller for the feedback screen when invoked via the alert view, default is the root UIWindow instance\n/**\n Return a custom parent view controller for presenting modal sheets\n \n By default the SDK is using the root UIWindow instance to present any required\n view controllers. Overwrite this if this doesn't result in a satisfying\n behavior or if you want to define any other parent view controller.\n \n @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate\n @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager`\n */\n- (UIViewController *)viewControllerForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;\n\n\n///-----------------------------------------------------------------------------\n/// @name Additional meta data\n///-----------------------------------------------------------------------------\n\n\n/** Return the userid that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n \n In addition, if this returns not nil for `BITFeedbackManager` the user will\n not be asked for any user details by the component, including userName or userEmail.\n \n You can find out the component requesting the userID like this:\n \n    - (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {\n      if (componentManager == hockeyManager.feedbackManager) {\n        return UserIDForFeedback;\n      } else if (componentManager == hockeyManager.crashManager) {\n        return UserIDForCrashReports;\n      } else {\n        return nil;\n      }\n    }\n \n For crash reports, this delegate is invoked on the startup after the crash!\n \n Alternatively you can also use `[BITHockeyManager userID]` which will cache the value in the keychain.\n\n @warning When returning a non nil value for the `BITCrashManager` component, crash reports\n are not anonymous any more and the crash alerts will not show the word \"anonymous\"!\n \n @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate\n @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager`\n @see userNameForHockeyManager:componentManager:\n @see userEmailForHockeyManager:componentManager:\n @see [BITHockeyManager userID]\n */\n- (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;\n\n\n/** Return the user name that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n \n In addition, if this returns not nil for `BITFeedbackManager` the user will\n not be asked for any user details by the component, including userName or userEmail.\n \n You can find out the component requesting the user name like this:\n \n    - (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {\n      if (componentManager == hockeyManager.feedbackManager) {\n        return UserNameForFeedback;\n      } else if (componentManager == hockeyManager.crashManager) {\n        return UserNameForCrashReports;\n      } else {\n        return nil;\n      }\n }\n\n For crash reports, this delegate is invoked on the startup after the crash!\n \n Alternatively you can also use `[BITHockeyManager userName]` which will cache the value in the keychain.\n \n @warning When returning a non nil value for the `BITCrashManager` component, crash reports\n are not anonymous any more and the crash alerts will not show the word \"anonymous\"!\n\n @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate\n @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager`\n @see userIDForHockeyManager:componentManager:\n @see userEmailForHockeyManager:componentManager:\n @see [BITHockeyManager userName]\n */\n- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;\n\n\n/** Return the users email address that should used in the SDK components\n \n Right now this is used by the `BITCrashManager` to attach to a crash report.\n `BITFeedbackManager` uses it too for assigning the user to a discussion thread.\n \n In addition, if this returns not nil for `BITFeedbackManager` the user will\n not be asked for any user details by the component, including userName or userEmail.\n \n You can find out the component requesting the user email like this:\n \n    - (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {\n      if (componentManager == hockeyManager.feedbackManager) {\n        return UserEmailForFeedback;\n      } else if (componentManager == hockeyManager.crashManager) {\n        return UserEmailForCrashReports;\n       } else {\n        return nil;\n       }\n    }\n \n For crash reports, this delegate is invoked on the startup after the crash!\n \n Alternatively you can also use `[BITHockeyManager userEmail]` which will cache the value in the keychain.\n \n @warning When returning a non nil value for the `BITCrashManager` component, crash reports\n are not anonymous any more and the crash alerts will not show the word \"anonymous\"!\n\n @param hockeyManager The `BITHockeyManager` HockeyManager instance invoking this delegate\n @param componentManager The `BITHockeyBaseManager` component instance invoking this delegate, can be `BITCrashManager` or `BITFeedbackManager`\n @see userIDForHockeyManager:componentManager:\n @see userNameForHockeyManager:componentManager:\n @see [BITHockeyManager userEmail]\n */\n- (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITMetricsManager.h",
    "content": "#import \"HockeySDKFeatureConfig.h\"\n\n#if HOCKEYSDK_FEATURE_METRICS\n\n#import <Foundation/Foundation.h>\n#import \"BITHockeyBaseManager.h\"\n\n#import \"HockeySDKNullability.h\"\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n The metrics module.\n \n This is the HockeySDK module that handles users, sessions and events tracking.\n \n Unless disabled, this module automatically tracks users and session of your app to give you\n better insights about how your app is being used.\n Users are tracked in a completely anonymous way without collecting any personally identifiable\n information.\n \n Before starting to track events, ask yourself the questions that you want to get answers to.\n For instance, you might be interested in business, performance/quality or user experience aspects.\n Name your events in a meaningful way and keep in mind that you will use these names \n when searching for events in the HockeyApp web portal.\n \n It is your reponsibility to not collect personal information as part of the events tracking or get\n prior consent from your users as necessary.\n */\n@interface BITMetricsManager : BITHockeyBaseManager\n\n/**\n *  A property indicating whether the BITMetricsManager instance is disabled.\n */\n@property (nonatomic, assign) BOOL disabled;\n\n/**\n *  This method allows to track an event that happened in your app.\n *  Remember to choose meaningful event names to have the best experience when diagnosing your app\n *  in the HockeyApp web portal.\n *\n *  @param eventName The event's name as a string.\n */\n- (void)trackEventWithName:(nonnull NSString *)eventName;\n\n/**\n *  This method allows to track an event that happened in your app.\n *  Remember to choose meaningful event names to have the best experience when diagnosing your app\n *  in the web portal.\n *\n *  @param eventName the name of the event, which should be tracked.\n *  @param properties key value pairs with additional info about the event.\n *  @param measurements key value pairs, which contain custom metrics.\n */\n- (void)trackEventWithName:(nonnull NSString *)eventName properties:(nullable NSDictionary<NSString *, NSString *> *)properties measurements:(nullable NSDictionary<NSString *, NSNumber *> *)measurements;\n\n@end\n\nNS_ASSUME_NONNULL_END\n\n#endif /* HOCKEYSDK_FEATURE_METRICS */\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITStoreUpdateManager.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n#import <UIKit/UIKit.h>\n#import \"BITHockeyBaseManager.h\"\n\n\n/**\n *  Defines the update check intervals\n */\ntypedef NS_ENUM(NSInteger, BITStoreUpdateSetting) {\n  /**\n   *  Check every day\n   */\n  BITStoreUpdateCheckDaily = 0,\n  /**\n   *  Check every week\n   */\n  BITStoreUpdateCheckWeekly = 1,\n  /**\n   *  Check manually\n   */\n  BITStoreUpdateCheckManually = 2\n};\n\n@protocol BITStoreUpdateManagerDelegate;\n\n/**\n The store update manager module.\n \n This is the HockeySDK module for handling app updates when having your app released in the App Store.\n By default the module uses the current users locale to define the app store to check for updates. You\n can modify this using the `countryCode` property. See the property documentation for details on its usage.\n \n When an update is detected, this module will show an alert asking the user if he/she wants to update or\n ignore this version. If update was chosen, it will open the apps page in the app store app.\n\n You need to enable this module using `[BITHockeyManager enableStoreUpdateManager]` if you want to use this\n feature. By default this module is disabled!\n  \n When this module is enabled and **NOT** running in an App Store build/environment, it won't do any checks!\n \n The `BITStoreUpdateManagerDelegate` protocol informs the app about new detected app versions.\n \n @warning This module can **NOT** check if the current device and OS version match the minimum requirements of\n the new app version!\n \n */\n\n@interface BITStoreUpdateManager : BITHockeyBaseManager\n\n///-----------------------------------------------------------------------------\n/// @name Update Checking\n///-----------------------------------------------------------------------------\n\n/**\n When to check for new updates.\n \n Defines when a the SDK should check if there is a new update available on the\n server. This must be assigned one of the following, see `BITStoreUpdateSetting`:\n \n - `BITStoreUpdateCheckDaily`: Once a day\n - `BITStoreUpdateCheckWeekly`: Once a week\n - `BITStoreUpdateCheckManually`: Manually\n \n **Default**: BITStoreUpdateCheckWeekly\n \n @warning When setting this to `BITStoreUpdateCheckManually` you need to either\n invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by\n proving an update check button for the user or integrating the Update View into your\n user interface.\n @see BITStoreUpdateSetting\n @see countryCode\n @see checkForUpdateOnLaunch\n @see checkForUpdate\n */\n@property (nonatomic, assign) BITStoreUpdateSetting updateSetting;\n\n\n/**\n Defines the store country the app is always available in, otherwise uses the users locale\n \n If this value is not defined, then it uses the device country if the current locale.\n \n If you are pre-defining a country and are releasing a new version on a specific date,\n it can happen that users get an alert but the update is not yet available in their country!\n \n But if a user downloaded the app from another appstore than the locale is set and the app is not\n available in the locales app store, then the user will never receive an update notification!\n \n More information about possible country codes is available here: http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\n \n @see updateSetting\n @see checkForUpdateOnLaunch\n @see checkForUpdate\n */\n@property (nonatomic, copy) NSString *countryCode;\n\n\n/**\n Flag that determines whether the automatic update checks should be done.\n \n If this is enabled the update checks will be performed automatically depending on the\n `updateSetting` property. If this is disabled the `updateSetting` property will have\n no effect, and checking for updates is totally up to be done by yourself.\n \n *Default*: _YES_\n\n @warning When setting this to `NO` you need to invoke update checks yourself!\n @see updateSetting\n @see countryCode\n @see checkForUpdate\n */\n@property (nonatomic, assign, getter=isCheckingForUpdateOnLaunch) BOOL checkForUpdateOnLaunch;\n\n\n///-----------------------------------------------------------------------------\n/// @name User Interface\n///-----------------------------------------------------------------------------\n\n\n/**\n Flag that determines if the integrated update alert should be used\n \n If enabled, the integrated UIAlert based update notification will be used to inform\n the user about a new update being available in the App Store.\n \n If disabled, you need to implement the `BITStoreUpdateManagerDelegate` protocol with\n the method `[BITStoreUpdateManagerDelegate detectedUpdateFromStoreUpdateManager:newVersion:storeURL:]`\n to be notified about new version and proceed yourself.\n The manager will consider this identical to an `Ignore` user action using the alert\n and not inform about this particular version any more, unless the app is updated\n and this very same version shows up at a later time again as a new version.\n \n *Default*: _YES_\n \n @warning If the HockeySDKResources bundle is missing in the application package, then the internal\n update alert is also disabled and be treated identical to manually disabling this\n property.\n @see updateSetting\n */\n@property (nonatomic, assign, getter=isUpdateUIEnabled) BOOL updateUIEnabled;\n\n///-----------------------------------------------------------------------------\n/// @name Manual update checking\n///-----------------------------------------------------------------------------\n\n/**\n Check for an update\n \n Call this to trigger a check if there is a new update available on the HockeyApp servers.\n \n @see updateSetting\n @see countryCode\n @see checkForUpdateOnLaunch\n */\n- (void)checkForUpdate;\n\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITStoreUpdateManagerDelegate.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n@class BITStoreUpdateManager;\n\n/**\n The `BITStoreUpdateManagerDelegate` formal protocol defines methods for\n more interaction with `BITStoreUpdateManager`.\n */\n\n@protocol BITStoreUpdateManagerDelegate <NSObject>\n\n@optional\n\n\n///-----------------------------------------------------------------------------\n/// @name Update information\n///-----------------------------------------------------------------------------\n\n/** Informs which new version has been reported to be available\n \n @warning If this is invoked with a simulated new version, the storeURL could be _NIL_ if the current builds\n bundle identifier is different to the bundle identifier used in the app store build.\n @param storeUpdateManager The `BITStoreUpdateManager` instance invoking this delegate\n @param newVersion The new version string reported by the App Store\n @param storeURL The App Store URL for this app that could be invoked to let them perform the update.\n */\n-(void)detectedUpdateFromStoreUpdateManager:(BITStoreUpdateManager *)storeUpdateManager newVersion:(NSString *)newVersion storeURL:(NSURL *)storeURL;\n\n\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITUpdateManager.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *         Peter Steinberger\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * Copyright (c) 2011 Andreas Linde.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n\n#import \"BITHockeyBaseManager.h\"\n\n\n/**\n *  Update check interval\n */\ntypedef NS_ENUM (NSUInteger, BITUpdateSetting) {\n  /**\n   *  On every startup or or when the app comes to the foreground\n   */\n  BITUpdateCheckStartup = 0,\n  /**\n   *  Once a day\n   */\n  BITUpdateCheckDaily = 1,\n  /**\n   *  Manually\n   */\n  BITUpdateCheckManually = 2\n};\n\n@protocol BITUpdateManagerDelegate;\n\n@class BITAppVersionMetaInfo;\n@class BITUpdateViewController;\n\n/**\n The update manager module.\n \n This is the HockeySDK module for handling app updates when using Ad-Hoc or Enterprise provisioning profiles.\n This module handles version updates, presents update and version information in an App Store like user interface,\n collects usage information and provides additional authorization options when using Ad-Hoc provisioning profiles.\n \n By default, this module automatically disables itself when running in an App Store build!\n \n The protocol `BITUpdateManagerDelegate` provides delegates to inform about events and adjust a few behaviors.\n \n To use the server side restriction feature, to provide updates only to specific users, you need to setup the\n `BITAuthenticator` class. This allows the update request to tell the server which user is using the app on the\n current device and then let the server decide which updates the device may see.\n \n */\n\n@interface BITUpdateManager : BITHockeyBaseManager\n\n///-----------------------------------------------------------------------------\n/// @name Update Checking\n///-----------------------------------------------------------------------------\n\n// see HockeyUpdateSetting-enum. Will be saved in user defaults.\n// default value: HockeyUpdateCheckStartup\n/**\n When to check for new updates.\n \n Defines when the SDK should check if there is a new update available on the\n server. This must be assigned one of the following, see `BITUpdateSetting`:\n \n - `BITUpdateCheckStartup`: On every startup or or when the app comes to the foreground\n - `BITUpdateCheckDaily`: Once a day\n - `BITUpdateCheckManually`: Manually\n \n When running the app from the App Store, this setting is ignored.\n\n **Default**: BITUpdateCheckStartup\n \n @warning When setting this to `BITUpdateCheckManually` you need to either\n invoke the update checking process yourself with `checkForUpdate` somehow, e.g. by\n proving an update check button for the user or integrating the Update View into your\n user interface.\n @see BITUpdateSetting\n @see checkForUpdateOnLaunch\n @see checkForUpdate\n */\n@property (nonatomic, assign) BITUpdateSetting updateSetting;\n\n\n/**\n Flag that determines whether the automatic update checks should be done.\n \n If this is enabled the update checks will be performed automatically depending on the\n `updateSetting` property. If this is disabled the `updateSetting` property will have\n no effect, and checking for updates is totally up to be done by yourself.\n \n When running the app from the App Store, this setting is ignored.\n\n *Default*: _YES_\n\n @warning When setting this to `NO` you need to invoke update checks yourself!\n @see updateSetting\n @see checkForUpdate\n */\n@property (nonatomic, assign, getter=isCheckForUpdateOnLaunch) BOOL checkForUpdateOnLaunch;\n\n\n// manually start an update check\n/**\n Check for an update\n \n Call this to trigger a check if there is a new update available on the HockeyApp servers.\n \n When running the app from the App Store, this method call is ignored.\n\n @see updateSetting\n @see checkForUpdateOnLaunch\n */\n- (void)checkForUpdate;\n\n\n///-----------------------------------------------------------------------------\n/// @name Update Notification\n///-----------------------------------------------------------------------------\n\n/**\n Flag that determines if update alerts should be repeatedly shown\n \n If enabled the update alert shows on every startup and whenever the app becomes active,\n until the update is installed.\n If disabled the update alert is only shown once ever and it is up to you to provide an\n alternate way for the user to navigate to the update UI or update in another way.\n \n When running the app from the App Store, this setting is ignored.\n\n *Default*: _YES_\n */\n@property (nonatomic, assign) BOOL alwaysShowUpdateReminder;\n\n\n/**\n Flag that determines if the update alert should show a direct install option\n \n If enabled the update alert shows an additional option which allows to invoke the update\n installation process directly instead of viewing the update UI first.\n By default the alert only shows a `Show` and `Ignore` option.\n \n When running the app from the App Store, this setting is ignored.\n\n *Default*: _NO_\n */\n@property (nonatomic, assign, getter=isShowingDirectInstallOption) BOOL showDirectInstallOption;\n\n\n///-----------------------------------------------------------------------------\n/// @name Expiry\n///-----------------------------------------------------------------------------\n\n/**\n Expiry date of the current app version\n \n If set, the app will get unusable at the given date by presenting a blocking view on\n top of the apps UI so that no interaction is possible. To present a custom UI, check\n the documentation of the \n `[BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]` delegate.\n \n Once the expiry date is reached, the app will no longer check for updates or\n send any usage data to the server!\n \n When running the app from the App Store, this setting is ignored.\n \n *Default*: nil\n @see disableUpdateCheckOptionWhenExpired\n @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]\n @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:]\n @warning This only works when using Ad-Hoc provisioning profiles!\n */\n@property (nonatomic, strong) NSDate *expiryDate;\n\n/**\n Disable the update check button from expiry screen or alerts\n\n If do not want your users to be able to check for updates once a version is expired,\n then enable this property.\n \n If this is not enabled, the users will be able to check for updates and install them\n if any is available for the current device.\n\n *Default*: NO\n @see expiryDate\n @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]\n @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:]\n @warning This only works when using Ad-Hoc provisioning profiles!\n*/\n@property (nonatomic) BOOL disableUpdateCheckOptionWhenExpired;\n\n\n///-----------------------------------------------------------------------------\n/// @name User Interface\n///-----------------------------------------------------------------------------\n\n\n/**\n Present the modal update user interface.\n \n @warning Make sure to call this method from the main thread!\n */\n- (void)showUpdateView;\n\n\n/**\n Create an update view\n\n @param modal Return a view which is ready for modal presentation with an integrated navigation bar\n @return BITUpdateViewController The update user interface view controller,\n e.g. to push it onto a navigation stack.\n */\n- (BITUpdateViewController *)hockeyViewController:(BOOL)modal;\n\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITUpdateManagerDelegate.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n@class BITUpdateManager;\n\n/**\n The `BITUpdateManagerDelegate` formal protocol defines methods further configuring\n the behaviour of `BITUpdateManager`. \n */\n\n@protocol BITUpdateManagerDelegate <NSObject>\n\n@optional\n\n///-----------------------------------------------------------------------------\n/// @name Update\n///-----------------------------------------------------------------------------\n\n/**\n Return if update alert should be shown\n\n If you want to display your own user interface when there is an update available,\n implement this method, present your user interface and return _NO_. In this case\n it is your responsibility to call `BITUpdateManager showUpdateView`\n\n Note: This delegate will be invoked on startup and every time the app becomes\n active again!\n\n When returning _YES_ the default blocking UI will be shown.\n\n When running the app from the App Store, this delegate is ignored.\n\n @param updateManager The `BITUpdateManager` instance invoking this delegate\n @param shortVersion The latest available version\n @param version The latest available version\n */\n- (BOOL)shouldDisplayUpdateAlertForUpdateManager:(BITUpdateManager *)updateManager forShortVersion:(NSString *)shortVersion forVersion:(NSString *)version;\n\n///-----------------------------------------------------------------------------\n/// @name Expiry\n///-----------------------------------------------------------------------------\n\n/**\n Return if expiry alert should be shown if date is reached\n \n If you want to display your own user interface when the expiry date is reached,\n implement this method, present your user interface and return _NO_. In this case\n it is your responsibility to make the app unusable!\n \n Note: This delegate will be invoked on startup and every time the app becomes\n active again!\n \n When returning _YES_ the default blocking UI will be shown.\n \n When running the app from the App Store, this delegate is ignored.\n \n @param updateManager The `BITUpdateManager` instance invoking this delegate\n @see [BITUpdateManager expiryDate]\n @see [BITUpdateManagerDelegate didDisplayExpiryAlertForUpdateManager:]\n */\n- (BOOL)shouldDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager;\n\n\n/**\n Invoked once a default expiry alert is shown\n \n Once expiry date is reached and the default blocking UI is shown,\n this delegate method is invoked to provide you the possibility to do any\n desired additional processing.\n \n @param updateManager The `BITUpdateManager` instance invoking this delegate\n @see [BITUpdateManager expiryDate]\n @see [BITUpdateManagerDelegate shouldDisplayExpiryAlertForUpdateManager:]\n */\n- (void)didDisplayExpiryAlertForUpdateManager:(BITUpdateManager *)updateManager;\n\n\n///-----------------------------------------------------------------------------\n/// @name Privacy\n///-----------------------------------------------------------------------------\n\n/** Return NO if usage data should not be send\n \n The update  module send usage data by default, if the application is _NOT_\n running in an App Store version. Implement this delegate and\n return NO if you want to disable this.\n \n If you intend to implement a user setting to let them enable or disable\n sending usage data, this delegate should be used to return that value.\n \n Usage data contains the following information:\n - App Version\n - iOS Version\n - Device type\n - Language\n - Installation timestamp\n - Usage time\n\n @param updateManager The `BITUpdateManager` instance invoking this delegate\n @warning When setting this to `NO`, you will _NOT_ know if this user is actually testing!\n */\n- (BOOL)updateManagerShouldSendUsageData:(BITUpdateManager *)updateManager;\n\n\n///-----------------------------------------------------------------------------\n/// @name Privacy\n///-----------------------------------------------------------------------------\n\n/** Implement this method to be notified before an update starts.\n \n The update manager will send this delegate message _just_ before the system\n call to update the application is placed, but after the user has already chosen\n to install the update.\n \n There is no guarantee that the update will actually start after this delegate\n message is sent.\n\n @param updateManager The `BITUpdateManager` instance invoking this delegate\n */\n- (BOOL)willStartDownloadAndUpdate:(BITUpdateManager *)updateManager;\n\n/**\n Invoked right before the app will exit to allow app update to start (>= iOS8 only)\n \n The iOS installation mechanism only starts if the app the should be updated is currently\n not running. On all iOS versions up to iOS 7, the system did automatically exit the app\n in these cases. Since iOS 8 this isn't done any longer.\n \n @param updateManager The `BITUpdateManager` instance invoking this delegate\n */\n- (void)updateManagerWillExitApp:(BITUpdateManager *)updateManager;\n\n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/BITUpdateViewController.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *         Peter Steinberger\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * Copyright (c) 2011 Andreas Linde, Peter Steinberger.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"BITHockeyBaseViewController.h\"\n\n\n@interface BITUpdateViewController : BITHockeyBaseViewController \n@end\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/HockeySDK.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2012-2014 HockeyApp, Bit Stadium GmbH.\n * Copyright (c) 2011 Andreas Linde.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#import <Foundation/Foundation.h>\n\n\n#if !defined (TARGET_OS_IOS) // Defined starting in iOS 9\n#define TARGET_OS_IOS 1\n#endif\n\n\n#import \"HockeySDKFeatureConfig.h\"\n#import \"HockeySDKEnums.h\"\n#import \"HockeySDKNullability.h\"\n\n#import \"BITHockeyManager.h\"\n#import \"BITHockeyManagerDelegate.h\"\n\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER || HOCKEYSDK_FEATURE_FEEDBACK\n#import \"BITHockeyAttachment.h\"\n#endif\n\n#if HOCKEYSDK_FEATURE_CRASH_REPORTER\n#import \"BITCrashManager.h\"\n#import \"BITCrashAttachment.h\"\n#import \"BITCrashManagerDelegate.h\"\n#import \"BITCrashDetails.h\"\n#import \"BITCrashMetaData.h\"\n#endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */\n\n#if HOCKEYSDK_FEATURE_UPDATES\n#import \"BITUpdateManager.h\"\n#import \"BITUpdateManagerDelegate.h\"\n#import \"BITUpdateViewController.h\"\n#endif /* HOCKEYSDK_FEATURE_UPDATES */\n\n#if HOCKEYSDK_FEATURE_STORE_UPDATES\n#import \"BITStoreUpdateManager.h\"\n#import \"BITStoreUpdateManagerDelegate.h\"\n#endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */\n\n#if HOCKEYSDK_FEATURE_FEEDBACK\n#import \"BITFeedbackManager.h\"\n#import \"BITFeedbackManagerDelegate.h\"\n#import \"BITFeedbackActivity.h\"\n#import \"BITFeedbackComposeViewController.h\"\n#import \"BITFeedbackComposeViewControllerDelegate.h\"\n#import \"BITFeedbackListViewController.h\"\n#endif /* HOCKEYSDK_FEATURE_FEEDBACK */\n\n#if HOCKEYSDK_FEATURE_AUTHENTICATOR\n#import \"BITAuthenticator.h\"\n#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */\n\n#if HOCKEYSDK_FEATURE_METRICS\n#import \"BITMetricsManager.h\"\n#endif /* HOCKEYSDK_FEATURE_METRICS */\n\n// Notification message which HockeyManager is listening to, to retry requesting updated from the server.\n// This can be used by app developers to trigger additional points where the HockeySDK can try sending\n// pending crash reports or feedback messages.\n// By default the SDK retries sending pending data only when the app becomes active.\n#define BITHockeyNetworkDidBecomeReachableNotification @\"BITHockeyNetworkDidBecomeReachable\"\n\nextern NSString *const kBITCrashErrorDomain;\nextern NSString *const kBITUpdateErrorDomain;\nextern NSString *const kBITFeedbackErrorDomain;\nextern NSString *const kBITAuthenticatorErrorDomain;\nextern NSString *const __attribute__((unused)) kBITHockeyErrorDomain;\n\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/HockeySDKEnums.h",
    "content": "//\n//  HockeySDKEnums.h\n//  HockeySDK\n//\n//  Created by Lukas Spieß on 08/10/15.\n//\n//\n\n#ifndef HockeySDK_HockeyEnums_h\n#define HockeySDK_HockeyEnums_h\n\n/**\n *  HockeySDK Log Levels\n */\ntypedef NS_ENUM(NSUInteger, BITLogLevel) {\n  /**\n   *  Logging is disabled\n   */\n  BITLogLevelNone = 0,\n  /**\n   *  Only errors will be logged\n   */\n  BITLogLevelError = 1,\n  /**\n   *  Errors and warnings will be logged\n   */\n  BITLogLevelWarning = 2,\n  /**\n   *  Debug information will be logged\n   */\n  BITLogLevelDebug = 3,\n  /**\n   *  Logging will be very chatty\n   */\n  BITLogLevelVerbose = 4\n};\n\ntypedef NSString *(^BITLogMessageProvider)(void);\ntypedef void (^BITLogHandler)(BITLogMessageProvider messageProvider, BITLogLevel logLevel, const char *file, const char *function, uint line);\n\n/**\n *  HockeySDK App environment\n */\ntypedef NS_ENUM(NSInteger, BITEnvironment) {\n  /**\n   *  App has been downloaded from the AppStore\n   */\n  BITEnvironmentAppStore = 0,\n  /**\n   *  App has been downloaded from TestFlight\n   */\n  BITEnvironmentTestFlight = 1,\n  /**\n   *  App has been installed by some other mechanism.\n   *  This could be Ad-Hoc, Enterprise, etc.\n   */\n  BITEnvironmentOther = 99\n};\n\n/**\n *  HockeySDK Crash Reporter error domain\n */\ntypedef NS_ENUM (NSInteger, BITCrashErrorReason) {\n  /**\n   *  Unknown error\n   */\n  BITCrashErrorUnknown,\n  /**\n   *  API Server rejected app version\n   */\n  BITCrashAPIAppVersionRejected,\n  /**\n   *  API Server returned empty response\n   */\n  BITCrashAPIReceivedEmptyResponse,\n  /**\n   *  Connection error with status code\n   */\n  BITCrashAPIErrorWithStatusCode\n};\n\n/**\n *  HockeySDK Update error domain\n */\ntypedef NS_ENUM (NSInteger, BITUpdateErrorReason) {\n  /**\n   *  Unknown error\n   */\n  BITUpdateErrorUnknown,\n  /**\n   *  API Server returned invalid status\n   */\n  BITUpdateAPIServerReturnedInvalidStatus,\n  /**\n   *  API Server returned invalid data\n   */\n  BITUpdateAPIServerReturnedInvalidData,\n  /**\n   *  API Server returned empty response\n   */\n  BITUpdateAPIServerReturnedEmptyResponse,\n  /**\n   *  Authorization secret missing\n   */\n  BITUpdateAPIClientAuthorizationMissingSecret,\n  /**\n   *  No internet connection\n   */\n  BITUpdateAPIClientCannotCreateConnection\n};\n\n/**\n *  HockeySDK Feedback error domain\n */\ntypedef NS_ENUM(NSInteger, BITFeedbackErrorReason) {\n  /**\n   *  Unknown error\n   */\n  BITFeedbackErrorUnknown,\n  /**\n   *  API Server returned invalid status\n   */\n  BITFeedbackAPIServerReturnedInvalidStatus,\n  /**\n   *  API Server returned invalid data\n   */\n  BITFeedbackAPIServerReturnedInvalidData,\n  /**\n   *  API Server returned empty response\n   */\n  BITFeedbackAPIServerReturnedEmptyResponse,\n  /**\n   *  Authorization secret missing\n   */\n  BITFeedbackAPIClientAuthorizationMissingSecret,\n  /**\n   *  No internet connection\n   */\n  BITFeedbackAPIClientCannotCreateConnection\n};\n\n/**\n *  HockeySDK Authenticator error domain\n */\ntypedef NS_ENUM(NSInteger, BITAuthenticatorReason) {\n  /**\n   *  Unknown error\n   */\n  BITAuthenticatorErrorUnknown,\n  /**\n   *  Network error\n   */\n  BITAuthenticatorNetworkError,\n  \n  /**\n   *  API Server returned invalid response\n   */\n  BITAuthenticatorAPIServerReturnedInvalidResponse,\n  /**\n   *  Not Authorized\n   */\n  BITAuthenticatorNotAuthorized,\n  /**\n   *  Unknown Application ID (configuration error)\n   */\n  BITAuthenticatorUnknownApplicationID,\n  /**\n   *  Authorization secret missing\n   */\n  BITAuthenticatorAuthorizationSecretMissing,\n  /**\n   *  Not yet identified\n   */\n  BITAuthenticatorNotIdentified,\n};\n\n/**\n *  HockeySDK global error domain\n */\ntypedef NS_ENUM(NSInteger, BITHockeyErrorReason) {\n  /**\n   *  Unknown error\n   */\n  BITHockeyErrorUnknown\n};\n\n#endif /* HockeySDK_HockeyEnums_h */\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/HockeySDKFeatureConfig.h",
    "content": "/*\n * Author: Andreas Linde <mail@andreaslinde.de>\n *\n * Copyright (c) 2013-2014 HockeyApp, Bit Stadium GmbH.\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person\n * obtaining a copy of this software and associated documentation\n * files (the \"Software\"), to deal in the Software without\n * restriction, including without limitation the rights to use,\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the\n * Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n * OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * This is the template feature config that is used for debug builds and during development. \n * For the Distribution target, we are using separate configs that will be copied over in our build script.\n */\n\n\n#ifndef HockeySDK_HockeySDKFeatureConfig_h\n#define HockeySDK_HockeySDKFeatureConfig_h\n\n/**\n * If true, include support for handling crash reports\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_CRASH_REPORTER\n#    define HOCKEYSDK_FEATURE_CRASH_REPORTER 1\n#endif /* HOCKEYSDK_FEATURE_CRASH_REPORTER */\n\n\n/**\n * If true, include support for managing user feedback\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_FEEDBACK\n#    define HOCKEYSDK_FEATURE_FEEDBACK 0\n#endif /* HOCKEYSDK_FEATURE_FEEDBACK */\n\n\n/**\n * If true, include support for informing the user about new updates pending in the App Store\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_STORE_UPDATES\n#    define HOCKEYSDK_FEATURE_STORE_UPDATES 1\n#endif /* HOCKEYSDK_FEATURE_STORE_UPDATES */\n\n\n/**\n * If true, include support for authentication installations for Ad-Hoc and Enterprise builds\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_AUTHENTICATOR\n#    define HOCKEYSDK_FEATURE_AUTHENTICATOR 1\n#endif /* HOCKEYSDK_FEATURE_AUTHENTICATOR */\n\n\n/**\n * If true, include support for handling in-app updates for Ad-Hoc and Enterprise builds\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_UPDATES\n#    define HOCKEYSDK_FEATURE_UPDATES 1\n#endif /* HOCKEYSDK_FEATURE_UPDATES */\n\n\n/**\n * If true, include support for auto collecting metrics data such as sessions and user\n *\n * _Default_: Enabled\n */\n#ifndef HOCKEYSDK_FEATURE_METRICS\n#    define HOCKEYSDK_FEATURE_METRICS 1\n#endif /* HOCKEYSDK_FEATURE_METRICS */\n\n#endif /* HockeySDK_HockeySDKFeatureConfig_h */\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Headers/HockeySDKNullability.h",
    "content": "//\n//  HockeyNullability.h\n//  HockeySDK\n//\n//  Created by Andreas Linde on 12/06/15.\n//\n//\n\n#ifndef HockeySDK_HockeyNullability_h\n#define HockeySDK_HockeyNullability_h\n\n// Define nullability fallback for backwards compatibility\n#if !__has_feature(nullability)\n#define NS_ASSUME_NONNULL_BEGIN\n#define NS_ASSUME_NONNULL_END\n#define nullable\n#define nonnull\n#define null_unspecified\n#define null_resettable\n#define _Nullable\n#define _Nonnull\n#define __nullable\n#define __nonnull\n#define __null_unspecified\n#endif\n\n// Fallback for convenience syntax which might not be available in older SDKs\n#ifndef NS_ASSUME_NONNULL_BEGIN\n#define NS_ASSUME_NONNULL_BEGIN _Pragma(\"clang assume_nonnull begin\")\n#endif\n#ifndef NS_ASSUME_NONNULL_END\n#define NS_ASSUME_NONNULL_END _Pragma(\"clang assume_nonnull end\")\n#endif\n\n#endif /* HockeySDK_HockeyNullability_h */\n"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework/Modules/module.modulemap",
    "content": "framework module HockeySDK {\n  umbrella header \"HockeySDK.h\"\n  \n  export *\n  module * { export * }\n  \n  link framework \"CoreTelephony\"\n  link framework \"CoreGraphics\"\n  link framework \"Foundation\"\n  link framework \"MobileCoreServices\"\n  link framework \"QuartzCore\"\n  link framework \"QuickLook\"\n  link framework \"Security\"\n  link framework \"SystemConfiguration\"\n  link framework \"UIKit\"\n  link \"c++\"\n  link \"z\"\n}"
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/LICENSE",
    "content": "## Licenses\n\nThe Hockey SDK is provided under the following license:\n\n    The MIT License\n    Copyright (c) Microsoft Corporation.\n    All rights reserved.\n\t\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\t\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as noted below, PLCrashReporter \nis provided under the following license:\n\n    Copyright (c) 2008 - 2015 Plausible Labs Cooperative, Inc.\n    Copyright (c) 2012 - 2015 HockeyApp, Bit Stadium GmbH.\n    All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nThe protobuf-c library, as well as the PLCrashLogWriterEncoding.c\nfile are licensed as follows:\n\n    Copyright 2008, Dave Benson.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with\n    the License. You may obtain a copy of the License\n    at http://www.apache.org/licenses/LICENSE-2.0 Unless\n    required by applicable law or agreed to in writing,\n    software distributed under the License is distributed on\n    an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    KIND, either express or implied. See the License for the\n    specific language governing permissions and limitations\n    under the License.\n\nTTTAttributedLabel is licensed as follows:\n\n    Copyright (c) 2011 Mattt Thompson (http://mattt.me/)\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nSFHFKeychainUtils is licensed as follows:\n\n    Created by Buzz Andersen on 10/20/08.\n    Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone.\n    Copyright 2008 Sci-Fi Hi-Fi. All rights reserved.\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nGZIP is licensed as follow:\n    \n    Created by Nick Lockwood on 03/06/2012.\n    Copyright (C) 2012 Charcoal Design\n    \n    Distributed under the permissive zlib License\n    Get the latest version from here:\n    \n    https://github.com/nicklockwood/GZIP\n    \n    This software is provided 'as-is', without any express or implied\n    warranty.  In no event will the authors be held liable for any damages\n    arising from the use of this software.\n    \n    Permission is granted to anyone to use this software for any purpose,\n    including commercial applications, and to alter it and redistribute it\n    freely, subject to the following restrictions:\n    \n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n    \n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n    \n    3. This notice may not be removed or altered from any source distribution."
  },
  {
    "path": "Pods/HockeySDK/HockeySDK-iOS/README.md",
    "content": " [![Build Status](https://www.bitrise.io/app/30bf519f6bd0a5e2/status.svg?token=RKqHc7-ojjLiEFds53d-ZA&branch=master)](https://www.bitrise.io/app/30bf519f6bd0a5e2)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Version](http://cocoapod-badges.herokuapp.com/v/HockeySDK/badge.png)](http://cocoadocs.org/docsets/HockeySDK)\n [![Slack Status](https://slack.hockeyapp.net/badge.svg)](https://slack.hockeyapp.net)\n \n## Version 5.1.2\n\n- [Changelog](http://www.hockeyapp.net/help/sdk/ios/5.1.2/docs/docs/Changelog.html)\n\n**NOTE** If your are using the binary integration of our SDK, make sure that the `HockeySDKResources.bundle` inside the `HockeySDK.embeddedframework`-folder has been added to your application.\n\n### Feedback and iOS 10\n**4.1.1 and later of the HockeySDK remove the Feedback feature from the default version of the SDK.**\nThe reason for this is that iOS 10 requires developers to add a usage string to their Info.plist in case they include the photos framework in their app. If this string is missing, the app will be rejected when submitting the app to the app store. As HockeyApp's Feedback feature includes a dependency to the photos framework. This means that if you include HockeyApp into your app, adding the usage string would be a requirement even for developers who don't use the Feedback feature. If you don't use Feedback in your app, simply upgrade HockeySDK to version 4.1.1 or newer. If you are using Feedback, please have a look at the [Feedback section](#feedback).\n\n\nWe **strongly** suggest upgrading to version 4.1.1 or a later version of the SDK. Not specifying the usage description string and using previous versions of the HockeySDK-iOS will cause the app to crash at runtime as soon as the user taps the \"attach image\"-button or in case you have enabled `BITFeedbackObservationModeOnScreenshot`.\n\nIf you are using an older version of the SDK, you must add a `NSPhotoLibraryUsageDescription` to your `Info.plist` to avoid a AppStore rejection during upload of your app (please have a look at the [Feedback section](#feedback)).\n\n## Introduction\n\nHockeySDK-iOS implements support for using HockeyApp in your iOS applications.\n\nThe following features are currently supported:\n\n1. **Collect crash reports:** If your app crashes, a crash log with the same format as from the Apple Crash Reporter is written to the device's storage. If the user starts the app again, they are asked to submit the crash report to HockeyApp. This works for both beta and live apps, i.e. those submitted to the App Store.\n\n2. **User Metrics:** Understand user behavior to improve your app. Track usage through daily and monthly active users, monitor crash impacted users, as well as customer engagement through session count.You can now track **Custom Events** in your app, understand user actions and see the aggregates on the HockeyApp portal.\n\n3. **Update Ad-Hoc / Enterprise apps:** The app will check with HockeyApp if a new version for your Ad-Hoc or Enterprise build is available. If yes, it will show an alert view to the user and let them see the release notes, the version history and start the installation process right away. \n\n4. **Update notification for app store:** The app will check if a new version for your app store release is available. If yes, it will show an alert view to the user and let them open your app in the App Store app. (Disabled by default!)\n\n5. **Feedback:** Collect feedback from your users from within your app and communicate directly with them using the HockeyApp backend.\n\n6. **Authenticate:** Identify and authenticate users of Ad-Hoc or Enterprise builds\n\nThis document contains the following sections:\n\n1. [Requirements](#requirements)\n2. [Setup](#setup)\n3. [Advanced Setup](#advancedsetup) \n  1. [Linking System Frameworks manually](#linkmanually)   \n  2. [CocoaPods](#cocoapods)\n  3. [Carthage](#carthage)\n  4. [iOS Extensions](#extensions)\n  5. [WatchKit 1 Extensions](#watchkit)\n  6. [Crash Reporting](#crashreporting)\n  7. [User Metrics](#user-metrics)\n  8. [Feedback](#feedback)\n  9. [Store Updates](#storeupdates)\n  10. [In-App-Updates (Beta & Enterprise only)](#betaupdates)\n  11. [Debug information](#debug)\n4. [Documentation](#documentation)\n5. [Troubleshooting](#troubleshooting)\n6. [Contributing](#contributing)\n  1. [Development Environment](#developmentenvironment)\n  2. [Code of Conduct](#codeofconduct)\n  3. [Contributor License](#contributorlicense)\n7. [Contact](#contact)\n\n<a id=\"requirements\"></a> \n## 1. Requirements\n\n1. We assume that you already have a project in Xcode and that this project is opened in Xcode 8 or later.\n2. The SDK supports iOS 8.0 and later.\n\n<a id=\"setup\"></a>\n## 2. Setup\n\nWe recommend integration of our binary into your Xcode project to setup HockeySDK for your iOS app. You can also use our interactive SDK integration wizard in <a href=\"http://hockeyapp.net/mac/\">HockeyApp for Mac</a> which covers all the steps from below. For other ways to setup the SDK, see [Advanced Setup](#advancedsetup).\n\n### 2.1 Obtain an App Identifier\n\nPlease see the \"[How to create a new app](http://support.hockeyapp.net/kb/about-general-faq/how-to-create-a-new-app)\" tutorial. This will provide you with an HockeyApp specific App Identifier to be used to initialize the SDK.\n\n### 2.2 Download the SDK\n\n1. Download the latest [HockeySDK-iOS](http://www.hockeyapp.net/releases/) framework which is provided as a zip-File.\n2. Unzip the file and you will see a folder called `HockeySDK-iOS`. (Make sure not to use 3rd party unzip tools!)\n\n### 2.3 Copy the SDK into your projects directory in Finder\n\nFrom our experience, 3rd-party libraries usually reside inside a subdirectory (let's call our subdirectory `Vendor`), so if you don't have your project organized with a subdirectory for libraries, now would be a great start for it. To continue our example,  create a folder called `Vendor` inside your project directory and move the unzipped `HockeySDK-iOS`-folder into it. \n\nThe SDK comes in four flavors:\n\n  * Default SDK without Feedback: `HockeySDK.embeddedframework`\n  * Full featured SDK with Feedback: `HockeySDK.embeddedframework` in the subfolder `HockeySDKAllFeatures`. \n  * Crash reporting only: `HockeySDK.framework` in the subfolder `HockeySDKCrashOnly`.\n  * Crash reporting only for extensions: `HockeySDK.framework` in the subfolder `HockeySDKCrashOnlyExtension` (which is required to be used for extensions).\n  \nOur examples will use the **default** SDK (`HockeySDK.embeddedframework`).\n\n<a id=\"setupxcode\"></a>\n\n### 2.4 Add the SDK to the project in Xcode\n\n> We recommend using Xcode's group-feature to create a group for 3rd-party-libraries similar to the structure of our files on disk. For example, similar to the file structure in 2.3 above, our projects have a group called `Vendor`.\n\t\n1. Make sure the `Project Navigator` is visible (⌘+1).\n2. Drag & drop `HockeySDK.embeddedframework` from your `Finder` to the `Vendor` group in `Xcode` using the `Project Navigator` on the left side.\n3. An overlay will appear. Select `Create groups` and set the checkmark for your target. Then click `Finish`.\n\n<a id=\"modifycode\"></a>\n### 2.5 Modify Code \n\n**Objective-C**\n\n1. Open your `AppDelegate.m` file.\n2. Add the following line at the top of the file below your own `import` statements:\n\n  ```objc\n  @import HockeySDK;\n  ```\n\n3. Search for the method `application:didFinishLaunchingWithOptions:`\n4. Add the following lines to setup and start the HockeyApp SDK:\n\n  ```objc\n  [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n  // Do some additional configuration if needed here\n  [[BITHockeyManager sharedHockeyManager] startManager];\n  [[BITHockeyManager sharedHockeyManager].authenticator authenticateInstallation]; // This line is obsolete in the crash only builds\n  ```\n\n**Swift**\n\n1. Open your `AppDelegate.swift` file.\n2. Add the following line at the top of the file below your own import statements:\n\n  ```swift\n  import HockeySDK\n  ```\n\n3. Search for the method \n\n  ```swift\n  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool\n  ```\n\n4. Add the following lines to setup and start the HockeyApp SDK:\n\n  ```swift\n  BITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\n  BITHockeyManager.shared().start()\n  BITHockeyManager.shared().authenticator.authenticateInstallation() // This line is obsolete in the crash only builds\n\n  ```\n\n\n*Note:* The SDK is optimized to defer everything possible to a later time while making sure e.g. crashes on start-up can also be caught and each module executes other code with a delay some seconds. This ensures that `applicationDidFinishLaunching` will process as fast as possible and the SDK will not block the start-up sequence resulting in a possible kill by the watchdog process.\n\n\n**Congratulation, now you're all set to use HockeySDK!**\n\n<a id=\"advancedsetup\"></a> \n## 3. Advanced Setup\n\n<a id=\"linkmanually\"></a>\n### 3.1 Linking System Frameworks manually\n\nIf you are working with an older project which doesn't support clang modules yet or you for some reason turned off the `Enable Modules (C and Objective-C` and `Link Frameworks Automatically` options in Xcode, you have to manually link some system frameworks:\n\n1. Select your project in the `Project Navigator` (⌘+1).\n2. Select your app target.\n3. Select the tab `Build Phases`.\n4. Expand `Link Binary With Libraries`.\n5. Add the following system frameworks, if they are missing:\n  1. Default SDK: \n    + `CoreText`\n    + `CoreGraphics`\n    + `Foundation`\n    + `MobileCoreServices`\n    + `QuartzCore`\n    + `QuickLook`\n    + `Security`\n    + `SystemConfiguration`\n    + `UIKit`\n    + `libc++`\n    + `libz`\n  2. SDK with all features:\n    + `CoreText`\n    + `CoreGraphics`\n    + `Foundation`\n    + `MobileCoreServices`\n    + `QuartzCore`\n    + `QuickLook`\n    + `Photos`\n    + `Security`\n    + `SystemConfiguration`\n    + `UIKit`\n    + `libc++`\n    + `libz`\n  3. Crash reporting only:\n    + `Foundation`\n    + `Security`\n    + `SystemConfiguration`\n    + `UIKit`\n    + `libc++`\n  4. Crash reporting only for extensions:\n    + `Foundation`\n    + `Security`\n    + `SystemConfiguration`\n    + `libc++`\n\nNote that not using clang modules also means that you can't use the `@import` syntax mentioned in the [Modify Code](#modify) section but have to stick to the old `#import <HockeySDK/HockeySDK.h>` imports.\n\n<a id=\"cocoapods\"></a>\n### 3.2 CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like HockeySDK in your projects. To learn how to setup CocoaPods for your project, visit the [official CocoaPods website](http://cocoapods.org/).\n\n**Podfile**\n\n```ruby\nplatform :ios, '8.0'\npod \"HockeySDK\"\n```\n\n#### 3.2.1 Binary Distribution Options\n\nThe default and recommended distribution is a binary (static library) and a resource bundle with translations and images for all SDK features.\n\n```ruby\nplatform :ios, '8.0'\npod \"HockeySDK\"\n```\n\nWill integrate the *default* configuration of the SDK, with all features except the Feedback feature.\n\nFor the SDK with all features, including Feedback, add\n\n```ruby\npod \"HockeySDK\", :subspecs => ['AllFeaturesLib']\n```\nto your podfile.\n\nTo add the variant that only includes crash reporting, use\n\n```ruby\npod \"HockeySDK\", :subspecs => ['CrashOnlyLib']\n```\n\nOr you can use the Crash Reporting build only for extensions by using the following line in your `Podfile`:\n\n```ruby\npod \"HockeySDK\", :subspecs => ['CrashOnlyExtensionsLib']\n```\n\n#### 3.2.2 Source Integration Options\n\nAlternatively, you can integrate the SDK by source if you want to do modifications or want a different feature set. The following entry will integrate the SDK:\n\n```ruby\npod \"HockeySDK-Source\"\n```\n\n<a id=\"carthage\"></a>\n### 3.3 Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is an alternative way to add frameworks to your app. For general information about how to use Carthage, please follow their [documentation](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application).\n\nTo add HockeySDK to your project, simply put this line into your `Cartfile`:\n\n`github \"bitstadium/HockeySDK-iOS\"`\n\nand then follow the steps described in the [Carthage documentation](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos).\n\nThis will integrate the **full-featured SDK** so you must include the `NSPhotoLibraryUsageDescription` and read the [feedback section](#feedback). If you want to include any other version of the SDK, version 4.1.4 added the ability to do that. You need to specify the configuration that you want to use\n\n#### Version without Feedback\n\n`carthage build --platform iOS --configuration ReleaseDefault HockeySDK-iOS`\n\n#### Crash-only version\n\n`carthage build --platform iOS --configuration ReleaseCrashOnly HockeySDK-iOS`\n\n### Crash-only extension\n\n`carthage build --platform iOS --configuration ReleaseCrashOnlyExtension HockeySDK-iOS`\n\n<a id=\"extensions\"></a>\n### 3.4 iOS Extensions\n\nThe following points need to be considered to use the HockeySDK SDK with iOS Extensions:\n\n1. Each extension is required to use the same values for version (`CFBundleShortVersionString`) and build number (`CFBundleVersion`) as the main app uses. (This is required only if you are using the same `APP_IDENTIFIER` for your app and extensions).\n2. You need to make sure the SDK setup code is only invoked **once**. Since there is no `applicationDidFinishLaunching:` equivalent and `viewDidLoad` can run multiple times, you need to use a setup like the following example:\n\n**Objective-C**\n\n  ```objc\n  static BOOL didSetupHockeySDK = NO;\n\n  @interface TodayViewController () <NCWidgetProviding>\n\n  @end\n\n  @implementation TodayViewController\n\n  + (void)viewDidLoad {\n    [super viewDidLoad];\n    if (!didSetupHockeySDK) {\n      [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n      [[BITHockeyManager sharedHockeyManager] startManager];\n      didSetupHockeySDK = YES;\n    }\n  }\n  ```\n\n  **Swift**\n\n  ```swift\n  class TodayViewController: UIViewController, NCWidgetProviding {\n\n    static var didSetupHockeySDK = false;\n\n    override func viewDidLoad() {\n      super.viewDidLoad()\n      if !TodayViewController.didSetupHockeySDK {\n        BITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\n        BITHockeyManager.shared().start()\n        TodayViewController.didSetupHockeySDK = true\n      }\n    }\n  }\n  ```\n\n3. The binary distribution provides a special framework build in the `HockeySDKCrashOnly` or `HockeySDKCrashOnlyExtension` folder of the distribution zip file, which only contains crash reporting functionality (also automatic sending crash reports only).\n\n<a id=\"watchkit\"></a>\n### 3.5 WatchKit 1 Extensions\n\nThe following points need to be considered to use HockeySDK with WatchKit 1 Extensions:\n\n1. WatchKit extensions don't use regular `UIViewControllers` but rather `WKInterfaceController` subclasses. These have a different lifecycle than you might be used to.\n\n  To make sure that the HockeySDK is only instantiated once in the WatchKit extension's lifecycle we recommend using a helper class similar to this:\n\n  **Objective-C**\n\n  ```objc\n  @import Foundation;\n  \n  @interface BITWatchSDKSetup : NSObject\n  \n  * (void)setupHockeySDKIfNeeded;\n  \n  @end\n  ```\n\n  ```objc\n  #import \"BITWatchSDKSetup.h\"\n  @import HockeySDK\n  \n  static BOOL hockeySDKIsSetup = NO;\n  \n  @implementation BITWatchSDKSetup\n  \n  * (void)setupHockeySDKIfNeeded {\n    if (!hockeySDKIsSetup) {\n      [[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n      [[BITHockeyManager sharedHockeyManager] startManager];\n      hockeySDKIsSetup = YES;\n    }\n  }\n  \n  @end\n  ```\n\n  **Swift**\n\n  ```swift\n  import HockeySDK\n\n  class BITWatchSDKSetup {\n\n    static var hockeySDKIsSetup = false;\n\n    static func setupHockeySDKIfNeeded() {\n      if !BITWatchSDKSetup.hockeySDKIsSetup {\n        BITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\n        BITHockeyManager.shared().start()\n        BITWatchSDKSetup.hockeySDKIsSetup = true;\n      }\n    }\n  }\n  ```\n\n\n  Then, in each of your WKInterfaceControllers where you want to use the HockeySDK, you should do this:\n\n  **Objective-C**\n\n  ```objc\n  #import \"InterfaceController.h\"\n  @import HockeySDK\n  #import \"BITWatchSDKSetup.h\"\n  \n  @implementation InterfaceController\n  \n  + (void)awakeWithContext:(id)context {\n    [super awakeWithContext:context];\n    [BITWatchSDKSetup setupHockeySDKIfNeeded];\n  }\n  \n  + (void)willActivate {\n    [super willActivate];\n  }\n  \n  + (void)didDeactivate {\n    [super didDeactivate];\n  }\n  \n  @end\n  ```\n\n  **Swift**\n\n  ```swift\n  class InterfaceController: WKInterfaceController {\n\n    override func awake(withContext context: Any?) {\n      super.awake(withContext: context)\n      BITWatchSDKSetup.setupHockeySDKIfNeeded()\n    }\n\n    override func willActivate() {\n      super.willActivate()\n    }\n\n    override func didDeactivate() {\n      super.didDeactivate()\n    }\n\n  }\n  ```\n2. The binary distribution provides a special framework build in the `HockeySDKCrashOnly` or `HockeySDKCrashOnlyExtension` folder of the distribution zip file, which only contains crash reporting functionality (also automatic sending crash reports only).\n\n<a name=\"crashreporting\"></a>\n### 3.6 Crash Reporting\n\nThe following options only show some of the possibilities to interact and fine-tune the crash reporting feature. For more please check the full documentation of the `BITCrashManager` class in our [documentation](#documentation).\n\n#### 3.6.1 Disable Crash Reporting\nThe HockeySDK enables crash reporting **per default**. Crashes will be immediately sent to the server the next time the app is launched.\n\nTo provide you with the best crash reporting, we are using a build of [PLCrashReporter](\"https://github.com/plausiblelabs/plcrashreporter\") based on [Version 1.2.1 / Commit 356901d7f3ca3d46fbc8640f469304e2b755e461](\"https://github.com/plausiblelabs/plcrashreporter/commit/356901d7f3ca3d46fbc8640f469304e2b755e461\").\n\nThis feature can be disabled as follows:\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager] setDisableCrashManager: YES]; //disable crash reporting\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().isCrashManagerDisabled = true\nBITHockeyManager.shared().start()\n```\n#### 3.6.2 Auto send crash reports\n\nCrashes are send the next time the app starts. If `crashManagerStatus` is set to `BITCrashManagerStatusAutoSend`, crashes will be send without any user interaction, otherwise an alert will appear allowing the users to decide whether they want to send the report or not.\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager].crashManager setCrashManagerStatus: BITCrashManagerStatusAutoSend];\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().crashManager.crashManagerStatus = BITCrashManagerStatus.autoSend\nBITHockeyManager.shared().start()\n```\n\nThe SDK is not sending the reports right when the crash happens deliberately, because if is not safe to implement such a mechanism while being async-safe (any Objective-C code is _NOT_ async-safe!) and not causing more danger like a deadlock of the device, than helping. We found that users do start the app again because most don't know what happened, and you will get by far most of the reports.\n\nSending the reports on start-up is done asynchronously (non-blocking). This is the only safe way to ensure that the app won't be possibly killed by the iOS watchdog process, because start-up could take too long and the app could not react to any user input when network conditions are bad or connectivity might be very slow.\n\n#### 3.6.3 Mach Exception Handling\n\nBy default the SDK is using the safe and proven in-process BSD Signals for catching crashes. This option provides an option to enable catching fatal signals via a Mach exception server instead.\n\nWe strongly advise _NOT_ to enable Mach exception handler in release versions of your apps!\n\n*Warning:* The Mach exception handler executes in-process, and will interfere with debuggers when they attempt to suspend all active threads (which will include the Mach exception handler). Mach-based handling should _NOT_ be used when a debugger is attached. The SDK will not enable catching exceptions if the app is started with the debugger running. If you attach the debugger during runtime, this may cause issues the Mach exception handler is enabled!\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager].crashManager setEnableMachExceptionHandler: YES];\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().crashManager.isMachExceptionHandlerEnabled = true\nBITHockeyManager.shared().start()\n```\n\n#### 3.6.4 Attach additional data\n\nThe `BITHockeyManagerDelegate` protocol provides methods to add additional data to a crash report:\n\n1. UserID:\n\n**Objective-C**\n\n`- (NSString *)userIDForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;`\n\n**Swift**\n\n`optional public func userID(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!`\n\n2. UserName:\n\n**Objective-C**\n\n`- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;`\n\n**Swift**\n\n`optional public func userName(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!`\n\n3. UserEmail:\n\n**Objective-C**\n\n`- (NSString *)userEmailForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager;`\n\n**Swift**\n\n`optional public func userEmail(for hockeyManager: BITHockeyManager!, componentManager: BITHockeyBaseManager!) -> String!`\n\nThe `BITCrashManagerDelegate` protocol (which is automatically included in `BITHockeyManagerDelegate`) provides methods to add more crash specific data to a crash report:\n\n1. Text attachments: \n\n**Objective-C**\n\n`-(NSString *)applicationLogForCrashManager:(BITCrashManager *)crashManager`\n\n**Swift**\n\n`optional public func applicationLog(for crashManager: BITCrashManager!) -> String!`\n\n  Check the following tutorial for an example on how to add CocoaLumberjack log data: [How to Add Application Specific Log Data on iOS or OS X](http://support.hockeyapp.net/kb/client-integration-ios-mac-os-x/how-to-add-application-specific-log-data-on-ios-or-os-x)\n2. Binary attachments: \n\n**Objective-C**\n\n`-(BITHockeyAttachment *)attachmentForCrashManager:(BITCrashManager *)crashManager`\n\n**Swift**\n\n`optional public func attachment(for crashManager: BITCrashManager!) -> BITHockeyAttachment!`\n\nMake sure to implement the protocol\n\n**Objective-C**\n\n```objc\n@interface YourAppDelegate () <BITHockeyManagerDelegate> {}\n\n@end\n```\n\n**Swift**\n\n```swift\nclass YourAppDelegate: BITHockeyManagerDelegate {\n\n}\n```\n\nand set the delegate:\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager] setDelegate: self];\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().delegate = self\nBITHockeyManager.shared().start()\n```\n\n<a name=\"user-metrics\"></a>\n### 3.7 User Metrics\n\nHockeyApp automatically provides you with nice, intelligible, and informative metrics about how your app is used and by whom. \n\n- **Sessions**: A new session is tracked by the SDK whenever the containing app is restarted (this refers to a 'cold start', i.e., when the app has not already been in memory prior to being launched) or whenever it becomes active again after having been in the background for 20 seconds or more.\n- **Users**: The SDK anonymously tracks the users of your app by creating a random UUID that is then securely stored in the iOS keychain. This anonymous ID is stored in the keychain, as of iOS 10, it no longer persists across re-installations.\n- **Custom Events**: With HockeySDK 4.1.0 and later, you can now track Custom Events in your app, understand user actions and see the aggregates on the HockeyApp portal.\n- **Batching & offline behavior**: The SDK batches up to 50 events or waits for 15s and then persist and send the events, whichever comes first. So for sessions, this might actually mean we send 1 single event per batch. If you are sending Custom Events, it can be 1 session event plus X of your Custom Events (up to 50 events per batch total). In case the device is offline, up to 300 events are stored until the SDK starts to drop new events.\n\nJust in case you want to opt-out of the automatic collection of anonymous users and sessions statistics, there is a way to turn this functionality off at any time:\n\n**Objective-C**\n\n```objc\n[BITHockeyManager sharedHockeyManager].disableMetricsManager = YES;\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().isMetricsManagerDisabled = true\n```\n\n#### 3.7.1 Custom Events\n\nBy tracking custom events, you can now get insight into how your customers use your app, understand their behavior and answer important business or user experience questions while improving your app.\n\n- Before starting to track events, ask yourself the questions that you want to get answers to. For instance, you might be interested in business, performance/quality or user experience aspects.\n- Name your events in a meaningful way and keep in mind that you will use these names when searching for events in the HockeyApp web portal. It is your responsibility to not collect personal information as part of the events tracking.\n\n**Objective-C**\n\n```objc\nBITMetricsManager *metricsManager = [BITHockeyManager sharedHockeyManager].metricsManager;\n\n[metricsManager trackEventWithName:eventName]\n```\n\n**Swift**\n\n```swift\nlet metricsManager = BITHockeyManager.shared().metricsManager\n\nmetricsManager.trackEvent(withName: eventName)\n```\n\n**Limitations**\n\n- Accepted characters for tracking events are: [a-zA-Z0-9_. -]. If you use other than the accepted characters, your events will not show up in the HockeyApp web portal.\n- There is currently a limit of 300 unique event names per app per week.\n- There is _no_ limit on the number of times an event can happen.\n\n#### 3.7.2 Attaching custom properties and measurements to a custom event\n\nIt's possible to attach properties and/or measurements to a custom event. There is one limitation to attaching properties and measurements. They currently don't show up in the HockeyApp dashboard but you have to link your app to Application Insights to be able to query them. Please have a look at [our blog post](https://www.hockeyapp.net/blog/2016/08/30/custom-events-public-preview.html) to find out how to do that. \n\n- Properties have to be a string.\n- Measurements have to be of a numeric type.\n\n**Objective-C**\n\n```objc\nBITMetricsManager *metricsManager = [BITHockeyManager sharedHockeyManager].metricsManager;\n\nNSDictionary *myProperties = @{@\"Property 1\" : @\"Something\",\n                               @\"Property 2\" : @\"Other thing\",\n                               @\"Property 3\" : @\"Totally different thing\"};\nNSDictionary *myMeasurements = @{@\"Measurement 1\" : @1,\n                                 @\"Measurement 2\" : @2.34,\n                                 @\"Measurement 3\" : @2000000};\n\n[metricsManager trackEventWithName:eventName properties:myProperties measurements:myMeasurements]\n```\n\n**Swift**\n\n```swift\nlet myProperties = [\"Property 1\": \"Something\", \"Property 2\": \"Other thing\", \"Property 3\" : \"Totally different thing.\"]\nlet myMeasurements = [\"Measurement 1\": 1, \"Measurement 2\": 2.3, \"Measurement 3\" : 30000]\n      \nlet metricsManager = BITHockeyManager.shared().metricsManager\nmetricsManager.trackEvent(withName: eventName, properties: myProperties, measurements: myMeasurements)\n```\n\n<a name=\"feedback\"></a>\n### 3.8 Feedback\n\nAs of HockeySDK 4.1.1, Feedback is no longer part of the default SDK. To use feedback in your app, integrate the SDK with all features as follows:\n\n#### 3.8.1 Integrate the full-featured SDK.\n\nIf you're integrating the binary yourself, use the `HockeySDK.embeddedframework` in the subfolder `HockeySDKAllFeatures`. If you're using CocoaPods, use\n\n```ruby\npod \"HockeySDK\", :subspecs => ['AllFeaturesLib']\n```\n\nin your podfile.\n\n`BITFeedbackManager` lets your users communicate directly with you via the app and an integrated user interface. It provides a single threaded discussion with a user running your app. This feature is only enabled if you integrate the actual view controllers into your app.\n \nYou should never create your own instance of `BITFeedbackManager` but use the one provided by the `[BITHockeyManager sharedHockeyManager]`:\n\n**Objective-C**\n\n```objc\n[BITHockeyManager sharedHockeyManager].feedbackManager\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().feedbackManager\n```\n\nPlease check the [documentation](#documentation) of the `BITFeedbackManager` and `BITFeedbackManagerDelegate` classes on more information on how to leverage this feature.\n\n#### 3.8.2 Add the NSPhotoLibraryUsageDescription to your Info.plist.\n\nAs of iOS 10, developers have to add UsageDescription-strings before using system frameworks with privacy features (read more on this in [Apple's own documentation](https://developer.apple.com/library/prerelease/content/releasenotes/General/WhatsNewIniOS/Articles/iOS10.html#//apple_ref/doc/uid/TP40017084-SW3)). To make allow users to attach photos to feedback, add the `NSPhotoLibraryUsageDescription` to your `Info.plist` and provide a description. Make sure to localize your description as described in [Apple's documentation about localizing Info.plist strings](https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html).\n\nIf the value is missing from your `Info.plist`, the SDK will disable attaching photos to feedback and disable the creation of a new feedback item in case of a screenshot. \n\n\n<a name=\"storeupdates\"></a>\n### 3.9 Store Updates\n\nThis is the HockeySDK module for handling app updates when having your app released in the App Store.\n\nWhen an update is detected, this module will show an alert asking the user if he/she wants to update or ignore this version. If the update was chosen, it will open the apps page in the app store app.\n\nBy default this module is **NOT** enabled! To enable it use the following code:\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager] setEnableStoreUpdateManager: YES];\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().isStoreUpdateManagerEnabled = true\nBITHockeyManager.shared().start()\n```\n\nWhen this module is enabled and **NOT** running in an App Store build/environment, it won't do any checks!\n\nPlease check the [documentation](#documentation) of the `BITStoreUpdateManager` class on more information on how to leverage this feature and know about its limits.\n\n<a name=\"betaupdates\"></a>\n### 3.10 In-App-Updates (Beta & Enterprise only)\n\nThe following options only show some of the possibilities to interact and fine-tune the update feature when using Ad-Hoc or Enterprise provisioning profiles. For more please check the full documentation of the `BITUpdateManager` class in our [documentation](#documentation).\n\nThe feature handles version updates, presents the update and version information in a App Store like user interface, collects usage information and provides additional authorization options when using Ad-Hoc provisioning profiles.\n\nThis module automatically disables itself when running in an App Store build by default!\n\nThis feature can be disabled manually as follows:\n\n**Objective-C**\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[[BITHockeyManager sharedHockeyManager] setDisableUpdateManager: YES]; //disable auto updating\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n**Swift**\n\n```swift\nBITHockeyManager.shared().configure(withIdentifier: \"APP_IDENTIFIER\")\nBITHockeyManager.shared().isUpdateManagerDisabled = true\nBITHockeyManager.shared().start()\n```\n\nPlease note that the SDK expects your CFBundleVersion values to always increase and never reset to detect a new update.\n\nIf you want to see beta analytics, use the beta distribution feature with in-app updates, restrict versions to specific users, or want to know who is actually testing your app, you need to follow the instructions on our guide [Authenticating Users on iOS](http://support.hockeyapp.net/kb/client-integration-ios-mac-os-x/authenticating-users-on-ios)\n\n<a id=\"debug\"></a>\n### 3.11 Debug information\n\nTo check if data is send properly to HockeyApp and also see some additional SDK debug log data in the console, add the following line before `startManager`:\n\n```objc\n[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@\"APP_IDENTIFIER\"];\n\n[BITHockeyManager sharedHockeyManager].logLevel = BITLogLevelDebug;\n\n[[BITHockeyManager sharedHockeyManager] startManager];\n```\n\n<a id=\"documentation\"></a>\n## 4. Documentation\n\nOur documentation can be found on [HockeyApp](http://hockeyapp.net/help/sdk/ios/5.1.2/index.html).\n\n<a id=\"troubleshooting\"></a>\n## 5.Troubleshooting\n\n### Linker warnings\n\n  Make sure that all mentioned frameworks and libraries are linked\n\n### iTunes Connect rejection\n\n  Make sure none of the following files are copied into your app bundle, check under app target, `Build Phases`, `Copy Bundle Resources` or in the `.app` bundle after building:\n\n  - `HockeySDK.framework` (except if you build a dynamic framework version of the SDK yourself!)\n  - `de.bitstadium.HockeySDK-iOS-5.1.2.docset`\n\n### Features are not working as expected\n\n  Enable debug output to the console to see additional information from the SDK initializing the modules,  sending and receiving network requests and more by adding the following code before calling `startManager`:\n\n  `[BITHockeyManager sharedHockeyManager].logLevel = BITLogLevelDebug;`\n\n### Wrong strings or \"Missing HockeySDKResources.bundle\" error\n\n1. Please check if the `HockeySDKResources.bundle` is added to your app bundle. Use Finder to inspect your `.app` bundle to see if the bundle is added.\n    \n2. If it is missing, please check if the resources bundle is mentioned in your app target's `Copy Bundle Resources` build step in the `Build Phases` tab. Add the resource bundle manually if necessary.  \n\n3. Make a clean build and try again.\n    \n![Screenshot_2015-12-22_01.07.27.png](https://support.hockeyapp.net/help/assets/0e9d2eb58de8355363b89bd491d6fcf4c14f596e/normal/Screenshot_2015-12-22_01.07.27.png)\n    \n<a id=\"contributing\"></a>\n## 6. Contributing\n\nWe're looking forward to your contributions via pull requests on our [GitHub repository](https://github.com/bitstadium/HockeySDK-iOS).\n\n<a id=\"developmentenvironment\"></a>\n### 6.1 Development environment\n\n* A Mac running the latest version of macOS.\n* Get the latest Xcode from the Mac App Store.\n* [Jazzy](https://github.com/realm/jazzy) to generate documentation.\n* [CocoaPods](https://cocoapods.org/) to test integration with CocoaPods.\n* [Carthage](https://github.com/Carthage/Carthage) to test integration with Carthage.\n\n<a id=\"codeofconduct\"></a>\n### 6.2 Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n<a id=\"contributorlicense\"></a>\n### 6.3 Contributor License\n\nYou must sign a [Contributor License Agreement](https://cla.microsoft.com/) before submitting your pull request. To complete the Contributor License Agreement (CLA), you will need to submit a request via the [form](https://cla.microsoft.com/) and then electronically sign the CLA when you receive the email containing the link to the document. You need to sign the CLA only once to cover submission to any Microsoft OSS project. \n\n<a id=\"contact\"></a>\n## 7. Contact\n\nIf you have further questions or are running into trouble that cannot be resolved by any of the steps here, feel free to open [a GitHub issue](https://github.com/bitstadium/HockeySDK-iOS/issues), contact us at [support@hockeyapp.net](mailto:support@hockeyapp.net) or join our [Slack](https://slack.hockeyapp.net).\n"
  },
  {
    "path": "Pods/JGMethodSwizzler/JGMethodSwizzler/JGMethodSwizzler.h",
    "content": "//\n//  JGMethodSwizzler.h\n//  JGMethodSwizzler\n//\n//  Created by Jonas Gessner 22.08.2013\n//  Copyright (c) 2013 Jonas Gessner. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n\n\n//-------------\n/* typedefs */\n//-------------\n\ntypedef void *(* JG_IMP)(__unsafe_unretained id, SEL, ...);\n\ntypedef id (^JGMethodReplacementProvider)(JG_IMP original, __unsafe_unretained Class swizzledClass, SEL selector);\n\n\n\n\n\n//----------------\n/* Deswizzling */\n//----------------\n\n/**\n Deswizzle all methods that have been swizzled accross all instances.\n \n @return \\c YES if any methods have been deswizzled successfully.\n */\n\nOBJC_EXTERN BOOL deswizzleGlobal(void);\n\n\n/**\n Deswizzle all methods that have been swizzled for specific instances.\n \n @return \\c YES if any methods have been deswizzled successfully.\n */\n\nOBJC_EXTERN BOOL deswizzleInstances(void);\n\n\n/**\n Deswizzle all methods.\n \n @return \\c YES if any methods have been deswizzled successfully.\n */\n\nOBJC_EXTERN BOOL deswizzleAll(void);\n\n\n//-----------------\n/* Helper macros */\n//-----------------\n\n#define JGMethodReplacement(returntype, selftype, ...) ^ returntype (__unsafe_unretained selftype self, ##__VA_ARGS__)\n#define JGMethodReplacementProviderBlock ^ id (JG_IMP original, __unsafe_unretained Class swizzledClass, SEL _cmd)\n#define JGOriginalImplementation(type, ...) ((__typeof(type (*)(__typeof(self), SEL, ...)))original)(self, _cmd, ##__VA_ARGS__)\n\n\n\n//---------------------------------------\n/** @name Super easy method swizzling */\n//---------------------------------------\n\n@interface NSObject (JGMethodSwizzler)\n\n\n/**\n Swizzle the specified class method.\n \n @param selector Selector of the method to swizzle.\n @param replacement The replacement block to use for swizzling the method. Its signature needs to be: return_type ^(id self, ...).\n \n */\n\n+ (void)swizzleClassMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider;\n\n\n/**\n Swizzle the specified instance method.\n \n @param selector Selector of the method to swizzle.\n @param replacement The replacement block to use for swizzling the method. Its signature needs to be: return_type ^(id self, ...).\n \n */\n\n+ (void)swizzleInstanceMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider;\n\n@end\n\n\n\n\n//---------------------------------------\n/** @name Super easy method swizzling */\n//---------------------------------------\n\n@interface NSObject (JGMethodDeSwizzler)\n\n/**\n Restore the specified class method by removing all swizzles.\n \n @param selector Selector of the swizzled method.\n \n @return \\c YES if the method was successfully restored, \\c NO if the method has never been swizzled.\n \n */\n\n+ (BOOL)deswizzleClassMethod:(SEL)selector;\n\n\n\n\n/**\n Restore the specified class method by removing all swizzles.\n \n @param selector Selector of the swizzled method.\n \n @return \\c YES if the method was successfully restored, \\c NO if the method has never been swizzled.\n \n */\n\n+ (BOOL)deswizzleInstanceMethod:(SEL)selector;\n\n\n\n\n\n/**\n Restore all swizzled class methods.\n \n @return \\c YES if the method was successfully restored, \\c NO if no method has never been swizzled\n \n */\n\n+ (BOOL)deswizzleAllClassMethods;\n\n\n\n/**\n Restore all swizzled instance methods.\n \n @return \\c YES if the method was successfully restored, \\c NO if no method has never been swizzled.\n \n */\n\n+ (BOOL)deswizzleAllInstanceMethods;\n\n\n\n\n/**\n Restore all swizzled class and instance methods.\n \n @return \\c YES if the method was successfully restored, \\c NO if no method has never been swizzled.\n \n */\n\n+ (BOOL)deswizzleAllMethods;\n\n@end\n\n\n\n\n\n\n//-------------------------------------------------------------\n/** @name Super easy method swizzling on specific instances */\n//-------------------------------------------------------------\n\n\n@interface NSObject (JGInstanceSwizzler)\n\n/**\n Swizzle the specified instance method on this specific instance only.\n \n @param selector Selector of the method to swizzle.\n @param replacement The replacement block to use for swizzling the method. Its signature needs to be: return_type ^(id self, ...).\n \n */\n- (void)swizzleMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider;\n\n\n\n/**\n Restore the specified method by removing all swizzles.\n \n @param selector Selector of the swizzled method.\n \n @return \\c YES if the method was successfully restored, \\c NO if the method has never been swizzled.\n \n */\n\n- (BOOL)deswizzleMethod:(SEL)selector;\n\n\n\n/**\n Restore all swizzled methods.\n \n @return \\c YES if the method was successfully restored, \\c NO if no method has never been swizzled.\n \n */\n\n- (BOOL)deswizzle;\n\n\n@end\n\n\n"
  },
  {
    "path": "Pods/JGMethodSwizzler/JGMethodSwizzler/JGMethodSwizzler.m",
    "content": "//\n//  JGMethodSwizzler.m\n//  JGMethodSwizzler\n//\n//  Created by Jonas Gessner 22.08.2013\n//  Copyright (c) 2013 Jonas Gessner. All rights reserved.\n//\n\n#import \"JGMethodSwizzler.h\"\n\n#import <objc/runtime.h>\n#import <libkern/OSAtomic.h>\n\n\n#pragma mark Defines\n\n#ifdef __clang__\n#if __has_feature(objc_arc)\n#define JG_ARC_ENABLED\n#endif\n#endif\n\n#ifdef JG_ARC_ENABLED\n#define JGBridgeCast(type, obj) ((__bridge type)obj)\n#define releaseIfNecessary(object)\n#else\n#define JGBridgeCast(type, obj) ((type)obj)\n#define releaseIfNecessary(object) [object release];\n#endif\n\n\n#define kClassKey @\"k\"\n#define kCountKey @\"c\"\n#define kIMPKey @\"i\"\n\n// See http://clang.llvm.org/docs/Block-ABI-Apple.html#high-level\nstruct Block_literal_1 {\n    void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock\n    int flags;\n    int reserved;\n    void (*invoke)(void *, ...);\n    struct Block_descriptor_1 {\n        unsigned long int reserved;         // NULL\n        unsigned long int size;         // sizeof(struct Block_literal_1)\n        // optional helper functions\n        void (*copy_helper)(void *dst, void *src);     // IFF (1<<25)\n        void (*dispose_helper)(void *src);             // IFF (1<<25)\n        // required ABI.2010.3.16\n        const char *signature;                         // IFF (1<<30)\n    } *descriptor;\n    // imported variables\n};\n\nenum {\n    BLOCK_HAS_COPY_DISPOSE =  (1 << 25),\n    BLOCK_HAS_CTOR =          (1 << 26), // helpers have C++ code\n    BLOCK_IS_GLOBAL =         (1 << 28),\n    BLOCK_HAS_STRET =         (1 << 29), // IFF BLOCK_HAS_SIGNATURE\n    BLOCK_HAS_SIGNATURE =     (1 << 30),\n};\ntypedef int BlockFlags;\n\n\n\n#pragma mark - Block Analysis\n\nNS_INLINE const char *blockGetType(id block) {\n    struct Block_literal_1 *blockRef = JGBridgeCast(struct Block_literal_1 *, block);\n    BlockFlags flags = blockRef->flags;\n    \n    if (flags & BLOCK_HAS_SIGNATURE) {\n        void *signatureLocation = blockRef->descriptor;\n        signatureLocation += sizeof(unsigned long int);\n        signatureLocation += sizeof(unsigned long int);\n        \n        if (flags & BLOCK_HAS_COPY_DISPOSE) {\n            signatureLocation += sizeof(void(*)(void *dst, void *src));\n            signatureLocation += sizeof(void (*)(void *src));\n        }\n        \n        const char *signature = (*(const char **)signatureLocation);\n        return signature;\n    }\n    \n    return NULL;\n}\n\nNS_INLINE BOOL blockIsCompatibleWithMethodType(id block, __unsafe_unretained Class class, SEL selector, BOOL instanceMethod) {\n    const char *blockType = blockGetType(block);\n    \n    NSMethodSignature *blockSignature = [NSMethodSignature signatureWithObjCTypes:blockType];\n    NSMethodSignature *methodSignature = (instanceMethod ? [class instanceMethodSignatureForSelector:selector] : [class methodSignatureForSelector:selector]);\n    \n    if (!blockSignature || !methodSignature) {\n        return NO;\n    }\n    \n    if (blockSignature.numberOfArguments != methodSignature.numberOfArguments) {\n        return NO;\n    }\n    const char *blockReturnType = blockSignature.methodReturnType;\n    \n    if (strncmp(blockReturnType, \"@\", 1) == 0) {\n        blockReturnType = \"@\";\n    }\n    \n    if (strcmp(blockReturnType, methodSignature.methodReturnType) != 0) {\n        return NO;\n    }\n    \n    for (unsigned int i = 0; i < methodSignature.numberOfArguments; i++) {\n        if (i == 0) {\n            // self in method, block in block\n            if (strcmp([methodSignature getArgumentTypeAtIndex:i], \"@\") != 0) {\n                return NO;\n            }\n            if (strcmp([blockSignature getArgumentTypeAtIndex:i], \"@?\") != 0) {\n                return NO;\n            }\n        }\n        else if(i == 1) {\n            // SEL in method, self in block\n            if (strcmp([methodSignature getArgumentTypeAtIndex:i], \":\") != 0) {\n                return NO;\n            }\n            if (instanceMethod ? strncmp([blockSignature getArgumentTypeAtIndex:i], \"@\", 1) != 0 : (strncmp([blockSignature getArgumentTypeAtIndex:i], \"@\", 1) != 0 && strcmp([blockSignature getArgumentTypeAtIndex:i], \"r^#\") != 0)) {\n                return NO;\n            }\n        }\n        else {\n            const char *blockSignatureArg = [blockSignature getArgumentTypeAtIndex:i];\n            \n            if (strncmp(blockSignatureArg, \"@\", 1) == 0) {\n                blockSignatureArg = \"@\";\n            }\n            \n            if (strcmp(blockSignatureArg, [methodSignature getArgumentTypeAtIndex:i]) != 0) {\n                return NO;\n            }\n        }\n    }\n    \n    return YES;\n}\n\nNS_INLINE BOOL blockIsValidReplacementProvider(id block) {\n    const char *blockType = blockGetType(block);\n    \n    JGMethodReplacementProvider dummy = JGMethodReplacementProviderBlock {\n        return nil;\n    };\n    \n    const char *expectedType = blockGetType(dummy);\n    \n    return (strcmp(expectedType, blockType) == 0);\n}\n\n\n\nNS_INLINE void classSwizzleMethod(Class cls, Method method, IMP newImp) {\n\tif (!class_addMethod(cls, method_getName(method), newImp, method_getTypeEncoding(method))) {\n\t\t// class already has implementation, swizzle it instead\n\t\tmethod_setImplementation(method, newImp);\n\t}\n}\n\n\n\n\n\n#pragma mark - Original Implementations\n\nstatic OSSpinLock lock = OS_SPINLOCK_INIT;\n\nstatic NSMutableDictionary *originalClassMethods;\nstatic NSMutableDictionary *originalInstanceMethods;\nstatic NSMutableDictionary *originalInstanceInstanceMethods;\n\nNS_INLINE JG_IMP originalClassMethodImplementation(__unsafe_unretained Class class, SEL selector, BOOL fetchOnly) {\n    NSCAssert(!OSSpinLockTry(&lock), @\"Spin lock is not locked\");\n    \n    if (!originalClassMethods) {\n        originalClassMethods = [[NSMutableDictionary alloc] init];\n    }\n    \n    NSString *classKey = NSStringFromClass(class);\n    NSString *selectorKey = NSStringFromSelector(selector);\n    \n    NSMutableDictionary *classSwizzles = originalClassMethods[classKey];\n    \n    NSValue *pointerValue = classSwizzles[selectorKey];\n    \n    if (!classSwizzles) {\n        classSwizzles = [NSMutableDictionary dictionary];\n        \n        originalClassMethods[classKey] = classSwizzles;\n    }\n    \n    JG_IMP orig = NULL;\n    \n    if (pointerValue) {\n        orig = [pointerValue pointerValue];\n        \n        if (fetchOnly) {\n            if (classSwizzles.count == 1) {\n                [originalClassMethods removeObjectForKey:classKey];\n            }\n            else {\n                [classSwizzles removeObjectForKey:selectorKey];\n            }\n        }\n    }\n    else if (!fetchOnly) {\n        orig = (JG_IMP)[class methodForSelector:selector];\n        \n        classSwizzles[selectorKey] = [NSValue valueWithPointer:orig];\n    }\n\n    if (classSwizzles.count == 0) {\n        [originalClassMethods removeObjectForKey:classKey];\n    }\n    \n    if (originalClassMethods.count == 0) {\n        releaseIfNecessary(originalClassMethods);\n        originalClassMethods = nil;\n    }\n    \n    return orig;\n}\n\n\n\n\nNS_INLINE JG_IMP originalInstanceMethodImplementation(__unsafe_unretained Class class, SEL selector, BOOL fetchOnly) {\n    NSCAssert(!OSSpinLockTry(&lock), @\"Spin lock is not locked\");\n    \n    if (!originalInstanceMethods) {\n        originalInstanceMethods = [[NSMutableDictionary alloc] init];\n    }\n    \n    NSString *classKey = NSStringFromClass(class);\n    NSString *selectorKey = NSStringFromSelector(selector);\n    \n    NSMutableDictionary *classSwizzles = originalInstanceMethods[classKey];\n    \n    NSValue *pointerValue = classSwizzles[selectorKey];\n    \n    if (!classSwizzles) {\n        classSwizzles = [NSMutableDictionary dictionary];\n        \n        originalInstanceMethods[classKey] = classSwizzles;\n    }\n    \n    JG_IMP orig = NULL;\n    \n    if (pointerValue) {\n        orig = [pointerValue pointerValue];\n        \n        if (fetchOnly) {\n            [classSwizzles removeObjectForKey:selectorKey];\n            if (classSwizzles.count == 0) {\n                [originalInstanceMethods removeObjectForKey:classKey];\n            }\n        }\n    }\n    else if (!fetchOnly) {\n        orig = (JG_IMP)[class instanceMethodForSelector:selector];\n        \n        classSwizzles[selectorKey] = [NSValue valueWithPointer:orig];\n    }\n    \n    if (classSwizzles.count == 0) {\n        [originalInstanceMethods removeObjectForKey:classKey];\n    }\n    \n    if (originalInstanceMethods.count == 0) {\n        releaseIfNecessary(originalInstanceMethods);\n        originalInstanceMethods = nil;\n    }\n    \n    return orig;\n}\n\n\n\n\n\nNS_INLINE JG_IMP originalInstanceInstanceMethodImplementation(__unsafe_unretained Class class, SEL selector, BOOL fetchOnly) {\n    NSCAssert(!OSSpinLockTry(&lock), @\"Spin lock is not locked\");\n    \n    if (!originalInstanceInstanceMethods) {\n        originalInstanceInstanceMethods = [[NSMutableDictionary alloc] init];\n    }\n    \n    NSString *classKey = NSStringFromClass(class);\n    NSString *selectorKey = NSStringFromSelector(selector);\n    \n    NSMutableDictionary *instanceSwizzles = originalInstanceInstanceMethods[classKey];\n    \n    if (!instanceSwizzles) {\n        instanceSwizzles = [NSMutableDictionary dictionary];\n        \n        originalInstanceInstanceMethods[classKey] = instanceSwizzles;\n    }\n    \n    JG_IMP orig = NULL;\n\n    if (fetchOnly) {\n        NSMutableDictionary *dict = instanceSwizzles[selectorKey];\n        if (!dict) {\n            return NULL;\n        }\n        NSValue *pointerValue = dict[kIMPKey];\n        orig = [pointerValue pointerValue];\n        unsigned int count = [dict[kCountKey] unsignedIntValue];\n        if (count == 1) {\n            [instanceSwizzles removeObjectForKey:selectorKey];\n            if (instanceSwizzles.count == 0) {\n                [originalInstanceInstanceMethods removeObjectForKey:classKey];\n            }\n        }\n        else {\n            dict[kCountKey] = @(count-1);\n        }\n    }\n    else {\n        NSMutableDictionary *dict = instanceSwizzles[selectorKey];\n        if (!dict) {\n            dict = [NSMutableDictionary dictionaryWithCapacity:2];\n            dict[kCountKey] = @(1);\n            \n            orig = (JG_IMP)[class instanceMethodForSelector:selector];\n            dict[kIMPKey] = [NSValue valueWithPointer:orig];\n            \n            instanceSwizzles[selectorKey] = dict;\n        }\n        else {\n            orig = [dict[kIMPKey] pointerValue];\n            \n            unsigned int count = [dict[kCountKey] unsignedIntValue];\n            dict[kCountKey] = @(count+1);\n        }\n    }\n    \n    if (originalInstanceInstanceMethods.count == 0) {\n        releaseIfNecessary(originalInstanceInstanceMethods);\n        originalInstanceInstanceMethods = nil;\n    }\n    \n    return orig;\n}\n\n\n#pragma mark - Deswizzling Global Swizzles\n\n\nNS_INLINE BOOL deswizzleClassMethod(__unsafe_unretained Class class, SEL selector) {\n    OSSpinLockLock(&lock);\n    \n    JG_IMP originalIMP = originalClassMethodImplementation(class, selector, YES);\n    \n    if (originalIMP) {\n        method_setImplementation(class_getClassMethod(class, selector), (IMP)originalIMP);\n        OSSpinLockUnlock(&lock);\n        return YES;\n    }\n    else {\n        OSSpinLockUnlock(&lock);\n        return NO;\n    }\n}\n\n\nNS_INLINE BOOL deswizzleInstanceMethod(__unsafe_unretained Class class, SEL selector) {\n    OSSpinLockLock(&lock);\n    \n    JG_IMP originalIMP = originalInstanceMethodImplementation(class, selector, YES);\n    \n    if (originalIMP) {\n        method_setImplementation(class_getInstanceMethod(class, selector), (IMP)originalIMP);\n        OSSpinLockUnlock(&lock);\n        return YES;\n    }\n    else {\n        OSSpinLockUnlock(&lock);\n        return NO;\n    }\n}\n\n\nNS_INLINE BOOL deswizzleAllClassMethods(__unsafe_unretained Class class) {\n    OSSpinLockLock(&lock);\n    BOOL success = NO;\n    NSDictionary *d = [originalClassMethods[NSStringFromClass(class)] copy];\n    for (NSString *sel in d) {\n        OSSpinLockUnlock(&lock);\n        if (deswizzleClassMethod(class, NSSelectorFromString(sel))) {\n            success = YES;\n        }\n        OSSpinLockLock(&lock);\n    }\n    OSSpinLockUnlock(&lock);\n    releaseIfNecessary(d);\n    return success;\n}\n\n\nNS_INLINE BOOL deswizzleAllInstanceMethods(__unsafe_unretained Class class) {\n    OSSpinLockLock(&lock);\n    BOOL success = NO;\n    NSDictionary *d = [originalInstanceMethods[NSStringFromClass(class)] copy];\n    for (NSString *sel in d) {\n        OSSpinLockUnlock(&lock);\n        if (deswizzleInstanceMethod(class, NSSelectorFromString(sel))) {\n            success = YES;\n        }\n        OSSpinLockLock(&lock);\n    }\n    OSSpinLockUnlock(&lock);\n    releaseIfNecessary(d);\n    return success;\n}\n\n\n#pragma mark - Global Swizzling\n\nNS_INLINE void swizzleClassMethod(__unsafe_unretained Class class, SEL selector, JGMethodReplacementProvider replacement) {\n    NSCAssert(blockIsValidReplacementProvider(replacement), @\"Invalid method replacemt provider\");\n    \n    NSCAssert([class respondsToSelector:selector], @\"Invalid method: +[%@ %@]\", NSStringFromClass(class), NSStringFromSelector(selector));\n    \n    OSSpinLockLock(&lock);\n    \n    Method originalMethod = class_getClassMethod(class, selector);\n    \n    JG_IMP orig = originalClassMethodImplementation(class, selector, NO);\n    \n    id replaceBlock = replacement(orig, class, selector);\n    \n    NSCAssert(blockIsCompatibleWithMethodType(replaceBlock, class, selector, NO), @\"Invalid method replacement\");\n    \n    Class meta = object_getClass(class);\n    \n    classSwizzleMethod(meta, originalMethod, imp_implementationWithBlock(replaceBlock));\n    \n    OSSpinLockUnlock(&lock);\n}\n\n\nNS_INLINE void swizzleInstanceMethod(__unsafe_unretained Class class, SEL selector, JGMethodReplacementProvider replacement) {\n    NSCAssert(blockIsValidReplacementProvider(replacement), @\"Invalid method replacemt provider\");\n    \n    NSCAssert([class instancesRespondToSelector:selector], @\"Invalid method: -[%@ %@]\", NSStringFromClass(class), NSStringFromSelector(selector));\n    \n    NSCAssert(originalInstanceInstanceMethods[NSStringFromClass(class)][NSStringFromSelector(selector)] == nil, @\"Swizzling an instance method that has already been swizzled on a specific instance is not supported\");\n    \n    OSSpinLockLock(&lock);\n    \n    Method originalMethod = class_getInstanceMethod(class, selector);\n    \n    JG_IMP orig = originalInstanceMethodImplementation(class, selector, NO);\n    \n    id replaceBlock = replacement(orig, class, selector);\n    \n    NSCAssert(blockIsCompatibleWithMethodType(replaceBlock, class, selector, YES), @\"Invalid method replacement\");\n    \n    IMP replace = imp_implementationWithBlock(replaceBlock);\n    \n    classSwizzleMethod(class, originalMethod, replace);\n    \n    OSSpinLockUnlock(&lock);\n}\n\n\n\n\n#pragma mark - Instance Specific Swizzling & Deswizzling\n\nstatic NSMutableDictionary *dynamicSubclassesByObject;\n\nNS_INLINE unsigned int swizzleCount(__unsafe_unretained id object) {\n    NSValue *key = [NSValue valueWithPointer:JGBridgeCast(const void *, object)];\n    \n    unsigned int count = [dynamicSubclassesByObject[key][kCountKey] unsignedIntValue];\n    \n    return count;\n}\n\nNS_INLINE void decreaseSwizzleCount(__unsafe_unretained id object) {\n    NSValue *key = [NSValue valueWithPointer:JGBridgeCast(const void *, object)];\n    \n    NSMutableDictionary *classDict = dynamicSubclassesByObject[key];\n    \n    unsigned int count = [classDict[kCountKey] unsignedIntValue];\n    \n    classDict[kCountKey] = @(count-1);\n}\n\nNS_INLINE BOOL deswizzleInstance(__unsafe_unretained id object) {\n    OSSpinLockLock(&lock);\n    \n    BOOL success = NO;\n    \n    if (swizzleCount(object) > 0) {\n        Class dynamicSubclass = object_getClass(object);\n        \n        object_setClass(object, [object class]);\n        \n        objc_disposeClassPair(dynamicSubclass);\n        \n        [originalInstanceInstanceMethods removeObjectForKey:NSStringFromClass([object class])];\n        \n        [dynamicSubclassesByObject removeObjectForKey:[NSValue valueWithPointer:JGBridgeCast(const void *, object)]];\n        \n        if (!dynamicSubclassesByObject.count) {\n            releaseIfNecessary(dynamicSubclassesByObject);\n            dynamicSubclassesByObject = nil;\n        }\n        \n        if (!originalInstanceInstanceMethods.count) {\n            releaseIfNecessary(originalInstanceInstanceMethods);\n            originalInstanceInstanceMethods = nil;\n        }\n        \n        success = YES;\n    }\n    \n    OSSpinLockUnlock(&lock);\n    \n    return success;\n}\n\nNS_INLINE BOOL deswizzleMethod(__unsafe_unretained id object, SEL selector) {\n    OSSpinLockLock(&lock);\n    \n    BOOL success = NO;\n    \n    unsigned int count = swizzleCount(object);\n    \n    if (count == 1) {\n        OSSpinLockUnlock(&lock);\n        return deswizzleInstance(object);\n    }\n    else if (count > 1) {\n        JG_IMP originalIMP = originalInstanceInstanceMethodImplementation([object class], selector, YES);\n        if (originalIMP) {\n            method_setImplementation(class_getInstanceMethod(object_getClass(object), selector), (IMP)originalIMP);\n            \n            success = YES;\n        }\n        \n        decreaseSwizzleCount(object);\n    }\n    \n    OSSpinLockUnlock(&lock);\n    \n    return success;\n}\n\n\nNS_INLINE void swizzleInstance(__unsafe_unretained id object, SEL selector, JGMethodReplacementProvider replacementProvider) {\n    Class class = [object class];\n    \n    NSCAssert(blockIsValidReplacementProvider(replacementProvider), @\"Invalid method replacemt provider\");\n    \n    NSCAssert([object respondsToSelector:selector], @\"Invalid method: -[%@ %@]\", NSStringFromClass(class), NSStringFromSelector(selector));\n    \n    OSSpinLockLock(&lock);\n    \n\tif (!dynamicSubclassesByObject) {\n\t\tdynamicSubclassesByObject = [[NSMutableDictionary alloc] init];\n\t};\n    \n    NSValue *key = [NSValue valueWithPointer:JGBridgeCast(const void *, object)];\n    \n    NSMutableDictionary *classDict = dynamicSubclassesByObject[key];\n    \n\tClass newClass = [classDict[kClassKey] pointerValue];\n    \n\tif (!classDict || !newClass) {\n        NSString *dynamicSubclass = [NSStringFromClass(class) stringByAppendingFormat:@\"_JGMS_%@\", [[NSUUID UUID] UUIDString]];\n\t\t\n        const char *newClsName = [dynamicSubclass UTF8String];\n        \n        NSCAssert(!objc_lookUpClass(newClsName), @\"Class %@ already exists!\\n\", dynamicSubclass);\n        \n        newClass = objc_allocateClassPair(class, newClsName, 0);\n        \n        NSCAssert(newClass, @\"Could not create class %@\\n\", dynamicSubclass);\n        \n        objc_registerClassPair(newClass);\n        \n        classDict = [NSMutableDictionary dictionary];\n        classDict[kClassKey] = [NSValue valueWithPointer:JGBridgeCast(const void *, newClass)];\n        classDict[kCountKey] = @(1);\n        \n        dynamicSubclassesByObject[[NSValue valueWithPointer:JGBridgeCast(const void *, object)]] = classDict;\n        \n        Method classMethod = class_getInstanceMethod(newClass, @selector(class));\n        \n        id swizzledClass = ^Class (__unsafe_unretained id self) {\n            return class;\n        };\n        \n        classSwizzleMethod(newClass, classMethod, imp_implementationWithBlock(swizzledClass));\n        \n        SEL deallocSel = sel_getUid(\"dealloc\");\n        \n        Method dealloc = class_getInstanceMethod(newClass, deallocSel);\n        __block JG_IMP deallocImp = (JG_IMP)method_getImplementation(dealloc);\n        \n        id deallocHandler = ^(__unsafe_unretained id self) {\n            NSCAssert(deswizzleInstance(self), @\"Deswizzling of class %@ failed\", NSStringFromClass([self class]));\n            \n            if (deallocImp) {\n                deallocImp(self, deallocSel);\n            }\n        };\n        \n        classSwizzleMethod(newClass, dealloc, imp_implementationWithBlock(deallocHandler));\n    }\n    else {\n        unsigned int count = [classDict[kCountKey] unsignedIntValue];\n        classDict[kCountKey] = @(count+1);\n    }\n    \n    Method origMethod = class_getInstanceMethod(class, selector);\n    \n    JG_IMP origIMP = originalInstanceInstanceMethodImplementation([object class], selector, NO);\n    \n    id replaceBlock = replacementProvider(origIMP, class, selector);\n    \n    NSCAssert(blockIsCompatibleWithMethodType(replaceBlock, class, selector, YES), @\"Invalid method replacement\");\n    \n    classSwizzleMethod(newClass, origMethod, imp_implementationWithBlock(replaceBlock));\n    \n    object_setClass(object, newClass);\n    \n\tOSSpinLockUnlock(&lock);\n}\n\n\n\n#pragma mark - Category Implementations\n\n@implementation NSObject (JGMethodSwizzler)\n\n+ (void)swizzleClassMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider {\n    swizzleClassMethod(self, selector, replacementProvider);\n}\n\n+ (void)swizzleInstanceMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider {\n    swizzleInstanceMethod(self, selector, replacementProvider);\n}\n\n@end\n\n\n@implementation NSObject (JGMethodDeSwizzler)\n\n+ (BOOL)deswizzleClassMethod:(SEL)selector {\n    return deswizzleClassMethod(self, selector);\n}\n\n+ (BOOL)deswizzleInstanceMethod:(SEL)selector {\n    return deswizzleInstanceMethod(self, selector);\n}\n\n+ (BOOL)deswizzleAllClassMethods {\n    return deswizzleAllClassMethods(self);\n}\n\n+ (BOOL)deswizzleAllInstanceMethods {\n    return deswizzleAllInstanceMethods(self);\n}\n\n+ (BOOL)deswizzleAllMethods {\n    BOOL c = [self deswizzleAllClassMethods];\n    BOOL i = [self deswizzleAllInstanceMethods];\n    return (c || i);\n}\n\n@end\n\n\n\n@implementation NSObject (JGInstanceSwizzler)\n\n- (void)swizzleMethod:(SEL)selector withReplacement:(JGMethodReplacementProvider)replacementProvider {\n    swizzleInstance(self, selector, replacementProvider);\n}\n\n- (BOOL)deswizzleMethod:(SEL)selector {\n    return deswizzleMethod(self, selector);\n}\n\n- (BOOL)deswizzle {\n    return deswizzleInstance(self);\n}\n\n@end\n\n\n\n#pragma mark - Public functions\n\nBOOL deswizzleGlobal(void)\n{\n    BOOL success = NO;\n    OSSpinLockLock(&lock);\n    NSDictionary *d = originalClassMethods.copy;\n    for (NSString *classKey in d) {\n        OSSpinLockUnlock(&lock);\n        BOOL ok = [NSClassFromString(classKey) deswizzleAllMethods];\n        OSSpinLockLock(&lock);\n        if (!success == ok) {\n            success = YES;\n        }\n    }\n    \n    NSDictionary *d1 = originalInstanceMethods.copy;\n    for (NSString *classKey in d1) {\n        OSSpinLockUnlock(&lock);\n        BOOL ok = [NSClassFromString(classKey) deswizzleAllMethods];\n        OSSpinLockLock(&lock);\n        if (!success == ok) {\n            success = YES;\n        }\n    }\n    OSSpinLockUnlock(&lock);\n    \n    releaseIfNecessary(d);\n    releaseIfNecessary(d1);\n    \n    return success;\n}\n\n\nBOOL deswizzleInstances(void)\n{\n    OSSpinLockLock(&lock);\n    BOOL success = NO;\n    NSDictionary *d = dynamicSubclassesByObject.copy;\n    for (NSValue *pointer in d) {\n        id object = [pointer pointerValue];\n        OSSpinLockUnlock(&lock);\n        BOOL ok = [object deswizzle];\n        OSSpinLockLock(&lock);\n        if (!success && ok) {\n            success = YES;\n        }\n    }\n    OSSpinLockUnlock(&lock);\n    \n    releaseIfNecessary(d);\n    \n    return success;\n}\n\nBOOL deswizzleAll(void)\n{\n    BOOL a = deswizzleGlobal();\n    BOOL b = deswizzleInstances();\n    \n    return (a || b);\n}\n\n//For debugging purposes:\n//NSString *getStatus() {\n//    return [NSString stringWithFormat:@\"Original Class:\\n%@\\n\\n\\nOriginal Instance:\\n%@\\n\\n\\nOriginal Instance Specific:\\n%@\\n\\n\\nDynamic Subclasses:\\n%@\\n\\n\\n\", originalClassMethods, originalInstanceMethods, originalInstanceInstanceMethods, dynamicSubclassesByObject];\n//}\n\n\n"
  },
  {
    "path": "Pods/JGMethodSwizzler/README.md",
    "content": "<h1>JGMethodSwizzler</h1><h6>© 2013 Jonas Gessner</h6>\n\n----------------\n<br>\n\nAn easy to use Objective-C level API for swizzling class and instance methods, as well as swizzling instance methods on specific instances only.\n\n##Documentation\n\n#####For further examples see the `JGMethodSwizzlerTests` Xcode project.\n\n\nJGMethodSwizzler can be used for three basic swizzling types: Swizzling a specific method for all instances of a class, swizzling class methods and swizzling instance methods of specific instances only.\n\nJGMethodSwizzler is completely thread safe and can handle multiple swizzles. Instance-specific swizzling should however not be combined with global swizzling in the same method.\n\n\n\n###Swizzling a class method:\nSwizzling the method `+(int)[TestClass test:(int)]`\n```objc\n[TestClass swizzleClassMethod:@selector(test:) withReplacement:JGMethodReplacementProviderBlock {\n\t//return a replacement block\n\treturn JGMethodReplacement(int, const Class *, int arg) {\n\t\t//get the original value\n\t\tint orig = JGOriginalImplementation(int, arg);\n\t\t//return the modified value\n\t\treturn orig+2;\n\t};\n}];\n```\n\nAfter this code is run, calling the method will return the modified value until the method is deswizzled.\n\n\n###Swizzling an instance method across all instances of a class:\nSwizzling the method `-(int)[TestClass test:(int)]`\n```objc\n[TestClass swizzleInstanceMethod:@selector(test:) withReplacement:JGMethodReplacementProviderBlock {\n\t//return a replacement block\n\treturn JGMethodReplacement(int, TestClass *, int arg) {\n\t\t//get the original value\n\t\tint orig = JGOriginalImplementation(int, arg);\n\t\t//return the modified value\n\t\treturn orig+2;\n\t};\n}];\n```\n\nAfter this code is run, calling the method will return the modified value until the method is deswizzled.\n\n\n\n###Swizzling an instance method for a specific instance:\nSwizzling the `description` method on a specific `NSObject`instance:\n```objc\nNSObject *object = [NSObject new];\n\n[object swizzleMethod:@selector(description) withReplacement:JGMethodReplacementProviderBlock {\n\treturn JGMethodReplacement(NSString *, NSObject *) {\n\t\tNSString *orig = JGOriginalImplementation(NSString *);\n            \n\t\treturn [orig stringByAppendingString:@\" Swizzled!!\"];\n\t};\n}];\n```\n\nAfter this code is run, calling the method will return the modified value until the method is deswizzled.\n\n\n###Deswizzling\n\nAll swizzles can be removed once they've been applied.\n\n\n`deswizzleAll()` removes all swizzles.\n\n\n####Deswizzling global class and instance swizzles\n\n`deswizzleGlobal()` removes all swizzles that have been applied as global swizzles (not instance specific).\n\n`+deswizzleClassMethod:(SEL)` deswizzles a specific class method.\n\n`+deswizzleInstanceMethod:(SEL)` deswizzles a specific instance method.\n\n`+deswizzleAllClassMethods` deswizzles all swizzled class methods of this class.\n\n`+deswizzleAllInstanceMethods` deswizzles all swizzled instance methods of this class.\n\n`+deswizzleAllMethods` deswizzles all swizzled methods of this class.\n\n\n####Deswizzling Instance specific swizzles\n\n`deswizzleInstances()` removes all swizzles that have been applied as instance specific swizzles.\n\n`-deswizzleMethod:(SEL)` deswizzles a specific instance method of this instance.\n\n`-deswizzle` deswizzles all swizzled instance methods of this instance.\n\n\n##Notes\n`JGMethodSwizzler` works with both ARC and MRC/MRR.\n\n##Credits\nCreated by Jonas Gessner.\n\nThanks to Andrew Richardson for his inspiration and contribution with `InstanceHook`.\n\n##License\nLicensed under the MIT license.\n"
  },
  {
    "path": "Pods/Local Podspecs/DTBonjour.podspec.json",
    "content": "{\n  \"name\": \"DTBonjour\",\n  \"version\": \"1.1.1\",\n  \"summary\": \"Client/Server Communication of NSObjects over WiFi.\",\n  \"homepage\": \"https://github.com/Cocoanetics/DTBonjour\",\n  \"authors\": {\n    \"Oliver Drobnik\": \"oliver@drobnik.com\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/Cocoanetics/DTBonjour.git\",\n    \"tag\": \"1.1.1\"\n  },\n  \"source_files\": \"Core/Source/*.{h,m}\",\n  \"license\": \"BSD\",\n  \"platforms\": {\n    \"ios\": \"5.0\",\n    \"osx\": \"10.7\"\n  },\n  \"ios\": {\n    \"frameworks\": [\n      \"CoreFoundation\",\n      \"Foundation\",\n      \"UIKit\"\n    ]\n  },\n  \"osx\": {\n    \"frameworks\": [\n      \"CoreFoundation\",\n      \"Foundation\"\n    ]\n  },\n  \"requires_arc\": true\n}\n"
  },
  {
    "path": "Pods/Local Podspecs/DZNEmptyDataSet.podspec.json",
    "content": "{\n  \"name\": \"DZNEmptyDataSet\",\n  \"version\": \"1.7.3\",\n  \"summary\": \"A drop-in UITableView/UICollectionView superclass category for showing empty datasets whenever the view has no content to display.\",\n  \"description\": \"It will work automatically, by just conforming to DZNEmptyDataSetSource, and returning the data you want to show. The -reloadData call will be observed so the empty dataset will be configured whenever needed. It is (extremely) important to set the dataSetSource and dataSetDelegate to nil, whenever the view is going to be released. This class uses KVO under the hood, so it needs to remove the observer before dealocating the view.\",\n  \"homepage\": \"https://github.com/dzenbot/DZNEmptyDataSet\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"file\": \"LICENSE\"\n  },\n  \"authors\": {\n    \"dzenbot\": \"iromero@dzen.cl\"\n  },\n  \"platforms\": {\n    \"ios\": \"6.0\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/dzenbot/DZNEmptyDataSet.git\",\n    \"tag\": \"v1.7.3\"\n  },\n  \"source_files\": [\n    \"Classes\",\n    \"Source/**/*.{h,m}\"\n  ],\n  \"requires_arc\": true,\n  \"frameworks\": \"UIKit\"\n}\n"
  },
  {
    "path": "Pods/Local Podspecs/KissXML.podspec.json",
    "content": "{\n  \"name\": \"KissXML\",\n  \"version\": \"5.1.2\",\n  \"license\": {\n    \"type\": \"MIT\",\n    \"file\": \"LICENSE.txt\"\n  },\n  \"summary\": \"A replacement for Cocoa's NSXML cluster of classes. Based on libxml.\",\n  \"homepage\": \"https://github.com/robbiehanson/KissXML\",\n  \"authors\": {\n    \"Robbie Hanson\": \"robbiehanson@deusty.com\"\n  },\n  \"source\": {\n    \"git\": \"https://github.com/robbiehanson/KissXML.git\",\n    \"tag\": \"5.1.2\"\n  },\n  \"requires_arc\": true,\n  \"default_subspecs\": \"Core\",\n  \"platforms\": {\n    \"ios\": \"6.0\",\n    \"osx\": \"10.8\",\n    \"tvos\": \"9.0\",\n    \"watchos\": \"2.0\"\n  },\n  \"subspecs\": [\n    {\n      \"name\": \"Core\",\n      \"source_files\": \"KissXML/**/*.{h,m}\",\n      \"private_header_files\": \"KissXML/Private/**/*.h\",\n      \"libraries\": \"xml2\",\n      \"xcconfig\": {\n        \"HEADER_SEARCH_PATHS\": \"$(SDKROOT)/usr/include/libxml2\"\n      }\n    },\n    {\n      \"name\": \"SwiftNSXML\",\n      \"dependencies\": {\n        \"KissXML/Core\": [\n\n        ]\n      },\n      \"source_files\": \"KissXML/**/*.{h,m,swift}\",\n      \"osx\": {\n        \"exclude_files\": \"KissXML/**/*.swift\"\n      },\n      \"private_header_files\": \"KissXML/Private/**/*.h\",\n      \"platforms\": {\n        \"ios\": \"8.0\",\n        \"osx\": \"10.8\",\n        \"tvos\": \"9.0\",\n        \"watchos\": \"2.0\"\n      }\n    },\n    {\n      \"name\": \"libxml_module\",\n      \"dependencies\": {\n        \"KissXML/SwiftNSXML\": [\n\n        ]\n      },\n      \"platforms\": {\n        \"ios\": \"8.0\",\n        \"osx\": \"10.8\",\n        \"tvos\": \"9.0\",\n        \"watchos\": \"2.0\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "Pods/Local Podspecs/MRProgress.podspec.json",
    "content": "{\n  \"name\": \"MRProgress\",\n  \"version\": \"0.7.0\",\n  \"summary\": \"Collection of iOS drop-in components to visualize progress with different modes\",\n  \"homepage\": \"https://github.com/mrackwitz/MRProgress\",\n  \"social_media_url\": \"https://twitter.com/mrackwitz\",\n  \"authors\": {\n    \"Marius Rackwitz\": \"git@mariusrackwitz.de\"\n  },\n  \"license\": \"MIT License\",\n  \"source\": {\n    \"git\": \"https://github.com/mrackwitz/MRProgress.git\",\n    \"tag\": \"0.7.0\"\n  },\n  \"source_files\": \"src/MRProgress.h\",\n  \"platforms\": {\n    \"ios\": \"7.0\"\n  },\n  \"requires_arc\": true,\n  \"default_subspecs\": [\n    \"Blur\",\n    \"ActivityIndicator\",\n    \"Circular\",\n    \"Icons\",\n    \"NavigationBarProgress\",\n    \"Overlay\"\n  ],\n  \"subspecs\": [\n    {\n      \"name\": \"Blur\",\n      \"source_files\": \"src/Blur/*.{h,m}\",\n      \"dependencies\": {\n        \"MRProgress/Helper\": [\n\n        ]\n      },\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\",\n          \"CoreGraphics\",\n          \"Accelerate\"\n        ]\n      }\n    },\n    {\n      \"name\": \"ActivityIndicator\",\n      \"source_files\": \"src/Components/MRActivityIndicatorView.{h,m}\",\n      \"dependencies\": {\n        \"MRProgress/Stopable\": [\n\n        ]\n      },\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\",\n          \"CoreGraphics\"\n        ]\n      }\n    },\n    {\n      \"name\": \"Circular\",\n      \"source_files\": \"src/Components/MRCircularProgressView.{h,m}\",\n      \"dependencies\": {\n        \"MRProgress/Stopable\": [\n\n        ],\n        \"MRProgress/Helper\": [\n\n        ],\n        \"MRProgress/ProgressBaseClass\": [\n\n        ]\n      },\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\"\n        ]\n      }\n    },\n    {\n      \"name\": \"Icons\",\n      \"source_files\": \"src/Components/MRIconView.{h,m}\",\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\"\n        ]\n      }\n    },\n    {\n      \"name\": \"NavigationBarProgress\",\n      \"source_files\": \"src/Components/MRNavigationBarProgressView.{h,m}\",\n      \"dependencies\": {\n        \"MRProgress/ProgressBaseClass\": [\n\n        ]\n      },\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\"\n        ]\n      }\n    },\n    {\n      \"name\": \"Overlay\",\n      \"source_files\": \"src/Components/MRProgressOverlayView.{h,m}\",\n      \"dependencies\": {\n        \"MRProgress/ActivityIndicator\": [\n\n        ],\n        \"MRProgress/Circular\": [\n\n        ],\n        \"MRProgress/Icons\": [\n\n        ],\n        \"MRProgress/Blur\": [\n\n        ],\n        \"MRProgress/Helper\": [\n\n        ]\n      },\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\",\n          \"CoreGraphics\"\n        ]\n      }\n    },\n    {\n      \"name\": \"AFNetworking\",\n      \"subspecs\": [\n        {\n          \"name\": \"Base\",\n          \"dependencies\": {\n            \"MRProgress/MethodCopier\": [\n\n            ],\n            \"AFNetworking\": [\n\n            ],\n            \"AFNetworking/UIKit\": [\n              \"2.4.1\"\n            ]\n          }\n        },\n        {\n          \"name\": \"ActivityIndicator\",\n          \"dependencies\": {\n            \"MRProgress/AFNetworking/Base\": [\n\n            ],\n            \"MRProgress/ActivityIndicator\": [\n\n            ]\n          },\n          \"source_files\": \"src/Support/AFNetworking/MRActivityIndicatorView+AFNetworking.{h,m}\"\n        },\n        {\n          \"name\": \"ProgressBaseClass\",\n          \"dependencies\": {\n            \"MRProgress/AFNetworking/Base\": [\n\n            ],\n            \"MRProgress/ProgressBaseClass\": [\n\n            ]\n          },\n          \"source_files\": \"src/Support/AFNetworking/MRProgressView+AFNetworking.{h,m}\"\n        },\n        {\n          \"name\": \"Overlay\",\n          \"dependencies\": {\n            \"MRProgress/AFNetworking/Base\": [\n\n            ],\n            \"MRProgress/Overlay\": [\n\n            ],\n            \"MRProgress/AFNetworking/ActivityIndicator\": [\n\n            ],\n            \"MRProgress/AFNetworking/Circular\": [\n\n            ]\n          },\n          \"source_files\": \"src/Support/AFNetworking/MRProgressOverlayView+AFNetworking.{h,m}\"\n        },\n        {\n          \"name\": \"Circular\",\n          \"dependencies\": {\n            \"MRProgress/AFNetworking/ProgressBaseClass\": [\n\n            ]\n          }\n        },\n        {\n          \"name\": \"NavigationBarProgress\",\n          \"dependencies\": {\n            \"MRProgress/AFNetworking/ProgressBaseClass\": [\n\n            ]\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"MessageInterceptor\",\n      \"source_files\": \"src/Utils/MRMessageInterceptor.{h,m}\"\n    },\n    {\n      \"name\": \"MethodCopier\",\n      \"source_files\": \"src/Utils/MRMethodCopier.{h,m}\"\n    },\n    {\n      \"name\": \"WeakProxy\",\n      \"source_files\": \"src/Utils/MRWeakProxy.{h,m}\"\n    },\n    {\n      \"name\": \"ProgressBaseClass\",\n      \"source_files\": \"src/Components/MRProgressView.{h,m}\",\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\"\n        ]\n      }\n    },\n    {\n      \"name\": \"Stopable\",\n      \"source_files\": \"src/Components/{MRStopableView,MRStopButton}.{h,m}\",\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\"\n        ]\n      },\n      \"dependencies\": {\n        \"MRProgress/Helper\": [\n\n        ]\n      }\n    },\n    {\n      \"name\": \"Helper\",\n      \"source_files\": \"src/Utils/MRProgressHelper.h\",\n      \"ios\": {\n        \"frameworks\": [\n          \"UIKit\",\n          \"QuartzCore\"\n        ]\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "Pods/NSTimer-Blocks/NSTimer+Blocks.h",
    "content": "//\n//  NSTimer+Blocks.h\n//\n//  Created by Jiva DeVoe on 1/14/11.\n//  Copyright 2011 Random Ideas, LLC. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n@interface NSTimer (Blocks)\n+(id)scheduledTimerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats;\n+(id)timerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats;\n@end\n"
  },
  {
    "path": "Pods/NSTimer-Blocks/NSTimer+Blocks.m",
    "content": "//\n//  NSTimer+Blocks.m\n//\n//  Created by Jiva DeVoe on 1/14/11.\n//  Copyright 2011 Random Ideas, LLC. All rights reserved.\n//\n\n#import \"NSTimer+Blocks.h\"\n\n@implementation NSTimer (Blocks)\n\n+(id)scheduledTimerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats\n{\n    void (^block)() = [inBlock copy];\n    id ret = [self scheduledTimerWithTimeInterval:inTimeInterval target:self selector:@selector(jdExecuteSimpleBlock:) userInfo:block repeats:inRepeats];\n    [block release];\n    return ret;\n}\n\n+(id)timerWithTimeInterval:(NSTimeInterval)inTimeInterval block:(void (^)())inBlock repeats:(BOOL)inRepeats\n{\n    void (^block)() = [inBlock copy];\n    id ret = [self timerWithTimeInterval:inTimeInterval target:self selector:@selector(jdExecuteSimpleBlock:) userInfo:block repeats:inRepeats];\n    [block release];\n    return ret;\n}\n\n+(void)jdExecuteSimpleBlock:(NSTimer *)inTimer;\n{\n    if([inTimer userInfo])\n    {\n        void (^block)() = (void (^)())[inTimer userInfo];\n        block();\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/NSTimer-Blocks/README.md",
    "content": "README\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "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\t03ED618B5D7F48981C98DD8E0AC1B8D4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t05B2A27272B2CE67127CD9DD9E729606 /* buttonRoundedRegularHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 73C40F0679B91FF496574BD8B55234C2 /* buttonRoundedRegularHighlighted.png */; };\n\t\t0BE0EB2E46F8813032EC45640B8B595B /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 3411FBDB6BE077EAE97267E435727674 /* hu.lproj */; };\n\t\t0EB4EA6580DAE04E7C6E70ECF6434B32 /* buttonRoundedRegular@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 3ACAAC89AB84785236B215C9F17E8475 /* buttonRoundedRegular@2x.png */; };\n\t\t0EDA832E97ADBFD62ED74E4B367C5F1F /* NSData+GZIP.h in Headers */ = {isa = PBXBuildFile; fileRef = B50EF1A0AB5CC4DCADF5ABCD8C9104FC /* NSData+GZIP.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t10102D2E1E4FCF01E4839F71170EF4FA /* hr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 5F05719C0A4ED06B6A9FAA13E6412205 /* hr.lproj */; };\n\t\t10E71ECB9306E5534B085AEA0BCD8A52 /* buttonRoundedDeleteHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = D457B2251162C0E67ABF48ADE98881E9 /* buttonRoundedDeleteHighlighted@2x.png */; };\n\t\t133AC187EE5D1E7081584EEF67FD63AE /* SAMKeychainQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 7839D880CB8ADECD7A1C9FEEC6F63368 /* SAMKeychainQuery.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t15F556BBB8C5FD67AD2D7616A991615D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t1741C39F86DB6FEA459F2B549CD326FB /* Arrow.png in Resources */ = {isa = PBXBuildFile; fileRef = B2DD07B8E4DA803BB82C2501563D4675 /* Arrow.png */; };\n\t\t1A445F902B7E0BAA28D24FE8CC231C5D /* DTBonjourServer.h in Headers */ = {isa = PBXBuildFile; fileRef = A29A2C0C6BF351E0E3C368ED1B22A0F4 /* DTBonjourServer.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t1B9228F487DF7B494E7E8E93DF2D2371 /* buttonRoundedDeleteHighlighted.png in Resources */ = {isa = PBXBuildFile; fileRef = 88D6F9DA1B5061AF8576CCED8AF85F8E /* buttonRoundedDeleteHighlighted.png */; };\n\t\t1DDF94B65609AC4AEB7A23A6B3BC1B73 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 111DCA0E215404B364A727C3CCA014DE /* Accelerate.framework */; };\n\t\t211848600C7182B0051E73DE82B20421 /* Rectangle@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 402CD7D79C53993504224FFD906784F7 /* Rectangle@3x.png */; };\n\t\t222F2E16CD9C0942488716084D20E59B /* UIActionSheet+Blocks-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 36D0457643AFCA2E67CC859EAB335411 /* UIActionSheet+Blocks-dummy.m */; };\n\t\t2744196B80834C8C64B2B22220285201 /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = C967E2A2120811E20A72E972240F9A5D /* nl.lproj */; };\n\t\t27D496CF5EE7BA692B7D16E0B442D9F9 /* Pods-Dash-Dash App Store-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 02FB990DEDD7795680D048211CB19901 /* Pods-Dash-Dash App Store-dummy.m */; };\n\t\t28D88E4C381A992360345EC739B3E8FD /* MRStopButton.m in Sources */ = {isa = PBXBuildFile; fileRef = FB90C025AE6C45BE9749ABEE1B6EF075 /* MRStopButton.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t30257396D21B0270BA8CB0966BFCBA78 /* KissXML-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 59D174E1055905F5E1E04D18D9EED9E3 /* KissXML-dummy.m */; };\n\t\t305B1478BF6997FBB91CEC7CC4B66545 /* NSData+GZIP.m in Sources */ = {isa = PBXBuildFile; fileRef = 9622D82B702FFE25DE90D0B472DA1DBB /* NSData+GZIP.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t316879A6DF33BD9562D61E58D8C4B4CF /* UIImage+MRImageEffects.h in Headers */ = {isa = PBXBuildFile; fileRef = 1319FABFAF429EBF07CBD56B85E48AAF /* UIImage+MRImageEffects.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t32CD9EECF27C826C3037136C2E071581 /* NSTimer+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = CE60BD25CF976A3E6D1E94CDDDA66886 /* NSTimer+Blocks.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t346864D11D763C076018847484B03709 /* MRProgress-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 52FAA1D716B7929A5AB210EB862FD10D /* MRProgress-dummy.m */; };\n\t\t34F1B4DCE098F105AAE2C9CA9A58EF85 /* Blur@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FF912C17DFB313013CB3A3BE2ED9E4B5 /* Blur@2x.png */; };\n\t\t35720EF83CF77037C3DF93CCA5394BF6 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 64AA64B7B06D4A8E152A59D27B5EAF96 /* nb.lproj */; };\n\t\t35D49A3C17A4531B622581515375086B /* MRBlurView.m in Sources */ = {isa = PBXBuildFile; fileRef = 92C886CBB2A6E30B0C45FE3D37172CF0 /* MRBlurView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t35DE995FE1330AC6A960B9A41EBA5BE1 /* UIScrollView+EmptyDataSet.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EBD7F7E716F02FB1C5BF8DCF344028C /* UIScrollView+EmptyDataSet.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t377A1FC08453DEC747BF0FEF051BC213 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3ACC3A782EE164785E86967FACC244F /* UIKit.framework */; };\n\t\t37A59DD6DDA29B24E168EBF22652F927 /* UIAlertView+Blocks-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D47480CA92189F8FFFE6F58884F70EC1 /* UIAlertView+Blocks-dummy.m */; };\n\t\t39CB850EF4296921B301F2F60C5A094A /* JGMethodSwizzler-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FD8515AAFE2D01DFD97B8765AAF84AD9 /* JGMethodSwizzler-dummy.m */; };\n\t\t3B13A83F0B416416FE3AE60DD68D00B4 /* buttonRoundedDelete@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0A930A77657403D3EAB840F80B666B4A /* buttonRoundedDelete@2x.png */; };\n\t\t3D99AEFD65C4B18FF4D751CC43DEAF0D /* IconGradient.png in Resources */ = {isa = PBXBuildFile; fileRef = 693DA89A0FA04668E2177ADD93C1A58E /* IconGradient.png */; };\n\t\t3DE15B6BA3E28208CE1B429C27EF08FA /* AutoCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = B33EF6D45895DB3AD613EA7307E2F025 /* AutoCoding.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t3E08E40938C162E223543E74CC97374E /* Cancel@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 16A9095C5D2C1E81A11E77AF578A361F /* Cancel@3x.png */; };\n\t\t3ED9F3F11A9BE5EBDDA2FD31FC7CEA3B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t40902EEE245159F48FE2048E0DAE9168 /* feedbackActivity@2x~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 298616DAB1D04723062721867EF9AB65 /* feedbackActivity@2x~ipad.png */; };\n\t\t413FA36162582E103501843521C20AD0 /* UIActionSheet+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 6272C9EFE296101A3F185978C4423465 /* UIActionSheet+Blocks.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t4548C1011A02C777B4B263AD821A2DD3 /* pt-PT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8EF48A9D4A7F2C1EE8A77563376FD7B3 /* pt-PT.lproj */; };\n\t\t46BAB6394E367A6742A1EC295A24F0C1 /* JGMethodSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = ACED789A2C3B1F688B59D6647D8B6151 /* JGMethodSwizzler.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t4BD0CD3F98A9DECD717A405B6F5B7D85 /* Arrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F77501C77980C070A24246E7E7CC798 /* Arrow@2x.png */; };\n\t\t4EC2B357CD04FCBA1A75CC7A477153CC /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 60CA7517D8BA2908E199144352AB9689 /* it.lproj */; };\n\t\t4ED1E56195582D7ADAEA2AE7037A9E48 /* MRBlurView.h in Headers */ = {isa = PBXBuildFile; fileRef = 61D67F36EFBCDAE64CE95CC93EDF2B64 /* MRBlurView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t4F01E11E5BC96B92C255589CF5BBCC49 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 4852430BC0B8E1AEB6415242ECE72CE8 /* de.lproj */; };\n\t\t518635F73746F6AC6FAB80281F5FFBE5 /* Reachability-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A19D1BDEF431C39A662FC3908CCCA8EF /* Reachability-dummy.m */; };\n\t\t553D65B7792BB684FE8F1A27A39E160A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 729DFAE1293D7006E08BDC51559A135D /* QuartzCore.framework */; };\n\t\t555F6CA45E9184776CB2CC4EB50A4057 /* MRProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 74C52195D46C2D8F35146299BEC3F1E4 /* MRProgressView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t59CA5F7719005184AB71884C81DFA971 /* feedbackActivity~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 3C2CD094483D9DBEA19C1E03D3878998 /* feedbackActivity~ipad.png */; };\n\t\t5FA41B05EB4530D9F8A3F6488E143E3D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3ACC3A782EE164785E86967FACC244F /* UIKit.framework */; };\n\t\t62D5067144CBE93061CFDB24EE374556 /* AutoCoding.h in Headers */ = {isa = PBXBuildFile; fileRef = EF0CF7A976C3D78E1ACE7E293A6F9583 /* AutoCoding.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t64D623FEDDAC23BDA3A853D623C5D9A2 /* MRNavigationBarProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C43D6F6CF04E4DF3FCB39583BBCA819 /* MRNavigationBarProgressView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t657349B62D75CB35A655EA1A57E000B8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t674952B3CF29046A4CD03B998A1BF2DB /* SAMKeychain-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 754B9BD1B02C9A8659E3707875DA4E8A /* SAMKeychain-dummy.m */; };\n\t\t682F3F35A8D7954EAD87213CF6D92CA6 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 0DD58F6D94984607D0AE20D22F5D54EE /* en.lproj */; };\n\t\t687B2FDD0AAB81AE870D13E703C43A76 /* DDXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = C232AA1C67EAB67DD980F99EB1D6A8B5 /* DDXMLNode.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t6AA66B59D140C38C02B5B9022AA134D4 /* DTBonjourDataChunk.h in Headers */ = {isa = PBXBuildFile; fileRef = A004D7E225481204C8932863C0E33FFD /* DTBonjourDataChunk.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t6EC8E3228BB60E487E156467919BA83A /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 9E86AD1EAE16ECA8F8DBCAA046CD33BC /* fr.lproj */; };\n\t\t7093E19B30DE09BA7814269DA51CA622 /* MRCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D04033CB1601E077C86887D0D6D84D2 /* MRCircularProgressView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t712EC682C9E3729DA280454692B5E6D0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t73E63C7B0EAA5A9659C38F1CCE850837 /* DTBonjourServer.m in Sources */ = {isa = PBXBuildFile; fileRef = A56082E65CB34E180CD590F16B6DF2EB /* DTBonjourServer.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t75D44699D0B8624F62EFD3869A923CFC /* UIAlertView+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = C09E24470CFB2781BA3A124B664ABC28 /* UIAlertView+Blocks.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t781D8A34B99AF419688D9DC70220B2C0 /* DTBonjourDataConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8406BEBB173DF21821755A3088B7BD93 /* DTBonjourDataConnection.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t7BF1BC9703683E3CDD159A6264CFB58B /* Rectangle.png in Resources */ = {isa = PBXBuildFile; fileRef = 4EA76B35B5EFCFCC2D7A6FBA787A0281 /* Rectangle.png */; };\n\t\t7C4D1F326A2B12AE370997778531801A /* iconCamera.png in Resources */ = {isa = PBXBuildFile; fileRef = 5573F0DE5EE0EFC5576DFF2BFEC35473 /* iconCamera.png */; };\n\t\t7C9932F486CC710949304F3E5174DBDA /* Pods-Dash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B72E9B277BBA4224515107FE5B775282 /* Pods-Dash-dummy.m */; };\n\t\t7D498B858EFD7F9E012A78B81781175B /* Cancel@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = E37B159BB6C3FF3E8DF4D592A363E1B1 /* Cancel@2x.png */; };\n\t\t7D99EDF1A4767CCDB9B5E29DA6D6B8D6 /* Ok@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BE360F248A0682F7D40B2353161D5483 /* Ok@2x.png */; };\n\t\t7DDD41B9276BFE828CD85F7E049F9A7A /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8A3A5F273B5E22901C3906A48429B40C /* ru.lproj */; };\n\t\t7E434BCBC72DCBB014170A9A3BF47E30 /* MRCircularProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = A78824B8D9F60AC0533272DE93FA33EC /* MRCircularProgressView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t7FC1A2AC6EE5A2A9FED69B5D8C39ECA9 /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 00427DC215BF331D73E31001803C8DDC /* tr.lproj */; };\n\t\t811B41DF52A68EC307C411FEE3E7EF74 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t82BC1C26C706FF4BBF65D5A4652F5A7D /* MRProgress.h in Headers */ = {isa = PBXBuildFile; fileRef = 636E33A1ED095F06B4D35A871DB9197D /* MRProgress.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t853A9C3D08C8663BC7CD6B9F3B2CDF82 /* DZNEmptyDataSet-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA815B34AC5025B2CCDE6EFAA6D2ABCC /* DZNEmptyDataSet-dummy.m */; };\n\t\t87895EF9BEF0CFACE3AC7C3316F1E159 /* MRStopButton.h in Headers */ = {isa = PBXBuildFile; fileRef = CBCE3D6A139383B2A321AFB875F969D1 /* MRStopButton.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t880D737B2ADE1817A5541EE531A885A6 /* UIActionSheet+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F35EDB4796A73D77330A2A701E63F2A /* UIActionSheet+Blocks.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\t89CF7DB18FCD2C2C0F62DC01C750F2D2 /* UIAlertView+Blocks.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A484AA1F3A0F563D5C35282AB23BFF9 /* UIAlertView+Blocks.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t8AE185D89C4851742B2239FC684A3FB0 /* UIScrollView+EmptyDataSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 184828C342E650079B44F9E43E9B2D8F /* UIScrollView+EmptyDataSet.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t8B32F0B28C991601EC5BD9A2F1B0F85A /* SAMKeychain.h in Headers */ = {isa = PBXBuildFile; fileRef = A97A461F518B38480D9CE441E309B6DE /* SAMKeychain.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t8C9FAB21CF493F405C12AEEE86DA481D /* MRProgressOverlayView.h in Headers */ = {isa = PBXBuildFile; fileRef = D970DC1A1D23C5DB5ACCD77C19AC40A3 /* MRProgressOverlayView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t8D401BC540B6CF254C8C5E2B2E41636D /* Rectangle@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B7FFA9A67DCAEE70ECEC2B32E26CBBC /* Rectangle@2x.png */; };\n\t\t8F7E5E1D1B7D7B814864BFCAEBCAF00F /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 51ADAA8BD14FAC550BE559B2970EE3EB /* zh-Hans.lproj */; };\n\t\t9285778B28FEC7F14B87058E091BA90C /* KissXML.h in Headers */ = {isa = PBXBuildFile; fileRef = 44F031A13DB563B10BB3B79F5DB6D457 /* KissXML.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t9295CDBA01DF80B0AD00AFA507CEA67F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\t9369C7444953229DAAFC0D616CCAC0FF /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 242D40001D15A908970377E06670D4DD /* ja.lproj */; };\n\t\t945181D2B7E30D3C0B07EDEC26E1FC2B /* authorize_denied@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0935593CAB20501BD1E56377C947C5F2 /* authorize_denied@3x.png */; };\n\t\t94673DF28CFD10AF179F7D04CDA8BAC5 /* Blur@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6C1051EF8A14FB127CF765CA63883E32 /* Blur@3x.png */; };\n\t\t94B7C8911B2A9A08A71606D9581A1148 /* buttonRoundedDelete.png in Resources */ = {isa = PBXBuildFile; fileRef = A81B6B069FB3BA856977A61B80C8F055 /* buttonRoundedDelete.png */; };\n\t\t95B86A37516E4159141D192C653EC815 /* buttonRoundedRegularHighlighted@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = C8F2241DB3EFEA1ECDE407C702D42988 /* buttonRoundedRegularHighlighted@2x.png */; };\n\t\t970466C82DB88ECDDD27BF3E9DF4FC46 /* AppIconPlaceHolder.png in Resources */ = {isa = PBXBuildFile; fileRef = ED83AD26BD55125C060D6E875C69B1E8 /* AppIconPlaceHolder.png */; };\n\t\t9808324BB727454528DDA58297FDBC8C /* DDXMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B693AE6C516B7139BFB9B06EA9F989E /* DDXMLElement.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\t9F517A0B7A6D86A000F09E64D1D854A3 /* SAMKeychain.m in Sources */ = {isa = PBXBuildFile; fileRef = 078A11A36977A19957A5C54135D7EF40 /* SAMKeychain.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tA1F2C9D83A0B96B8C48E5DCF10A29C4E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tA416F348274132328F2F7889EE0070B0 /* buttonRoundedRegular.png in Resources */ = {isa = PBXBuildFile; fileRef = AE7CB7424AEC5522A9E1846CAB39F444 /* buttonRoundedRegular.png */; };\n\t\tA55A152F73E3648DD16340517BC60C11 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tA8D32AA73678855CF6E93D4FFEA2F7AF /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 007D63F5AABE7790C903F3DC108A31D5 /* pt.lproj */; };\n\t\tA9AA8BA6AAA5264E89D1CF42D9E0FE74 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7083AE4B09F2A83953471EB9AA73DEBA /* CoreFoundation.framework */; };\n\t\tA9DDA23615CC07AA99D48471BF75C2C1 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 125B50749BE411DCEA57A84C1CC2180A /* es.lproj */; };\n\t\tABAD06AA5EFA82D3694D7EF495F35BF2 /* DDXMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 5149FA3EF9E34B3B97B49EB283ABE386 /* DDXMLElement.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tABC6717E8D915376E89BC88749877AF2 /* GZIP-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A48CB1008AEC858377AD5E8A777C7C4 /* GZIP-dummy.m */; };\n\t\tAD12DCF1C2174A7E2FA68AF2D7D59DAF /* feedbackActivity@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8D6BFEE74158C79C4874E33413294655 /* feedbackActivity@2x.png */; };\n\t\tB11EAB751E1E20BF9A2AB32C14E8D9AF /* DDXMLElementAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E5F6CE32A36BC8DEA995312D44E1ADB /* DDXMLElementAdditions.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tB141DE7F8C61881DDF9CCBB72F681A0C /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F0C14F0B0C87E929D045BF18FC651FEA /* SystemConfiguration.framework */; };\n\t\tB1FA685EA4E9AA9B582D852F82A3DC20 /* NSString+DDXML.h in Headers */ = {isa = PBXBuildFile; fileRef = 4C5B1721C029840798C6D4B95ACD9610 /* NSString+DDXML.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tB48752A7C35E86FBE6C9B08DDEA7F972 /* MRProgressOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 167262C4CC62DD8EEDCFC1955DF8352C /* MRProgressOverlayView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tB6C70846F73FBF29EF6884148FE10D52 /* DDXMLDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = D86D3E3A8D8DF90491F44982FEE9B621 /* DDXMLDocument.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tB8D849B69A2177B7C31381E54D1A0712 /* fa.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 99B1109AA360471E3B83AB5CEE4440DC /* fa.lproj */; };\n\t\tB909D025BABF13158000FF37385CD072 /* DDXML.h in Headers */ = {isa = PBXBuildFile; fileRef = F9D0473AB76A1A46053CDF6788B84CA3 /* DDXML.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tBA2233A98BC53B7D3A80D66A15750525 /* Blur.png in Resources */ = {isa = PBXBuildFile; fileRef = E7EB241F08BEEECDE7CACE0C66BE39FB /* Blur.png */; };\n\t\tBB639C5280B0B5146F7A423B92C0B9DD /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C1524368196FCDD680FD5092576D36A /* Reachability.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tBDFBB01F3C921A41A6861154627D3BC2 /* DDXMLElementAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C72A96EA445BCC30461D886EB82B933 /* DDXMLElementAdditions.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tBEDE5883E03441DAB7010639C6B62633 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tBF8E6137595AE3D14FE2BD3E9448DDFD /* NSTimer+Blocks.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DA1DC59E7120A539FEE22F831718607 /* NSTimer+Blocks.m */; settings = {COMPILER_FLAGS = \"-fno-objc-arc -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tBF9BA87EFEB1661385681C47E3F5AF1F /* iconCamera@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AC1A18CA177672D8A580BB977F319E54 /* iconCamera@2x.png */; };\n\t\tC192B09BAEC8DD38B8CB80CD93975389 /* MRActivityIndicatorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 17720A8BD4F5BCD7E09F57623931BD13 /* MRActivityIndicatorView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tC2EC79B25C04BCAADAE17D889CED7191 /* GZIP.h in Headers */ = {isa = PBXBuildFile; fileRef = BB8FA3311E1FC23C6090A1C731C88ECA /* GZIP.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tC55B22B5563005DBE84409659356E8F3 /* Cancel.png in Resources */ = {isa = PBXBuildFile; fileRef = EEFF8A79DC5A9492432A56743B23C4B6 /* Cancel.png */; };\n\t\tC7159E5BEC3FE6CD6AD91367E54B4DFC /* MRNavigationBarProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = 45FF41D6BDF6E11A059B788B200B722F /* MRNavigationBarProgressView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tC8E714DEC1EFBF9A671A153FD1323CD9 /* AutoCoding-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1014873CE5A267EE78EF32E7C3623A0D /* AutoCoding-dummy.m */; };\n\t\tC9C1C9975CD980D1347B9581D654994C /* MRIconView.h in Headers */ = {isa = PBXBuildFile; fileRef = AA52707EAC4163C359919E1988C40D82 /* MRIconView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tCA8BF5345E764D249B03B1A6778AED0F /* Ok.png in Resources */ = {isa = PBXBuildFile; fileRef = 5C229F4D1AE1E699E161B2A736E4528E /* Ok.png */; };\n\t\tCCFF4CE602C8186E2465ADE936E75F08 /* IconGradient@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6884785630C444606191EAEE0335953D /* IconGradient@2x.png */; };\n\t\tCD37886F1CF48A1DE0D1AF047F7BD37A /* NSString+DDXML.m in Sources */ = {isa = PBXBuildFile; fileRef = E8B20B3C6EC5D1A466E8C968B4CB1E24 /* NSString+DDXML.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tCE3C10407C377723B454E62E5E9071DE /* MRIconView.m in Sources */ = {isa = PBXBuildFile; fileRef = A39C7E38D18397EBCA3BDBEBBC1F8040 /* MRIconView.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tCF06D2A6538A5E191A84AAD84742D4B2 /* FeedbackPlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E5A6D2AA5A41FA739A4A64DAF4B48 /* FeedbackPlaceholder.png */; };\n\t\tCF0EB4FA3E2FE68CF8A018EBA86E207B /* Reachability.h in Headers */ = {isa = PBXBuildFile; fileRef = 63B2FFBDAA0BCFB60BEEDD0491A92659 /* Reachability.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tD07FABF52BC4DA8B8D3C35DCAD6BC2BD /* authorize_denied@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 421ED62C794A9E0546B40E358558E390 /* authorize_denied@2x.png */; };\n\t\tD16E811FC9BA80554A32C10AD954B70F /* NSScanner+DTBonjour.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B3E359A463BB3DB2A99A543B8BEC59D /* NSScanner+DTBonjour.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tD1D927CF7E659A0B1815BB61B35E1570 /* NSTimer-Blocks-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A37E6F5741D172360FA7B22E9F01D35 /* NSTimer-Blocks-dummy.m */; };\n\t\tD424DBAFC12C066FB827DF6315A0C91E /* SAMKeychainQuery.m in Sources */ = {isa = PBXBuildFile; fileRef = BD967CD1C081B5DA9BECCDFFBA9319CE /* SAMKeychainQuery.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tD4560C8A16C01866A8AEAD4892BCF1BD /* DTBonjour-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C401F14E53F1C4870BEB3381C6D54579 /* DTBonjour-dummy.m */; };\n\t\tD9DB9A0DC2D5A3BEC0E109C05F043159 /* DDXMLPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = D3841F3FBF33B7C7D1BDEA417D91ED62 /* DDXMLPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tD9DEFA783A3190B4261843DCF2D07E6E /* feedbackActivity@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 48368853A0A8199BC5BD6A5397B1344E /* feedbackActivity@3x.png */; };\n\t\tDCDE75E49B50C393C41A66D3927B06AC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E3ACC3A782EE164785E86967FACC244F /* UIKit.framework */; };\n\t\tDDC7B4901BAFE62B6B02777D1FA029F4 /* bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 2953817723BAABC8B278A3FE47611D49 /* bg.png */; };\n\t\tDE195C6B0A51D74321ACFB0753A5103A /* NSScanner+DTBonjour.h in Headers */ = {isa = PBXBuildFile; fileRef = A70CF4757CD2D19314F51680E96A6786 /* NSScanner+DTBonjour.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tDF5CA96D75DE782922428FC9B9E267A6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tDFCF0AEF50D13905848D5997FBC23C70 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B7F8D73EF73FF675B9541CF7B7BD97E8 /* Security.framework */; };\n\t\tE1722F47CCAC21E8C52AA49AEF76A1B6 /* MRProgressHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CDDF3DE08AAF193E867E5040D4E03B8 /* MRProgressHelper.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tE18F6605DAF832B7261E79F0D0EDFEB6 /* UIImage+MRImageEffects.m in Sources */ = {isa = PBXBuildFile; fileRef = BE17F235D79FFEA0208C1847C3E6654A /* UIImage+MRImageEffects.m */; settings = {COMPILER_FLAGS = \"-w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tE244908082C989A96CA733AD2B3C78AB /* Arrow@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = BD8370551B8BABF39C40F05B9DEF55AD /* Arrow@3x.png */; };\n\t\tE2E7D79D78E4D6AB18B12DCC37DFEDF6 /* DTBonjourDataChunk.m in Sources */ = {isa = PBXBuildFile; fileRef = 518B833B1BDC96EE623B316223A80765 /* DTBonjourDataChunk.m */; settings = {COMPILER_FLAGS = \"-DOS_OBJECT_USE_OBJC=0 -w -Xanalyzer -analyzer-disable-all-checks\"; }; };\n\t\tE3DB322DFB959703663BD7AD832BDC84 /* DTBonjourDataConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 1645122B7C1D19C1CBAD6F2F746A5024 /* DTBonjourDataConnection.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tE68543F94BD803BC8CBCBED631200D86 /* MRActivityIndicatorView.h in Headers */ = {isa = PBXBuildFile; fileRef = 07CCA2A0B006C869AC168407A9725252 /* MRActivityIndicatorView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tE6871224E4CB6F0DA7EFA85D88B47AD0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D1BE16E6940C989E8EF125530AB4C19 /* CoreGraphics.framework */; };\n\t\tE73EF571CD8815DD2FE9BF9B838DE381 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tE9D9C5D81A1F34DDFA3616AE91D71385 /* MRStopableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B579D9ED608B0A8DC82E0B6E3CB3119 /* MRStopableView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tEAA89C7822E5AA63B57E6C5EC99C4540 /* MRProgressView.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D4F92FBA40FA6EFE37243D138C3D73 /* MRProgressView.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tEC5D8DB4D41E516C0358D7D3E47CCE1F /* DDXMLNode.h in Headers */ = {isa = PBXBuildFile; fileRef = C4EEB16666A69263B9B87D10651858EE /* DDXMLNode.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tECAE78B15FAE7AF144F6EA0A1F03AF16 /* Ok@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 2C7781421F0C6F705465EB57E65A7FBD /* Ok@3x.png */; };\n\t\tEEBE916DB2F225C07EF64E2D05060418 /* authorize_denied.png in Resources */ = {isa = PBXBuildFile; fileRef = 1CA5ADAB472DD913F3324C20A9A2ACFE /* authorize_denied.png */; };\n\t\tF7349B6AF64B819542882675D67BF635 /* JGMethodSwizzler.h in Headers */ = {isa = PBXBuildFile; fileRef = 36F1C73A4272D99CAED19FA99EB46267 /* JGMethodSwizzler.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tF876156A55100257E422EC08CE7D033C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n\t\tFC3045CA8195C0BF3460910978BEE9B2 /* feedbackActivity.png in Resources */ = {isa = PBXBuildFile; fileRef = AA94AB8D9954BB8B1535D61C6DA8E745 /* feedbackActivity.png */; };\n\t\tFC47EF9FDA1D446D5BDF4EC3FD6A8C21 /* DDXMLDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = AFEE7BBB3FB8F12EF74E02765AC250DF /* DDXMLDocument.h */; settings = {ATTRIBUTES = (Project, ); }; };\n\t\tFC564636874AD3B5AE4875F60242713D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t0164EE61A588E9DA58A5ED2F8A43D775 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6B79ACF002EDBC3062BBBF2EFE601A77;\n\t\t\tremoteInfo = AutoCoding;\n\t\t};\n\t\t0A010E712E16F1BABE3FFE60D65BDD41 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 85407D653E1E1525EECFECD395E9C4BC;\n\t\t\tremoteInfo = KissXML;\n\t\t};\n\t\t0BD3AF11070D61A2B9202F89F2D8B132 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = DADAF06B5E16CD200A3DE165E9BA39E1;\n\t\t\tremoteInfo = \"UIAlertView+Blocks\";\n\t\t};\n\t\t126242EDC27747F1B05914816285C84E /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6B79ACF002EDBC3062BBBF2EFE601A77;\n\t\t\tremoteInfo = AutoCoding;\n\t\t};\n\t\t18A5E93AC00668AE563E024377383F06 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = E7D82D1B5D56CA867A0AD3B41611D15F;\n\t\t\tremoteInfo = DTBonjour;\n\t\t};\n\t\t24975C0EB4271870CCBB8411831C4791 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 5437890023F30CA85DFCA260CA914D48;\n\t\t\tremoteInfo = DZNEmptyDataSet;\n\t\t};\n\t\t287341CC8385E6E015D8FBAD1D8E6F76 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C587F1B2FA2CB38A29F84936DEFD569D;\n\t\t\tremoteInfo = \"HockeySDK-HockeySDKResources\";\n\t\t};\n\t\t46039A0327730D97650BD3FA503FC6FF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 51B8BD3A7215E1C49BDFF9624C81C122;\n\t\t\tremoteInfo = Reachability;\n\t\t};\n\t\t4930B72C00D5A4522AEAF45A91FE28A7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 51B8BD3A7215E1C49BDFF9624C81C122;\n\t\t\tremoteInfo = Reachability;\n\t\t};\n\t\t4EC09E8966CB2CE6AC85C2D026B2AC03 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = E7D82D1B5D56CA867A0AD3B41611D15F;\n\t\t\tremoteInfo = DTBonjour;\n\t\t};\n\t\t5D9806CFBCC7DEE9D3A9A4BF2B611125 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7C214356709EB3EA286F3E87E9ABE638;\n\t\t\tremoteInfo = JGMethodSwizzler;\n\t\t};\n\t\t673175C622B6C2DD473C07E065FBC5BE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 84595B87540703321C4F92ED4C7575FE;\n\t\t\tremoteInfo = MRProgress;\n\t\t};\n\t\t7E37BC20B54CC453EC94D2A33BBE7E32 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B2F85E59A9E8D81925672C4C86FFB341;\n\t\t\tremoteInfo = \"UIActionSheet+Blocks\";\n\t\t};\n\t\t8A5DC2557384E1EE688F595E0BBEB627 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 85407D653E1E1525EECFECD395E9C4BC;\n\t\t\tremoteInfo = KissXML;\n\t\t};\n\t\t91F58B28666440A7CAA0E9B0436FACAA /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B2F85E59A9E8D81925672C4C86FFB341;\n\t\t\tremoteInfo = \"UIActionSheet+Blocks\";\n\t\t};\n\t\t91FD28CD77F598923CA6DE04F1DC7F66 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = DADAF06B5E16CD200A3DE165E9BA39E1;\n\t\t\tremoteInfo = \"UIAlertView+Blocks\";\n\t\t};\n\t\tA52BBC4252D6C5812FBB2598931673F4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FA90B05AA5C2F1ADFD061D57E35B0F7A;\n\t\t\tremoteInfo = \"NSTimer-Blocks\";\n\t\t};\n\t\tAA45C3B8D919C565A0D184957BBC1276 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 001BC949C81D3446CC112FB2A6823CA6;\n\t\t\tremoteInfo = SAMKeychain;\n\t\t};\n\t\tACC57718D77DB15712A61B3367F59B05 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 5437890023F30CA85DFCA260CA914D48;\n\t\t\tremoteInfo = DZNEmptyDataSet;\n\t\t};\n\t\tB2E376447672E5AEED15D7EC8A094297 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 84595B87540703321C4F92ED4C7575FE;\n\t\t\tremoteInfo = MRProgress;\n\t\t};\n\t\tB59F03ECB0F3301FF34FB07614CDF203 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 001BC949C81D3446CC112FB2A6823CA6;\n\t\t\tremoteInfo = SAMKeychain;\n\t\t};\n\t\tB76B94CC2B23C0E485E85A53B152D741 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = FA90B05AA5C2F1ADFD061D57E35B0F7A;\n\t\t\tremoteInfo = \"NSTimer-Blocks\";\n\t\t};\n\t\tC0DDED5DC8F23722FC319E6E179D14CC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7C214356709EB3EA286F3E87E9ABE638;\n\t\t\tremoteInfo = JGMethodSwizzler;\n\t\t};\n\t\tCA39055B88F944B9B875F5107E9B50F6 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9A07BB0F2F4F1B91893B1C6FBF5370AD;\n\t\t\tremoteInfo = GZIP;\n\t\t};\n\t\tEDC243D81097BD6385F6345BA2612301 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 9A07BB0F2F4F1B91893B1C6FBF5370AD;\n\t\t\tremoteInfo = GZIP;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t00427DC215BF331D73E31001803C8DDC /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = tr.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/tr.lproj\"; sourceTree = \"<group>\"; };\n\t\t007D63F5AABE7790C903F3DC108A31D5 /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = pt.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/pt.lproj\"; sourceTree = \"<group>\"; };\n\t\t0274AEF88C9BC8DA1938920F92C33DB9 /* KissXML-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"KissXML-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t02FB990DEDD7795680D048211CB19901 /* Pods-Dash-Dash App Store-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-Dash-Dash App Store-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t078A11A36977A19957A5C54135D7EF40 /* SAMKeychain.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SAMKeychain.m; path = Sources/SAMKeychain.m; sourceTree = \"<group>\"; };\n\t\t07CCA2A0B006C869AC168407A9725252 /* MRActivityIndicatorView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRActivityIndicatorView.h; path = src/Components/MRActivityIndicatorView.h; sourceTree = \"<group>\"; };\n\t\t0935593CAB20501BD1E56377C947C5F2 /* authorize_denied@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"authorize_denied@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/authorize_denied@3x.png\"; sourceTree = \"<group>\"; };\n\t\t0A930A77657403D3EAB840F80B666B4A /* buttonRoundedDelete@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"buttonRoundedDelete@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedDelete@2x.png\"; sourceTree = \"<group>\"; };\n\t\t0D00F6FD7848428B8380399EA18E45D7 /* libDZNEmptyDataSet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libDZNEmptyDataSet.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t0D4E5A6D2AA5A41FA739A4A64DAF4B48 /* FeedbackPlaceholder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = FeedbackPlaceholder.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/FeedbackPlaceholder.png\"; sourceTree = \"<group>\"; };\n\t\t0DD58F6D94984607D0AE20D22F5D54EE /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/en.lproj\"; sourceTree = \"<group>\"; };\n\t\t1014873CE5A267EE78EF32E7C3623A0D /* AutoCoding-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"AutoCoding-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t104F93417FF54A8015815E19065F0062 /* libReachability.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReachability.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t111DCA0E215404B364A727C3CCA014DE /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; };\n\t\t125B50749BE411DCEA57A84C1CC2180A /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = es.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/es.lproj\"; sourceTree = \"<group>\"; };\n\t\t12883A78A65F5415395681C1CCE2FB7B /* libAutoCoding.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAutoCoding.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1319FABFAF429EBF07CBD56B85E48AAF /* UIImage+MRImageEffects.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"UIImage+MRImageEffects.h\"; path = \"src/Blur/UIImage+MRImageEffects.h\"; sourceTree = \"<group>\"; };\n\t\t1645122B7C1D19C1CBAD6F2F746A5024 /* DTBonjourDataConnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBonjourDataConnection.h; path = Core/Source/DTBonjourDataConnection.h; sourceTree = \"<group>\"; };\n\t\t167262C4CC62DD8EEDCFC1955DF8352C /* MRProgressOverlayView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRProgressOverlayView.m; path = src/Components/MRProgressOverlayView.m; sourceTree = \"<group>\"; };\n\t\t16A9095C5D2C1E81A11E77AF578A361F /* Cancel@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Cancel@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Cancel@3x.png\"; sourceTree = \"<group>\"; };\n\t\t16CE2E9B4DFC59E2E4E29137CC201E55 /* libMRProgress.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMRProgress.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t17720A8BD4F5BCD7E09F57623931BD13 /* MRActivityIndicatorView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRActivityIndicatorView.m; path = src/Components/MRActivityIndicatorView.m; sourceTree = \"<group>\"; };\n\t\t184828C342E650079B44F9E43E9B2D8F /* UIScrollView+EmptyDataSet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"UIScrollView+EmptyDataSet.h\"; path = \"Source/UIScrollView+EmptyDataSet.h\"; sourceTree = \"<group>\"; };\n\t\t1CA5ADAB472DD913F3324C20A9A2ACFE /* authorize_denied.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = authorize_denied.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/authorize_denied.png\"; sourceTree = \"<group>\"; };\n\t\t1F77501C77980C070A24246E7E7CC798 /* Arrow@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Arrow@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Arrow@2x.png\"; sourceTree = \"<group>\"; };\n\t\t242D40001D15A908970377E06670D4DD /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ja.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/ja.lproj\"; sourceTree = \"<group>\"; };\n\t\t263A035D1A87573CE7D88C51C54BB9D6 /* Pods-Dash-Dash App Store-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-Dash-Dash App Store-resources.sh\"; sourceTree = \"<group>\"; };\n\t\t2953817723BAABC8B278A3FE47611D49 /* bg.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = bg.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/bg.png\"; sourceTree = \"<group>\"; };\n\t\t298616DAB1D04723062721867EF9AB65 /* feedbackActivity@2x~ipad.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"feedbackActivity@2x~ipad.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/feedbackActivity@2x~ipad.png\"; sourceTree = \"<group>\"; };\n\t\t2ADF772269945129B056D0AE37CDB31F /* Pods-Dash-Dash App Store-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-Dash-Dash App Store-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t2C7781421F0C6F705465EB57E65A7FBD /* Ok@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Ok@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Ok@3x.png\"; sourceTree = \"<group>\"; };\n\t\t2CDDF3DE08AAF193E867E5040D4E03B8 /* MRProgressHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRProgressHelper.h; path = src/Utils/MRProgressHelper.h; sourceTree = \"<group>\"; };\n\t\t2D04033CB1601E077C86887D0D6D84D2 /* MRCircularProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRCircularProgressView.m; path = src/Components/MRCircularProgressView.m; sourceTree = \"<group>\"; };\n\t\t2F180F4A30921E1AAAAB3216CB244920 /* MRProgress.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MRProgress.xcconfig; sourceTree = \"<group>\"; };\n\t\t2F2216C81601AF4BF010CE1A174A879E /* GZIP.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = GZIP.xcconfig; sourceTree = \"<group>\"; };\n\t\t30A682094EF85215E80C0AA858590D5A /* Pods-Dash-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-Dash-resources.sh\"; sourceTree = \"<group>\"; };\n\t\t3411FBDB6BE077EAE97267E435727674 /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = hu.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/hu.lproj\"; sourceTree = \"<group>\"; };\n\t\t36D0457643AFCA2E67CC859EAB335411 /* UIActionSheet+Blocks-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIActionSheet+Blocks-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t36F1C73A4272D99CAED19FA99EB46267 /* JGMethodSwizzler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = JGMethodSwizzler.h; path = JGMethodSwizzler/JGMethodSwizzler.h; sourceTree = \"<group>\"; };\n\t\t3ACAAC89AB84785236B215C9F17E8475 /* buttonRoundedRegular@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"buttonRoundedRegular@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedRegular@2x.png\"; sourceTree = \"<group>\"; };\n\t\t3C2CD094483D9DBEA19C1E03D3878998 /* feedbackActivity~ipad.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"feedbackActivity~ipad.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/feedbackActivity~ipad.png\"; sourceTree = \"<group>\"; };\n\t\t3C39B4364B7076B8908B8B116F624AE1 /* AutoCoding.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AutoCoding.xcconfig; sourceTree = \"<group>\"; };\n\t\t3C43D6F6CF04E4DF3FCB39583BBCA819 /* MRNavigationBarProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRNavigationBarProgressView.m; path = src/Components/MRNavigationBarProgressView.m; sourceTree = \"<group>\"; };\n\t\t3E531164633FB25AF4591712A3E2040B /* Pods-Dash.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-Dash.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3EA7B9794EAC1626D8BCEFDDEBDA65FC /* README.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = README.markdown; sourceTree = \"<group>\"; };\n\t\t3EBD7F7E716F02FB1C5BF8DCF344028C /* UIScrollView+EmptyDataSet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"UIScrollView+EmptyDataSet.m\"; path = \"Source/UIScrollView+EmptyDataSet.m\"; sourceTree = \"<group>\"; };\n\t\t402CD7D79C53993504224FFD906784F7 /* Rectangle@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Rectangle@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Rectangle@3x.png\"; sourceTree = \"<group>\"; };\n\t\t421ED62C794A9E0546B40E358558E390 /* authorize_denied@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"authorize_denied@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/authorize_denied@2x.png\"; sourceTree = \"<group>\"; };\n\t\t42A5ED7A06A1F44A3B591C8661D352C5 /* GZIP-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"GZIP-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t44F031A13DB563B10BB3B79F5DB6D457 /* KissXML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KissXML.h; path = KissXML/KissXML.h; sourceTree = \"<group>\"; };\n\t\t45FF41D6BDF6E11A059B788B200B722F /* MRNavigationBarProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRNavigationBarProgressView.h; path = src/Components/MRNavigationBarProgressView.h; sourceTree = \"<group>\"; };\n\t\t48368853A0A8199BC5BD6A5397B1344E /* feedbackActivity@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"feedbackActivity@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/feedbackActivity@3x.png\"; sourceTree = \"<group>\"; };\n\t\t4852430BC0B8E1AEB6415242ECE72CE8 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = de.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/de.lproj\"; sourceTree = \"<group>\"; };\n\t\t4B3E359A463BB3DB2A99A543B8BEC59D /* NSScanner+DTBonjour.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"NSScanner+DTBonjour.m\"; path = \"Core/Source/NSScanner+DTBonjour.m\"; sourceTree = \"<group>\"; };\n\t\t4BDDDA9801ED8E936ECCEB03CE42CCC1 /* Pods-Dash-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-Dash-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\t4C5B1721C029840798C6D4B95ACD9610 /* NSString+DDXML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"NSString+DDXML.h\"; sourceTree = \"<group>\"; };\n\t\t4D1BE16E6940C989E8EF125530AB4C19 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };\n\t\t4D77F184C03D91F974EDD54234A8532F /* libUIActionSheet+Blocks.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libUIActionSheet+Blocks.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4DA1DC59E7120A539FEE22F831718607 /* NSTimer+Blocks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"NSTimer+Blocks.m\"; sourceTree = \"<group>\"; };\n\t\t4EA76B35B5EFCFCC2D7A6FBA787A0281 /* Rectangle.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = Rectangle.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Rectangle.png\"; sourceTree = \"<group>\"; };\n\t\t5149FA3EF9E34B3B97B49EB283ABE386 /* DDXMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DDXMLElement.m; path = KissXML/DDXMLElement.m; sourceTree = \"<group>\"; };\n\t\t518B833B1BDC96EE623B316223A80765 /* DTBonjourDataChunk.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBonjourDataChunk.m; path = Core/Source/DTBonjourDataChunk.m; sourceTree = \"<group>\"; };\n\t\t51ADAA8BD14FAC550BE559B2970EE3EB /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = \"zh-Hans.lproj\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/zh-Hans.lproj\"; sourceTree = \"<group>\"; };\n\t\t52FAA1D716B7929A5AB210EB862FD10D /* MRProgress-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"MRProgress-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t5573F0DE5EE0EFC5576DFF2BFEC35473 /* iconCamera.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = iconCamera.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/iconCamera.png\"; sourceTree = \"<group>\"; };\n\t\t59D174E1055905F5E1E04D18D9EED9E3 /* KissXML-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"KissXML-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t5A484AA1F3A0F563D5C35282AB23BFF9 /* UIAlertView+Blocks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIAlertView+Blocks.h\"; sourceTree = \"<group>\"; };\n\t\t5B97DA14CFEF7F35F40C406F7B2660F9 /* JGMethodSwizzler-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"JGMethodSwizzler-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t5B983C0171A4ACCE151173377A894AC7 /* Reachability.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Reachability.xcconfig; sourceTree = \"<group>\"; };\n\t\t5C229F4D1AE1E699E161B2A736E4528E /* Ok.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = Ok.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Ok.png\"; sourceTree = \"<group>\"; };\n\t\t5EF8CC25C4AF762DA94D4BC3C49DCBA1 /* Pods-Dash-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-Dash-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t5F05719C0A4ED06B6A9FAA13E6412205 /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = hr.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/hr.lproj\"; sourceTree = \"<group>\"; };\n\t\t60CA7517D8BA2908E199144352AB9689 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = it.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/it.lproj\"; sourceTree = \"<group>\"; };\n\t\t61D67F36EFBCDAE64CE95CC93EDF2B64 /* MRBlurView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRBlurView.h; path = src/Blur/MRBlurView.h; sourceTree = \"<group>\"; };\n\t\t6227C089A698144A5EF2C6D22F01E6AF /* NSTimer-Blocks-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"NSTimer-Blocks-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t6261DFE8DE9FACDDBFDE0B1D82C5B5F7 /* SAMKeychain.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"wrapper.plug-in\"; name = SAMKeychain.bundle; path = Support/SAMKeychain.bundle; sourceTree = \"<group>\"; };\n\t\t6272C9EFE296101A3F185978C4423465 /* UIActionSheet+Blocks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIActionSheet+Blocks.h\"; sourceTree = \"<group>\"; };\n\t\t63340E6208CA7F26315EA524567E6FD3 /* libKissXML.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKissXML.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t636E33A1ED095F06B4D35A871DB9197D /* MRProgress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRProgress.h; path = src/MRProgress.h; sourceTree = \"<group>\"; };\n\t\t63B2FFBDAA0BCFB60BEEDD0491A92659 /* Reachability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Reachability.h; sourceTree = \"<group>\"; };\n\t\t64AA64B7B06D4A8E152A59D27B5EAF96 /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = nb.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/nb.lproj\"; sourceTree = \"<group>\"; };\n\t\t660962AE7AEA8D479F024714416FBF35 /* MRProgress.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = MRProgress.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t68813D21DEEDD9FCDD1416745FD62E2A /* SAMKeychain-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SAMKeychain-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t6884785630C444606191EAEE0335953D /* IconGradient@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"IconGradient@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/IconGradient@2x.png\"; sourceTree = \"<group>\"; };\n\t\t68DEDCDFCAC92C6BD32372EE4FD80C79 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = \"<group>\"; };\n\t\t693DA89A0FA04668E2177ADD93C1A58E /* IconGradient.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = IconGradient.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/IconGradient.png\"; sourceTree = \"<group>\"; };\n\t\t6C1051EF8A14FB127CF765CA63883E32 /* Blur@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Blur@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Blur@3x.png\"; sourceTree = \"<group>\"; };\n\t\t6C72A96EA445BCC30461D886EB82B933 /* DDXMLElementAdditions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = DDXMLElementAdditions.m; sourceTree = \"<group>\"; };\n\t\t6DB335F79D3A762AB892FAF86D4C44EC /* libGZIP.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libGZIP.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7083AE4B09F2A83953471EB9AA73DEBA /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\t729DFAE1293D7006E08BDC51559A135D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };\n\t\t73C40F0679B91FF496574BD8B55234C2 /* buttonRoundedRegularHighlighted.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = buttonRoundedRegularHighlighted.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedRegularHighlighted.png\"; sourceTree = \"<group>\"; };\n\t\t73FC0BFFD1ED9DB968A2881BE528C162 /* Pods-Dash-Dash App Store.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-Dash-Dash App Store.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t74C52195D46C2D8F35146299BEC3F1E4 /* MRProgressView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRProgressView.m; path = src/Components/MRProgressView.m; sourceTree = \"<group>\"; };\n\t\t754B9BD1B02C9A8659E3707875DA4E8A /* SAMKeychain-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"SAMKeychain-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t77CD3F0BBDCDB52C6E980131B9A7AFF7 /* Pods-Dash-Dash App Store-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-Dash-Dash App Store-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t7839D880CB8ADECD7A1C9FEEC6F63368 /* SAMKeychainQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SAMKeychainQuery.h; path = Sources/SAMKeychainQuery.h; sourceTree = \"<group>\"; };\n\t\t7A1887F6B4B8E99B029DC9144D5C73F8 /* DTBonjour.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = DTBonjour.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t7A37E6F5741D172360FA7B22E9F01D35 /* NSTimer-Blocks-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"NSTimer-Blocks-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t7B693AE6C516B7139BFB9B06EA9F989E /* DDXMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DDXMLElement.h; path = KissXML/DDXMLElement.h; sourceTree = \"<group>\"; };\n\t\t7C8171B1BF9B855FC505C05388580C8E /* Reachability-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Reachability-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t8406BEBB173DF21821755A3088B7BD93 /* DTBonjourDataConnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBonjourDataConnection.m; path = Core/Source/DTBonjourDataConnection.m; sourceTree = \"<group>\"; };\n\t\t85CDF0B04D620505A5756242E236179C /* libDTBonjour.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libDTBonjour.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t86D4F92FBA40FA6EFE37243D138C3D73 /* MRProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRProgressView.h; path = src/Components/MRProgressView.h; sourceTree = \"<group>\"; };\n\t\t88AFEC1F5BCE183847916970F0B9EA45 /* HockeySDKResources.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HockeySDKResources.bundle; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t88D6F9DA1B5061AF8576CCED8AF85F8E /* buttonRoundedDeleteHighlighted.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = buttonRoundedDeleteHighlighted.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted.png\"; sourceTree = \"<group>\"; };\n\t\t8A3A5F273B5E22901C3906A48429B40C /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = ru.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/ru.lproj\"; sourceTree = \"<group>\"; };\n\t\t8A48CB1008AEC858377AD5E8A777C7C4 /* GZIP-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"GZIP-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t8C1524368196FCDD680FD5092576D36A /* Reachability.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Reachability.m; sourceTree = \"<group>\"; };\n\t\t8D6BFEE74158C79C4874E33413294655 /* feedbackActivity@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"feedbackActivity@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/feedbackActivity@2x.png\"; sourceTree = \"<group>\"; };\n\t\t8EF48A9D4A7F2C1EE8A77563376FD7B3 /* pt-PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = \"pt-PT.lproj\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/pt-PT.lproj\"; sourceTree = \"<group>\"; };\n\t\t92C886CBB2A6E30B0C45FE3D37172CF0 /* MRBlurView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRBlurView.m; path = src/Blur/MRBlurView.m; sourceTree = \"<group>\"; };\n\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t93B457B27E1D2F99D3CE8B924FD1DB87 /* libPods-Dash.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-Dash.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9622D82B702FFE25DE90D0B472DA1DBB /* NSData+GZIP.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"NSData+GZIP.m\"; path = \"GZIP/NSData+GZIP.m\"; sourceTree = \"<group>\"; };\n\t\t983473DA2AEB53A34C6BDE44801A0926 /* SAMKeychain.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SAMKeychain.xcconfig; sourceTree = \"<group>\"; };\n\t\t99B1109AA360471E3B83AB5CEE4440DC /* fa.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fa.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/fa.lproj\"; sourceTree = \"<group>\"; };\n\t\t9B579D9ED608B0A8DC82E0B6E3CB3119 /* MRStopableView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRStopableView.h; path = src/Components/MRStopableView.h; sourceTree = \"<group>\"; };\n\t\t9B7FFA9A67DCAEE70ECEC2B32E26CBBC /* Rectangle@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Rectangle@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Rectangle@2x.png\"; sourceTree = \"<group>\"; };\n\t\t9E5F6CE32A36BC8DEA995312D44E1ADB /* DDXMLElementAdditions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = DDXMLElementAdditions.h; sourceTree = \"<group>\"; };\n\t\t9E86AD1EAE16ECA8F8DBCAA046CD33BC /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = fr.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/fr.lproj\"; sourceTree = \"<group>\"; };\n\t\t9F35EDB4796A73D77330A2A701E63F2A /* UIActionSheet+Blocks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIActionSheet+Blocks.m\"; sourceTree = \"<group>\"; };\n\t\tA004D7E225481204C8932863C0E33FFD /* DTBonjourDataChunk.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBonjourDataChunk.h; path = Core/Source/DTBonjourDataChunk.h; sourceTree = \"<group>\"; };\n\t\tA05816C2C257E2501D17B6FAE6306F1B /* MRProgress-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"MRProgress-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tA19D1BDEF431C39A662FC3908CCCA8EF /* Reachability-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Reachability-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tA2094A9ED71A519FFC1F65E0B8A4EF88 /* NSTimer-Blocks.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"NSTimer-Blocks.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA29A2C0C6BF351E0E3C368ED1B22A0F4 /* DTBonjourServer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBonjourServer.h; path = Core/Source/DTBonjourServer.h; sourceTree = \"<group>\"; };\n\t\tA39C7E38D18397EBCA3BDBEBBC1F8040 /* MRIconView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRIconView.m; path = src/Components/MRIconView.m; sourceTree = \"<group>\"; };\n\t\tA56082E65CB34E180CD590F16B6DF2EB /* DTBonjourServer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBonjourServer.m; path = Core/Source/DTBonjourServer.m; sourceTree = \"<group>\"; };\n\t\tA70CF4757CD2D19314F51680E96A6786 /* NSScanner+DTBonjour.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"NSScanner+DTBonjour.h\"; path = \"Core/Source/NSScanner+DTBonjour.h\"; sourceTree = \"<group>\"; };\n\t\tA78824B8D9F60AC0533272DE93FA33EC /* MRCircularProgressView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRCircularProgressView.h; path = src/Components/MRCircularProgressView.h; sourceTree = \"<group>\"; };\n\t\tA81B6B069FB3BA856977A61B80C8F055 /* buttonRoundedDelete.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = buttonRoundedDelete.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedDelete.png\"; sourceTree = \"<group>\"; };\n\t\tA97A461F518B38480D9CE441E309B6DE /* SAMKeychain.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SAMKeychain.h; path = Sources/SAMKeychain.h; sourceTree = \"<group>\"; };\n\t\tAA52707EAC4163C359919E1988C40D82 /* MRIconView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRIconView.h; path = src/Components/MRIconView.h; sourceTree = \"<group>\"; };\n\t\tAA94AB8D9954BB8B1535D61C6DA8E745 /* feedbackActivity.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = feedbackActivity.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/feedbackActivity.png\"; sourceTree = \"<group>\"; };\n\t\tAC1A18CA177672D8A580BB977F319E54 /* iconCamera@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"iconCamera@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/iconCamera@2x.png\"; sourceTree = \"<group>\"; };\n\t\tACED789A2C3B1F688B59D6647D8B6151 /* JGMethodSwizzler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = JGMethodSwizzler.m; path = JGMethodSwizzler/JGMethodSwizzler.m; sourceTree = \"<group>\"; };\n\t\tAE7CB7424AEC5522A9E1846CAB39F444 /* buttonRoundedRegular.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = buttonRoundedRegular.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedRegular.png\"; sourceTree = \"<group>\"; };\n\t\tAFEE7BBB3FB8F12EF74E02765AC250DF /* DDXMLDocument.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DDXMLDocument.h; path = KissXML/DDXMLDocument.h; sourceTree = \"<group>\"; };\n\t\tB0429AB4876770E05E7189365C06DD3D /* DZNEmptyDataSet-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"DZNEmptyDataSet-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tB2717DCE71CEF0A019C7CCF232811610 /* LICENSE.txt */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE.txt; sourceTree = \"<group>\"; };\n\t\tB28D0494DC34E330FBC88D8F6750D067 /* libSAMKeychain.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSAMKeychain.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB2DD07B8E4DA803BB82C2501563D4675 /* Arrow.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = Arrow.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Arrow.png\"; sourceTree = \"<group>\"; };\n\t\tB33EF6D45895DB3AD613EA7307E2F025 /* AutoCoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AutoCoding.m; path = AutoCoding/AutoCoding.m; sourceTree = \"<group>\"; };\n\t\tB50EF1A0AB5CC4DCADF5ABCD8C9104FC /* NSData+GZIP.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"NSData+GZIP.h\"; path = \"GZIP/NSData+GZIP.h\"; sourceTree = \"<group>\"; };\n\t\tB5C0CDFBAE6AA9F471D9C08E1777ECFD /* Pods-Dash-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-Dash-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\tB6F235F3E87F30CDC1AB2EED0B2FF14B /* Pods-Dash.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-Dash.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tB72E9B277BBA4224515107FE5B775282 /* Pods-Dash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-Dash-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tB7F8D73EF73FF675B9541CF7B7BD97E8 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };\n\t\tB9ACB9F615FA8863E4B8B6009C096A49 /* KissXML.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; path = KissXML.podspec; sourceTree = \"<group>\"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\tBB8FA3311E1FC23C6090A1C731C88ECA /* GZIP.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GZIP.h; path = GZIP/GZIP.h; sourceTree = \"<group>\"; };\n\t\tBCF065EE3F16E2B292B353DAA32A7945 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = \"<group>\"; };\n\t\tBD8370551B8BABF39C40F05B9DEF55AD /* Arrow@3x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Arrow@3x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Arrow@3x.png\"; sourceTree = \"<group>\"; };\n\t\tBD967CD1C081B5DA9BECCDFFBA9319CE /* SAMKeychainQuery.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SAMKeychainQuery.m; path = Sources/SAMKeychainQuery.m; sourceTree = \"<group>\"; };\n\t\tBE17F235D79FFEA0208C1847C3E6654A /* UIImage+MRImageEffects.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"UIImage+MRImageEffects.m\"; path = \"src/Blur/UIImage+MRImageEffects.m\"; sourceTree = \"<group>\"; };\n\t\tBE360F248A0682F7D40B2353161D5483 /* Ok@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Ok@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Ok@2x.png\"; sourceTree = \"<group>\"; };\n\t\tBF032C7C6DA415681352D289149BCBF0 /* libNSTimer-Blocks.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libNSTimer-Blocks.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBF1FA01D0210D011E3D4EE235FBD4083 /* DTBonjour.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTBonjour.xcconfig; sourceTree = \"<group>\"; };\n\t\tBFDF824F36DFFB6F90C8157DAC66BA75 /* Pods-Dash-Dash App Store.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-Dash-Dash App Store.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tC09E24470CFB2781BA3A124B664ABC28 /* UIAlertView+Blocks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIAlertView+Blocks.m\"; sourceTree = \"<group>\"; };\n\t\tC232AA1C67EAB67DD980F99EB1D6A8B5 /* DDXMLNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DDXMLNode.m; path = KissXML/DDXMLNode.m; sourceTree = \"<group>\"; };\n\t\tC401F14E53F1C4870BEB3381C6D54579 /* DTBonjour-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"DTBonjour-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tC408198D9D085441B2287D6A9913CC4D /* JGMethodSwizzler.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JGMethodSwizzler.xcconfig; sourceTree = \"<group>\"; };\n\t\tC4EEB16666A69263B9B87D10651858EE /* DDXMLNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DDXMLNode.h; path = KissXML/DDXMLNode.h; sourceTree = \"<group>\"; };\n\t\tC681197DEBD6E2C5856051E22CAB73A8 /* DZNEmptyDataSet.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DZNEmptyDataSet.xcconfig; sourceTree = \"<group>\"; };\n\t\tC7EFACEA351E50B925CFA7DA44D34A2A /* UIAlertView+Blocks.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"UIAlertView+Blocks.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tC8F2241DB3EFEA1ECDE407C702D42988 /* buttonRoundedRegularHighlighted@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"buttonRoundedRegularHighlighted@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedRegularHighlighted@2x.png\"; sourceTree = \"<group>\"; };\n\t\tC967E2A2120811E20A72E972240F9A5D /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = nl.lproj; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/nl.lproj\"; sourceTree = \"<group>\"; };\n\t\tCA815B34AC5025B2CCDE6EFAA6D2ABCC /* DZNEmptyDataSet-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"DZNEmptyDataSet-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tCBCE3D6A139383B2A321AFB875F969D1 /* MRStopButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRStopButton.h; path = src/Components/MRStopButton.h; sourceTree = \"<group>\"; };\n\t\tCE60BD25CF976A3E6D1E94CDDDA66886 /* NSTimer+Blocks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"NSTimer+Blocks.h\"; sourceTree = \"<group>\"; };\n\t\tCFC19E7A4DCD20CC657DB6550AC6D7FE /* UIActionSheet+Blocks-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIActionSheet+Blocks-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tD27D6F1E0CF866727C3740CE96B1B2A0 /* libPods-Dash-Dash App Store.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-Dash-Dash App Store.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD3841F3FBF33B7C7D1BDEA417D91ED62 /* DDXMLPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = DDXMLPrivate.h; sourceTree = \"<group>\"; };\n\t\tD457B2251162C0E67ABF48ADE98881E9 /* buttonRoundedDeleteHighlighted@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"buttonRoundedDeleteHighlighted@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/buttonRoundedDeleteHighlighted@2x.png\"; sourceTree = \"<group>\"; };\n\t\tD47480CA92189F8FFFE6F58884F70EC1 /* UIAlertView+Blocks-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"UIAlertView+Blocks-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tD86D3E3A8D8DF90491F44982FEE9B621 /* DDXMLDocument.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DDXMLDocument.m; path = KissXML/DDXMLDocument.m; sourceTree = \"<group>\"; };\n\t\tD883A6285BBA55CE226C8006DFE25741 /* KissXML.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KissXML.xcconfig; sourceTree = \"<group>\"; };\n\t\tD970DC1A1D23C5DB5ACCD77C19AC40A3 /* MRProgressOverlayView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MRProgressOverlayView.h; path = src/Components/MRProgressOverlayView.h; sourceTree = \"<group>\"; };\n\t\tDD5134FBB59949CD358CEF56FC63FBF0 /* libUIAlertView+Blocks.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libUIAlertView+Blocks.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE0D011EECF654F0D23E651C01727DAE4 /* ResourceBundle-HockeySDKResources-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"ResourceBundle-HockeySDKResources-Info.plist\"; sourceTree = \"<group>\"; };\n\t\tE1BF51E4F141D965E503C17CD28F8928 /* HockeySDK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = HockeySDK.framework; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDK.framework\"; sourceTree = \"<group>\"; };\n\t\tE321DBA159DF0D82D35F57AAFA8A09BC /* AutoCoding-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"AutoCoding-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tE37B159BB6C3FF3E8DF4D592A363E1B1 /* Cancel@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Cancel@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Cancel@2x.png\"; sourceTree = \"<group>\"; };\n\t\tE3ACC3A782EE164785E86967FACC244F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\tE3C0339612EEB4C486E0B74AD9F79581 /* DTBonjour-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"DTBonjour-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tE7EB241F08BEEECDE7CACE0C66BE39FB /* Blur.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = Blur.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Blur.png\"; sourceTree = \"<group>\"; };\n\t\tE8B20B3C6EC5D1A466E8C968B4CB1E24 /* NSString+DDXML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"NSString+DDXML.m\"; sourceTree = \"<group>\"; };\n\t\tE9882BEB273105CC10726B7609551527 /* UIActionSheet+Blocks.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"UIActionSheet+Blocks.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tED83AD26BD55125C060D6E875C69B1E8 /* AppIconPlaceHolder.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = AppIconPlaceHolder.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/AppIconPlaceHolder.png\"; sourceTree = \"<group>\"; };\n\t\tED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\tEEFF8A79DC5A9492432A56743B23C4B6 /* Cancel.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = Cancel.png; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Cancel.png\"; sourceTree = \"<group>\"; };\n\t\tEF0CF7A976C3D78E1ACE7E293A6F9583 /* AutoCoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AutoCoding.h; path = AutoCoding/AutoCoding.h; sourceTree = \"<group>\"; };\n\t\tF0C14F0B0C87E929D045BF18FC651FEA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };\n\t\tF0E409DCFE40B89D7044376537E203F2 /* Pods-Dash-Dash App Store-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-Dash-Dash App Store-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tF448AA8EA61FAC4CBE9F713DE167453D /* libJGMethodSwizzler.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libJGMethodSwizzler.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF9758AF256673B8B65649B7C71720E98 /* UIAlertView+Blocks-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"UIAlertView+Blocks-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tF9D0473AB76A1A46053CDF6788B84CA3 /* DDXML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DDXML.h; path = KissXML/DDXML.h; sourceTree = \"<group>\"; };\n\t\tFA36C6DAEA517E4435ED1BC8D960F891 /* readme.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = readme.markdown; sourceTree = \"<group>\"; };\n\t\tFB90C025AE6C45BE9749ABEE1B6EF075 /* MRStopButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MRStopButton.m; path = src/Components/MRStopButton.m; sourceTree = \"<group>\"; };\n\t\tFD8515AAFE2D01DFD97B8765AAF84AD9 /* JGMethodSwizzler-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"JGMethodSwizzler-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tFEF042E3E9A768E7188F8CCC3355E0D5 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = \"<group>\"; };\n\t\tFF912C17DFB313013CB3A3BE2ED9E4B5 /* Blur@2x.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = \"Blur@2x.png\"; path = \"HockeySDK-iOS/HockeySDK.embeddedframework/HockeySDKResources.bundle/Blur@2x.png\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t07F9A2B76D80F3F87BA513132EEDB319 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t811B41DF52A68EC307C411FEE3E7EF74 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1151C52AFCC2B03BC2D493E621827010 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA55A152F73E3648DD16340517BC60C11 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t193103B8F8F6FFB0BD8F43815488878B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t712EC682C9E3729DA280454692B5E6D0 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t337A15437F2D8E9608BBC9A7F937EB94 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t15F556BBB8C5FD67AD2D7616A991615D /* Foundation.framework in Frameworks */,\n\t\t\t\tDCDE75E49B50C393C41A66D3927B06AC /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3D70A7F1F6A9B30FF91433F85C2A291F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9295CDBA01DF80B0AD00AFA507CEA67F /* Foundation.framework in Frameworks */,\n\t\t\t\tB141DE7F8C61881DDF9CCBB72F681A0C /* SystemConfiguration.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t47ED6F13E7DBE1E3CAF7C3880FE7543E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3ED9F3F11A9BE5EBDDA2FD31FC7CEA3B /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52241EECC4E4FA254010FF3C07D03C0C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tFC564636874AD3B5AE4875F60242713D /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8C0EF796FC450CFED13130EF2DD63F8D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA1F2C9D83A0B96B8C48E5DCF10A29C4E /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t902B8011750038C212E6AA09AAABD7DB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA9AA8BA6AAA5264E89D1CF42D9E0FE74 /* CoreFoundation.framework in Frameworks */,\n\t\t\t\t03ED618B5D7F48981C98DD8E0AC1B8D4 /* Foundation.framework in Frameworks */,\n\t\t\t\t377A1FC08453DEC747BF0FEF051BC213 /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9034BC61AF8E7945C51164FD2871B099 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t657349B62D75CB35A655EA1A57E000B8 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB400B9F23CFC43953B22A2339BB1C9AB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1DDF94B65609AC4AEB7A23A6B3BC1B73 /* Accelerate.framework in Frameworks */,\n\t\t\t\tE6871224E4CB6F0DA7EFA85D88B47AD0 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tF876156A55100257E422EC08CE7D033C /* Foundation.framework in Frameworks */,\n\t\t\t\t553D65B7792BB684FE8F1A27A39E160A /* QuartzCore.framework in Frameworks */,\n\t\t\t\t5FA41B05EB4530D9F8A3F6488E143E3D /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBBE23CD672042A59D3F34AF454059CF6 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDF5CA96D75DE782922428FC9B9E267A6 /* Foundation.framework in Frameworks */,\n\t\t\t\tDFCF0AEF50D13905848D5997FBC23C70 /* Security.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD83F41C35122B9469EFE0B26DE89F3E2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF502727A3FD570F98F41E94B84DAE80E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE73EF571CD8815DD2FE9BF9B838DE381 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFB9E53A23841A32B3798606739F8EBC9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBEDE5883E03441DAB7010639C6B62633 /* Foundation.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\t008AC82E663DACE39C79E80E39178FE9 /* Icons */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAA52707EAC4163C359919E1988C40D82 /* MRIconView.h */,\n\t\t\t\tA39C7E38D18397EBCA3BDBEBBC1F8040 /* MRIconView.m */,\n\t\t\t);\n\t\t\tname = Icons;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t01B36F31ECAA874ECAEB5B6692F37003 /* KissXML */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t26E209F596380AE6F83C414D33D19DE7 /* Core */,\n\t\t\t\t51A2674D81607B7B64967A06CF38D2D4 /* Pod */,\n\t\t\t\tD98B204AAA89133BAB68A4BD8E7EEF7B /* Support Files */,\n\t\t\t);\n\t\t\tname = KissXML;\n\t\t\tpath = \"../Modified Pods/KissXML-5.1.2\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0597D55D1763E09DD0DB0ECA36ABD7EC /* Pods-Dash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4BDDDA9801ED8E936ECCEB03CE42CCC1 /* Pods-Dash-acknowledgements.markdown */,\n\t\t\t\tB5C0CDFBAE6AA9F471D9C08E1777ECFD /* Pods-Dash-acknowledgements.plist */,\n\t\t\t\tB72E9B277BBA4224515107FE5B775282 /* Pods-Dash-dummy.m */,\n\t\t\t\t5EF8CC25C4AF762DA94D4BC3C49DCBA1 /* Pods-Dash-frameworks.sh */,\n\t\t\t\t30A682094EF85215E80C0AA858590D5A /* Pods-Dash-resources.sh */,\n\t\t\t\tB6F235F3E87F30CDC1AB2EED0B2FF14B /* Pods-Dash.debug.xcconfig */,\n\t\t\t\t3E531164633FB25AF4591712A3E2040B /* Pods-Dash.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-Dash\";\n\t\t\tpath = \"Target Support Files/Pods-Dash\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0A7B16DF60972EDB1D37C160C9512F44 /* Helper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2CDDF3DE08AAF193E867E5040D4E03B8 /* MRProgressHelper.h */,\n\t\t\t);\n\t\t\tname = Helper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1A8FECFDD41D705AEA7780E38167BD8F /* Development Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5139924E6F3962DD08939820F2007FC8 /* DTBonjour */,\n\t\t\t\t01B36F31ECAA874ECAEB5B6692F37003 /* KissXML */,\n\t\t\t\t5613D230F2A58677A4CA9846EE0751C5 /* MRProgress */,\n\t\t\t);\n\t\t\tname = \"Development Pods\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t251FBAF7F3C198A69AD5679ED603454E /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE1BF51E4F141D965E503C17CD28F8928 /* HockeySDK.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t26970B66EEDAB6CBFA67ABB6BC1D975A /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2F180F4A30921E1AAAAB3216CB244920 /* MRProgress.xcconfig */,\n\t\t\t\t52FAA1D716B7929A5AB210EB862FD10D /* MRProgress-dummy.m */,\n\t\t\t\tA05816C2C257E2501D17B6FAE6306F1B /* MRProgress-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../../Pods/Target Support Files/MRProgress\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t26E209F596380AE6F83C414D33D19DE7 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF9D0473AB76A1A46053CDF6788B84CA3 /* DDXML.h */,\n\t\t\t\tAFEE7BBB3FB8F12EF74E02765AC250DF /* DDXMLDocument.h */,\n\t\t\t\tD86D3E3A8D8DF90491F44982FEE9B621 /* DDXMLDocument.m */,\n\t\t\t\t7B693AE6C516B7139BFB9B06EA9F989E /* DDXMLElement.h */,\n\t\t\t\t5149FA3EF9E34B3B97B49EB283ABE386 /* DDXMLElement.m */,\n\t\t\t\tC4EEB16666A69263B9B87D10651858EE /* DDXMLNode.h */,\n\t\t\t\tC232AA1C67EAB67DD980F99EB1D6A8B5 /* DDXMLNode.m */,\n\t\t\t\t44F031A13DB563B10BB3B79F5DB6D457 /* KissXML.h */,\n\t\t\t\t2BC9BA670F4070A53FD5F6EFFDAB22BF /* Additions */,\n\t\t\t\tDBF400A882842C3C28394A38E61A9B55 /* Categories */,\n\t\t\t\tC209861B4260B25264F6D20184C64D96 /* Private */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2937AC61304015C0BC8ADDF52071023A /* UIActionSheet+Blocks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6272C9EFE296101A3F185978C4423465 /* UIActionSheet+Blocks.h */,\n\t\t\t\t9F35EDB4796A73D77330A2A701E63F2A /* UIActionSheet+Blocks.m */,\n\t\t\t\tB1126D7CB66114E6A09429B9849621EE /* Support Files */,\n\t\t\t);\n\t\t\tpath = \"UIActionSheet+Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2A7B838FD1ECAFAF3977102AB8A01A2B /* SAMKeychain */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA97A461F518B38480D9CE441E309B6DE /* SAMKeychain.h */,\n\t\t\t\t078A11A36977A19957A5C54135D7EF40 /* SAMKeychain.m */,\n\t\t\t\t7839D880CB8ADECD7A1C9FEEC6F63368 /* SAMKeychainQuery.h */,\n\t\t\t\tBD967CD1C081B5DA9BECCDFFBA9319CE /* SAMKeychainQuery.m */,\n\t\t\t\tB9E6CBA4ADA0B05CA33629C12B5DE81C /* Resources */,\n\t\t\t\tB0B4EFE49D06B1C736E4D31D695BEB95 /* Support Files */,\n\t\t\t);\n\t\t\tpath = SAMKeychain;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2BC9BA670F4070A53FD5F6EFFDAB22BF /* Additions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9E5F6CE32A36BC8DEA995312D44E1ADB /* DDXMLElementAdditions.h */,\n\t\t\t\t6C72A96EA445BCC30461D886EB82B933 /* DDXMLElementAdditions.m */,\n\t\t\t);\n\t\t\tname = Additions;\n\t\t\tpath = KissXML/Additions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2F5C6504F9A17DDB7BB3739E98394567 /* NavigationBarProgress */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t45FF41D6BDF6E11A059B788B200B722F /* MRNavigationBarProgressView.h */,\n\t\t\t\t3C43D6F6CF04E4DF3FCB39583BBCA819 /* MRNavigationBarProgressView.m */,\n\t\t\t);\n\t\t\tname = NavigationBarProgress;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t326108964A9E4DB1933FF21E8DDFCCCE /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t88AFEC1F5BCE183847916970F0B9EA45 /* HockeySDKResources.bundle */,\n\t\t\t\t12883A78A65F5415395681C1CCE2FB7B /* libAutoCoding.a */,\n\t\t\t\t85CDF0B04D620505A5756242E236179C /* libDTBonjour.a */,\n\t\t\t\t0D00F6FD7848428B8380399EA18E45D7 /* libDZNEmptyDataSet.a */,\n\t\t\t\t6DB335F79D3A762AB892FAF86D4C44EC /* libGZIP.a */,\n\t\t\t\tF448AA8EA61FAC4CBE9F713DE167453D /* libJGMethodSwizzler.a */,\n\t\t\t\t63340E6208CA7F26315EA524567E6FD3 /* libKissXML.a */,\n\t\t\t\t16CE2E9B4DFC59E2E4E29137CC201E55 /* libMRProgress.a */,\n\t\t\t\tBF032C7C6DA415681352D289149BCBF0 /* libNSTimer-Blocks.a */,\n\t\t\t\t93B457B27E1D2F99D3CE8B924FD1DB87 /* libPods-Dash.a */,\n\t\t\t\tD27D6F1E0CF866727C3740CE96B1B2A0 /* libPods-Dash-Dash App Store.a */,\n\t\t\t\t104F93417FF54A8015815E19065F0062 /* libReachability.a */,\n\t\t\t\tB28D0494DC34E330FBC88D8F6750D067 /* libSAMKeychain.a */,\n\t\t\t\t4D77F184C03D91F974EDD54234A8532F /* libUIActionSheet+Blocks.a */,\n\t\t\t\tDD5134FBB59949CD358CEF56FC63FBF0 /* libUIAlertView+Blocks.a */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3859675A21CFE313F1DF52DC3D141046 /* UIAlertView+Blocks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5A484AA1F3A0F563D5C35282AB23BFF9 /* UIAlertView+Blocks.h */,\n\t\t\t\tC09E24470CFB2781BA3A124B664ABC28 /* UIAlertView+Blocks.m */,\n\t\t\t\tE0A0D8F7B9D1C856F444581B93436815 /* Support Files */,\n\t\t\t);\n\t\t\tpath = \"UIAlertView+Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3A90A84AC98EDBECDCA13D3AA7B9810C /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA2094A9ED71A519FFC1F65E0B8A4EF88 /* NSTimer-Blocks.xcconfig */,\n\t\t\t\t7A37E6F5741D172360FA7B22E9F01D35 /* NSTimer-Blocks-dummy.m */,\n\t\t\t\t6227C089A698144A5EF2C6D22F01E6AF /* NSTimer-Blocks-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/NSTimer-Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t41E16CD914CF851B0DE136E214061673 /* DZNEmptyDataSet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t184828C342E650079B44F9E43E9B2D8F /* UIScrollView+EmptyDataSet.h */,\n\t\t\t\t3EBD7F7E716F02FB1C5BF8DCF344028C /* UIScrollView+EmptyDataSet.m */,\n\t\t\t\t9380D7193E6DF2B4D0A89B36D806FE20 /* Support Files */,\n\t\t\t);\n\t\t\tpath = DZNEmptyDataSet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4F1E656295E94F6E044373E3C7F3AA0D /* Pod */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t68DEDCDFCAC92C6BD32372EE4FD80C79 /* LICENSE */,\n\t\t\t\t660962AE7AEA8D479F024714416FBF35 /* MRProgress.podspec */,\n\t\t\t\tBCF065EE3F16E2B292B353DAA32A7945 /* README.md */,\n\t\t\t);\n\t\t\tname = Pod;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4FA83E8DE5E613576ABD211A54E860BF /* Circular */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA78824B8D9F60AC0533272DE93FA33EC /* MRCircularProgressView.h */,\n\t\t\t\t2D04033CB1601E077C86887D0D6D84D2 /* MRCircularProgressView.m */,\n\t\t\t);\n\t\t\tname = Circular;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5139924E6F3962DD08939820F2007FC8 /* DTBonjour */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA004D7E225481204C8932863C0E33FFD /* DTBonjourDataChunk.h */,\n\t\t\t\t518B833B1BDC96EE623B316223A80765 /* DTBonjourDataChunk.m */,\n\t\t\t\t1645122B7C1D19C1CBAD6F2F746A5024 /* DTBonjourDataConnection.h */,\n\t\t\t\t8406BEBB173DF21821755A3088B7BD93 /* DTBonjourDataConnection.m */,\n\t\t\t\tA29A2C0C6BF351E0E3C368ED1B22A0F4 /* DTBonjourServer.h */,\n\t\t\t\tA56082E65CB34E180CD590F16B6DF2EB /* DTBonjourServer.m */,\n\t\t\t\tA70CF4757CD2D19314F51680E96A6786 /* NSScanner+DTBonjour.h */,\n\t\t\t\t4B3E359A463BB3DB2A99A543B8BEC59D /* NSScanner+DTBonjour.m */,\n\t\t\t\tFB661B3D9C10474F3A137CE6C4C8D8D8 /* Pod */,\n\t\t\t\t84D5E0E7B7D07A894AA22F297949FCA8 /* Support Files */,\n\t\t\t);\n\t\t\tname = DTBonjour;\n\t\t\tpath = \"../Modified Pods/DTBonjour\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t51A2674D81607B7B64967A06CF38D2D4 /* Pod */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB9ACB9F615FA8863E4B8B6009C096A49 /* KissXML.podspec */,\n\t\t\t\tB2717DCE71CEF0A019C7CCF232811610 /* LICENSE.txt */,\n\t\t\t\t3EA7B9794EAC1626D8BCEFDDEBDA65FC /* README.markdown */,\n\t\t\t);\n\t\t\tname = Pod;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t53F82B38691A70B9086D5731C7E036CE /* JGMethodSwizzler */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36F1C73A4272D99CAED19FA99EB46267 /* JGMethodSwizzler.h */,\n\t\t\t\tACED789A2C3B1F688B59D6647D8B6151 /* JGMethodSwizzler.m */,\n\t\t\t\t6F5AB062EE568C6623483BD2E74CDD74 /* Support Files */,\n\t\t\t);\n\t\t\tpath = JGMethodSwizzler;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5613D230F2A58677A4CA9846EE0751C5 /* MRProgress */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t636E33A1ED095F06B4D35A871DB9197D /* MRProgress.h */,\n\t\t\t\tFAC8D75E143F9817030C224584FFB7EA /* ActivityIndicator */,\n\t\t\t\tDB23A51FB139A8182EC50505CBC99B00 /* Blur */,\n\t\t\t\t4FA83E8DE5E613576ABD211A54E860BF /* Circular */,\n\t\t\t\t0A7B16DF60972EDB1D37C160C9512F44 /* Helper */,\n\t\t\t\t008AC82E663DACE39C79E80E39178FE9 /* Icons */,\n\t\t\t\t2F5C6504F9A17DDB7BB3739E98394567 /* NavigationBarProgress */,\n\t\t\t\tD5B2E1990AC95BF75A96D14A1F296F1F /* Overlay */,\n\t\t\t\t4F1E656295E94F6E044373E3C7F3AA0D /* Pod */,\n\t\t\t\tC7EF98D0607E7B30D07613FED2624319 /* ProgressBaseClass */,\n\t\t\t\tCB8EFD9A636361D5B2F7FBB5498E58C6 /* Stopable */,\n\t\t\t\t26970B66EEDAB6CBFA67ABB6BC1D975A /* Support Files */,\n\t\t\t);\n\t\t\tname = MRProgress;\n\t\t\tpath = \"../Modified Pods/MRProgress\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6375957A80EC38C013BE99157FE12C34 /* GZIP */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBB8FA3311E1FC23C6090A1C731C88ECA /* GZIP.h */,\n\t\t\t\tB50EF1A0AB5CC4DCADF5ABCD8C9104FC /* NSData+GZIP.h */,\n\t\t\t\t9622D82B702FFE25DE90D0B472DA1DBB /* NSData+GZIP.m */,\n\t\t\t\tA3A41D8BBC787F4051A49E1399A9E409 /* Support Files */,\n\t\t\t);\n\t\t\tpath = GZIP;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6F5AB062EE568C6623483BD2E74CDD74 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC408198D9D085441B2287D6A9913CC4D /* JGMethodSwizzler.xcconfig */,\n\t\t\t\tFD8515AAFE2D01DFD97B8765AAF84AD9 /* JGMethodSwizzler-dummy.m */,\n\t\t\t\t5B97DA14CFEF7F35F40C406F7B2660F9 /* JGMethodSwizzler-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/JGMethodSwizzler\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t785553737B06AFC3DA711DDEB7D56194 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9D5B36F4316C5CFA26F5077F11111387 /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t79E5A69286034848F3DCC2986722A95A /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED83AD26BD55125C060D6E875C69B1E8 /* AppIconPlaceHolder.png */,\n\t\t\t\tB2DD07B8E4DA803BB82C2501563D4675 /* Arrow.png */,\n\t\t\t\t1F77501C77980C070A24246E7E7CC798 /* Arrow@2x.png */,\n\t\t\t\tBD8370551B8BABF39C40F05B9DEF55AD /* Arrow@3x.png */,\n\t\t\t\t1CA5ADAB472DD913F3324C20A9A2ACFE /* authorize_denied.png */,\n\t\t\t\t421ED62C794A9E0546B40E358558E390 /* authorize_denied@2x.png */,\n\t\t\t\t0935593CAB20501BD1E56377C947C5F2 /* authorize_denied@3x.png */,\n\t\t\t\t2953817723BAABC8B278A3FE47611D49 /* bg.png */,\n\t\t\t\tE7EB241F08BEEECDE7CACE0C66BE39FB /* Blur.png */,\n\t\t\t\tFF912C17DFB313013CB3A3BE2ED9E4B5 /* Blur@2x.png */,\n\t\t\t\t6C1051EF8A14FB127CF765CA63883E32 /* Blur@3x.png */,\n\t\t\t\tA81B6B069FB3BA856977A61B80C8F055 /* buttonRoundedDelete.png */,\n\t\t\t\t0A930A77657403D3EAB840F80B666B4A /* buttonRoundedDelete@2x.png */,\n\t\t\t\t88D6F9DA1B5061AF8576CCED8AF85F8E /* buttonRoundedDeleteHighlighted.png */,\n\t\t\t\tD457B2251162C0E67ABF48ADE98881E9 /* buttonRoundedDeleteHighlighted@2x.png */,\n\t\t\t\tAE7CB7424AEC5522A9E1846CAB39F444 /* buttonRoundedRegular.png */,\n\t\t\t\t3ACAAC89AB84785236B215C9F17E8475 /* buttonRoundedRegular@2x.png */,\n\t\t\t\t73C40F0679B91FF496574BD8B55234C2 /* buttonRoundedRegularHighlighted.png */,\n\t\t\t\tC8F2241DB3EFEA1ECDE407C702D42988 /* buttonRoundedRegularHighlighted@2x.png */,\n\t\t\t\tEEFF8A79DC5A9492432A56743B23C4B6 /* Cancel.png */,\n\t\t\t\tE37B159BB6C3FF3E8DF4D592A363E1B1 /* Cancel@2x.png */,\n\t\t\t\t16A9095C5D2C1E81A11E77AF578A361F /* Cancel@3x.png */,\n\t\t\t\t4852430BC0B8E1AEB6415242ECE72CE8 /* de.lproj */,\n\t\t\t\t0DD58F6D94984607D0AE20D22F5D54EE /* en.lproj */,\n\t\t\t\t125B50749BE411DCEA57A84C1CC2180A /* es.lproj */,\n\t\t\t\t99B1109AA360471E3B83AB5CEE4440DC /* fa.lproj */,\n\t\t\t\tAA94AB8D9954BB8B1535D61C6DA8E745 /* feedbackActivity.png */,\n\t\t\t\t8D6BFEE74158C79C4874E33413294655 /* feedbackActivity@2x.png */,\n\t\t\t\t298616DAB1D04723062721867EF9AB65 /* feedbackActivity@2x~ipad.png */,\n\t\t\t\t48368853A0A8199BC5BD6A5397B1344E /* feedbackActivity@3x.png */,\n\t\t\t\t3C2CD094483D9DBEA19C1E03D3878998 /* feedbackActivity~ipad.png */,\n\t\t\t\t0D4E5A6D2AA5A41FA739A4A64DAF4B48 /* FeedbackPlaceholder.png */,\n\t\t\t\t9E86AD1EAE16ECA8F8DBCAA046CD33BC /* fr.lproj */,\n\t\t\t\t5F05719C0A4ED06B6A9FAA13E6412205 /* hr.lproj */,\n\t\t\t\t3411FBDB6BE077EAE97267E435727674 /* hu.lproj */,\n\t\t\t\t5573F0DE5EE0EFC5576DFF2BFEC35473 /* iconCamera.png */,\n\t\t\t\tAC1A18CA177672D8A580BB977F319E54 /* iconCamera@2x.png */,\n\t\t\t\t693DA89A0FA04668E2177ADD93C1A58E /* IconGradient.png */,\n\t\t\t\t6884785630C444606191EAEE0335953D /* IconGradient@2x.png */,\n\t\t\t\t60CA7517D8BA2908E199144352AB9689 /* it.lproj */,\n\t\t\t\t242D40001D15A908970377E06670D4DD /* ja.lproj */,\n\t\t\t\t64AA64B7B06D4A8E152A59D27B5EAF96 /* nb.lproj */,\n\t\t\t\tC967E2A2120811E20A72E972240F9A5D /* nl.lproj */,\n\t\t\t\t5C229F4D1AE1E699E161B2A736E4528E /* Ok.png */,\n\t\t\t\tBE360F248A0682F7D40B2353161D5483 /* Ok@2x.png */,\n\t\t\t\t2C7781421F0C6F705465EB57E65A7FBD /* Ok@3x.png */,\n\t\t\t\t007D63F5AABE7790C903F3DC108A31D5 /* pt.lproj */,\n\t\t\t\t8EF48A9D4A7F2C1EE8A77563376FD7B3 /* pt-PT.lproj */,\n\t\t\t\t4EA76B35B5EFCFCC2D7A6FBA787A0281 /* Rectangle.png */,\n\t\t\t\t9B7FFA9A67DCAEE70ECEC2B32E26CBBC /* Rectangle@2x.png */,\n\t\t\t\t402CD7D79C53993504224FFD906784F7 /* Rectangle@3x.png */,\n\t\t\t\t8A3A5F273B5E22901C3906A48429B40C /* ru.lproj */,\n\t\t\t\t00427DC215BF331D73E31001803C8DDC /* tr.lproj */,\n\t\t\t\t51ADAA8BD14FAC550BE559B2970EE3EB /* zh-Hans.lproj */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7DB346D0F39D3F0E887471402A8071AB = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,\n\t\t\t\t1A8FECFDD41D705AEA7780E38167BD8F /* Development Pods */,\n\t\t\t\t785553737B06AFC3DA711DDEB7D56194 /* Frameworks */,\n\t\t\t\tA6DB55CA425C048545B60173773E2574 /* Pods */,\n\t\t\t\t326108964A9E4DB1933FF21E8DDFCCCE /* Products */,\n\t\t\t\tADFBD847DE26473E7B600DFBBFEC28DC /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t84D5E0E7B7D07A894AA22F297949FCA8 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBF1FA01D0210D011E3D4EE235FBD4083 /* DTBonjour.xcconfig */,\n\t\t\t\tC401F14E53F1C4870BEB3381C6D54579 /* DTBonjour-dummy.m */,\n\t\t\t\tE3C0339612EEB4C486E0B74AD9F79581 /* DTBonjour-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../../Pods/Target Support Files/DTBonjour\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8CE98AF98A682B3A17D44BC9DA1F764C /* HockeySDK */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE80CB62793FAEAC291664566E6773BC5 /* DefaultLib */,\n\t\t\t\t9E67D5E778C0AC6360739B0E6C4E6E60 /* Support Files */,\n\t\t\t);\n\t\t\tpath = HockeySDK;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9380D7193E6DF2B4D0A89B36D806FE20 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC681197DEBD6E2C5856051E22CAB73A8 /* DZNEmptyDataSet.xcconfig */,\n\t\t\t\tCA815B34AC5025B2CCDE6EFAA6D2ABCC /* DZNEmptyDataSet-dummy.m */,\n\t\t\t\tB0429AB4876770E05E7189365C06DD3D /* DZNEmptyDataSet-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/DZNEmptyDataSet\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t93CAE25BE6928CFEF44509C178A623F6 /* Reachability */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63B2FFBDAA0BCFB60BEEDD0491A92659 /* Reachability.h */,\n\t\t\t\t8C1524368196FCDD680FD5092576D36A /* Reachability.m */,\n\t\t\t\tFD2ED1705927B0EFD03CD10F6A463607 /* Support Files */,\n\t\t\t);\n\t\t\tpath = Reachability;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9D5B36F4316C5CFA26F5077F11111387 /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t111DCA0E215404B364A727C3CCA014DE /* Accelerate.framework */,\n\t\t\t\t7083AE4B09F2A83953471EB9AA73DEBA /* CoreFoundation.framework */,\n\t\t\t\t4D1BE16E6940C989E8EF125530AB4C19 /* CoreGraphics.framework */,\n\t\t\t\tED96CFC0671BD7AA7F5A5CC0C5B77312 /* Foundation.framework */,\n\t\t\t\t729DFAE1293D7006E08BDC51559A135D /* QuartzCore.framework */,\n\t\t\t\tB7F8D73EF73FF675B9541CF7B7BD97E8 /* Security.framework */,\n\t\t\t\tF0C14F0B0C87E929D045BF18FC651FEA /* SystemConfiguration.framework */,\n\t\t\t\tE3ACC3A782EE164785E86967FACC244F /* UIKit.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9E67D5E778C0AC6360739B0E6C4E6E60 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE0D011EECF654F0D23E651C01727DAE4 /* ResourceBundle-HockeySDKResources-Info.plist */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/HockeySDK\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA3A41D8BBC787F4051A49E1399A9E409 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2F2216C81601AF4BF010CE1A174A879E /* GZIP.xcconfig */,\n\t\t\t\t8A48CB1008AEC858377AD5E8A777C7C4 /* GZIP-dummy.m */,\n\t\t\t\t42A5ED7A06A1F44A3B591C8661D352C5 /* GZIP-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/GZIP\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA6DB55CA425C048545B60173773E2574 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE4EBD04C62A09EE003192192943F4D23 /* AutoCoding */,\n\t\t\t\t41E16CD914CF851B0DE136E214061673 /* DZNEmptyDataSet */,\n\t\t\t\t6375957A80EC38C013BE99157FE12C34 /* GZIP */,\n\t\t\t\t8CE98AF98A682B3A17D44BC9DA1F764C /* HockeySDK */,\n\t\t\t\t53F82B38691A70B9086D5731C7E036CE /* JGMethodSwizzler */,\n\t\t\t\tE04893BC915A1567AA72E9094432F7FE /* NSTimer-Blocks */,\n\t\t\t\t93CAE25BE6928CFEF44509C178A623F6 /* Reachability */,\n\t\t\t\t2A7B838FD1ECAFAF3977102AB8A01A2B /* SAMKeychain */,\n\t\t\t\t2937AC61304015C0BC8ADDF52071023A /* UIActionSheet+Blocks */,\n\t\t\t\t3859675A21CFE313F1DF52DC3D141046 /* UIAlertView+Blocks */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tADFBD847DE26473E7B600DFBBFEC28DC /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0597D55D1763E09DD0DB0ECA36ABD7EC /* Pods-Dash */,\n\t\t\t\tB5669AE375570716C47FFFA5041F3798 /* Pods-Dash-Dash App Store */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB0B4EFE49D06B1C736E4D31D695BEB95 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t983473DA2AEB53A34C6BDE44801A0926 /* SAMKeychain.xcconfig */,\n\t\t\t\t754B9BD1B02C9A8659E3707875DA4E8A /* SAMKeychain-dummy.m */,\n\t\t\t\t68813D21DEEDD9FCDD1416745FD62E2A /* SAMKeychain-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/SAMKeychain\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB1126D7CB66114E6A09429B9849621EE /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE9882BEB273105CC10726B7609551527 /* UIActionSheet+Blocks.xcconfig */,\n\t\t\t\t36D0457643AFCA2E67CC859EAB335411 /* UIActionSheet+Blocks-dummy.m */,\n\t\t\t\tCFC19E7A4DCD20CC657DB6550AC6D7FE /* UIActionSheet+Blocks-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/UIActionSheet+Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB5669AE375570716C47FFFA5041F3798 /* Pods-Dash-Dash App Store */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF0E409DCFE40B89D7044376537E203F2 /* Pods-Dash-Dash App Store-acknowledgements.markdown */,\n\t\t\t\t2ADF772269945129B056D0AE37CDB31F /* Pods-Dash-Dash App Store-acknowledgements.plist */,\n\t\t\t\t02FB990DEDD7795680D048211CB19901 /* Pods-Dash-Dash App Store-dummy.m */,\n\t\t\t\t77CD3F0BBDCDB52C6E980131B9A7AFF7 /* Pods-Dash-Dash App Store-frameworks.sh */,\n\t\t\t\t263A035D1A87573CE7D88C51C54BB9D6 /* Pods-Dash-Dash App Store-resources.sh */,\n\t\t\t\tBFDF824F36DFFB6F90C8157DAC66BA75 /* Pods-Dash-Dash App Store.debug.xcconfig */,\n\t\t\t\t73FC0BFFD1ED9DB968A2881BE528C162 /* Pods-Dash-Dash App Store.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-Dash-Dash App Store\";\n\t\t\tpath = \"Target Support Files/Pods-Dash-Dash App Store\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB9E6CBA4ADA0B05CA33629C12B5DE81C /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6261DFE8DE9FACDDBFDE0B1D82C5B5F7 /* SAMKeychain.bundle */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC209861B4260B25264F6D20184C64D96 /* Private */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD3841F3FBF33B7C7D1BDEA417D91ED62 /* DDXMLPrivate.h */,\n\t\t\t);\n\t\t\tname = Private;\n\t\t\tpath = KissXML/Private;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC7EF98D0607E7B30D07613FED2624319 /* ProgressBaseClass */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t86D4F92FBA40FA6EFE37243D138C3D73 /* MRProgressView.h */,\n\t\t\t\t74C52195D46C2D8F35146299BEC3F1E4 /* MRProgressView.m */,\n\t\t\t);\n\t\t\tname = ProgressBaseClass;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCB8EFD9A636361D5B2F7FBB5498E58C6 /* Stopable */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9B579D9ED608B0A8DC82E0B6E3CB3119 /* MRStopableView.h */,\n\t\t\t\tCBCE3D6A139383B2A321AFB875F969D1 /* MRStopButton.h */,\n\t\t\t\tFB90C025AE6C45BE9749ABEE1B6EF075 /* MRStopButton.m */,\n\t\t\t);\n\t\t\tname = Stopable;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5B2E1990AC95BF75A96D14A1F296F1F /* Overlay */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD970DC1A1D23C5DB5ACCD77C19AC40A3 /* MRProgressOverlayView.h */,\n\t\t\t\t167262C4CC62DD8EEDCFC1955DF8352C /* MRProgressOverlayView.m */,\n\t\t\t);\n\t\t\tname = Overlay;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD98B204AAA89133BAB68A4BD8E7EEF7B /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD883A6285BBA55CE226C8006DFE25741 /* KissXML.xcconfig */,\n\t\t\t\t59D174E1055905F5E1E04D18D9EED9E3 /* KissXML-dummy.m */,\n\t\t\t\t0274AEF88C9BC8DA1938920F92C33DB9 /* KissXML-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../../Pods/Target Support Files/KissXML\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDB23A51FB139A8182EC50505CBC99B00 /* Blur */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t61D67F36EFBCDAE64CE95CC93EDF2B64 /* MRBlurView.h */,\n\t\t\t\t92C886CBB2A6E30B0C45FE3D37172CF0 /* MRBlurView.m */,\n\t\t\t\t1319FABFAF429EBF07CBD56B85E48AAF /* UIImage+MRImageEffects.h */,\n\t\t\t\tBE17F235D79FFEA0208C1847C3E6654A /* UIImage+MRImageEffects.m */,\n\t\t\t);\n\t\t\tname = Blur;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDBF400A882842C3C28394A38E61A9B55 /* Categories */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4C5B1721C029840798C6D4B95ACD9610 /* NSString+DDXML.h */,\n\t\t\t\tE8B20B3C6EC5D1A466E8C968B4CB1E24 /* NSString+DDXML.m */,\n\t\t\t);\n\t\t\tname = Categories;\n\t\t\tpath = KissXML/Categories;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE04893BC915A1567AA72E9094432F7FE /* NSTimer-Blocks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCE60BD25CF976A3E6D1E94CDDDA66886 /* NSTimer+Blocks.h */,\n\t\t\t\t4DA1DC59E7120A539FEE22F831718607 /* NSTimer+Blocks.m */,\n\t\t\t\t3A90A84AC98EDBECDCA13D3AA7B9810C /* Support Files */,\n\t\t\t);\n\t\t\tpath = \"NSTimer-Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE0A0D8F7B9D1C856F444581B93436815 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC7EFACEA351E50B925CFA7DA44D34A2A /* UIAlertView+Blocks.xcconfig */,\n\t\t\t\tD47480CA92189F8FFFE6F58884F70EC1 /* UIAlertView+Blocks-dummy.m */,\n\t\t\t\tF9758AF256673B8B65649B7C71720E98 /* UIAlertView+Blocks-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/UIAlertView+Blocks\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE4EBD04C62A09EE003192192943F4D23 /* AutoCoding */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEF0CF7A976C3D78E1ACE7E293A6F9583 /* AutoCoding.h */,\n\t\t\t\tB33EF6D45895DB3AD613EA7307E2F025 /* AutoCoding.m */,\n\t\t\t\tE8FAFDBBC5ECAABE53FB5D2F451417F7 /* Support Files */,\n\t\t\t);\n\t\t\tpath = AutoCoding;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE80CB62793FAEAC291664566E6773BC5 /* DefaultLib */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t251FBAF7F3C198A69AD5679ED603454E /* Frameworks */,\n\t\t\t\t79E5A69286034848F3DCC2986722A95A /* Resources */,\n\t\t\t);\n\t\t\tname = DefaultLib;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE8FAFDBBC5ECAABE53FB5D2F451417F7 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3C39B4364B7076B8908B8B116F624AE1 /* AutoCoding.xcconfig */,\n\t\t\t\t1014873CE5A267EE78EF32E7C3623A0D /* AutoCoding-dummy.m */,\n\t\t\t\tE321DBA159DF0D82D35F57AAFA8A09BC /* AutoCoding-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/AutoCoding\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFAC8D75E143F9817030C224584FFB7EA /* ActivityIndicator */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t07CCA2A0B006C869AC168407A9725252 /* MRActivityIndicatorView.h */,\n\t\t\t\t17720A8BD4F5BCD7E09F57623931BD13 /* MRActivityIndicatorView.m */,\n\t\t\t);\n\t\t\tname = ActivityIndicator;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFB661B3D9C10474F3A137CE6C4C8D8D8 /* Pod */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A1887F6B4B8E99B029DC9144D5C73F8 /* DTBonjour.podspec */,\n\t\t\t\tFEF042E3E9A768E7188F8CCC3355E0D5 /* LICENSE */,\n\t\t\t\tFA36C6DAEA517E4435ED1BC8D960F891 /* readme.markdown */,\n\t\t\t);\n\t\t\tname = Pod;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFD2ED1705927B0EFD03CD10F6A463607 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5B983C0171A4ACCE151173377A894AC7 /* Reachability.xcconfig */,\n\t\t\t\tA19D1BDEF431C39A662FC3908CCCA8EF /* Reachability-dummy.m */,\n\t\t\t\t7C8171B1BF9B855FC505C05388580C8E /* Reachability-prefix.pch */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Reachability\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t1C89A2F9933F1331048AAEBF279C3CEE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t62D5067144CBE93061CFDB24EE374556 /* AutoCoding.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3C8A9FFFFE9B9681FBD4DB5E158B1A6B /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC2EC79B25C04BCAADAE17D889CED7191 /* GZIP.h in Headers */,\n\t\t\t\t0EDA832E97ADBFD62ED74E4B367C5F1F /* NSData+GZIP.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t65519B2EC462D5F876B7E6D6B9C1BA25 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCF0EB4FA3E2FE68CF8A018EBA86E207B /* Reachability.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8BC897BE11C865F6759DCAC26F9472FB /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8B32F0B28C991601EC5BD9A2F1B0F85A /* SAMKeychain.h in Headers */,\n\t\t\t\t133AC187EE5D1E7081584EEF67FD63AE /* SAMKeychainQuery.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9077FD721AC492135E5F3B9A67F65E6E /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8AE185D89C4851742B2239FC684A3FB0 /* UIScrollView+EmptyDataSet.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9BCD2E99AFDCB0060E1BB354D6BF1C6F /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AA66B59D140C38C02B5B9022AA134D4 /* DTBonjourDataChunk.h in Headers */,\n\t\t\t\tE3DB322DFB959703663BD7AD832BDC84 /* DTBonjourDataConnection.h in Headers */,\n\t\t\t\t1A445F902B7E0BAA28D24FE8CC231C5D /* DTBonjourServer.h in Headers */,\n\t\t\t\tDE195C6B0A51D74321ACFB0753A5103A /* NSScanner+DTBonjour.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9CA3F444F534E481EB287FFD51B16A21 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB909D025BABF13158000FF37385CD072 /* DDXML.h in Headers */,\n\t\t\t\tFC47EF9FDA1D446D5BDF4EC3FD6A8C21 /* DDXMLDocument.h in Headers */,\n\t\t\t\t9808324BB727454528DDA58297FDBC8C /* DDXMLElement.h in Headers */,\n\t\t\t\tB11EAB751E1E20BF9A2AB32C14E8D9AF /* DDXMLElementAdditions.h in Headers */,\n\t\t\t\tEC5D8DB4D41E516C0358D7D3E47CCE1F /* DDXMLNode.h in Headers */,\n\t\t\t\tD9DB9A0DC2D5A3BEC0E109C05F043159 /* DDXMLPrivate.h in Headers */,\n\t\t\t\t9285778B28FEC7F14B87058E091BA90C /* KissXML.h in Headers */,\n\t\t\t\tB1FA685EA4E9AA9B582D852F82A3DC20 /* NSString+DDXML.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB1A74C34B4DDF8400178EB3D58739551 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t89CF7DB18FCD2C2C0F62DC01C750F2D2 /* UIAlertView+Blocks.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC7A25D3B201357FE16F25F63A72FAB78 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF7349B6AF64B819542882675D67BF635 /* JGMethodSwizzler.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDF43DBEB42812793DE3A46DB7107D73D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t32CD9EECF27C826C3037136C2E071581 /* NSTimer+Blocks.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE1FC82BD36D516B9240AC4FC263D4957 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t413FA36162582E103501843521C20AD0 /* UIActionSheet+Blocks.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tECCD3F487CF43A573061A196C64CFDB4 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE68543F94BD803BC8CBCBED631200D86 /* MRActivityIndicatorView.h in Headers */,\n\t\t\t\t4ED1E56195582D7ADAEA2AE7037A9E48 /* MRBlurView.h in Headers */,\n\t\t\t\t7E434BCBC72DCBB014170A9A3BF47E30 /* MRCircularProgressView.h in Headers */,\n\t\t\t\tC9C1C9975CD980D1347B9581D654994C /* MRIconView.h in Headers */,\n\t\t\t\tC7159E5BEC3FE6CD6AD91367E54B4DFC /* MRNavigationBarProgressView.h in Headers */,\n\t\t\t\t82BC1C26C706FF4BBF65D5A4652F5A7D /* MRProgress.h in Headers */,\n\t\t\t\tE1722F47CCAC21E8C52AA49AEF76A1B6 /* MRProgressHelper.h in Headers */,\n\t\t\t\t8C9FAB21CF493F405C12AEEE86DA481D /* MRProgressOverlayView.h in Headers */,\n\t\t\t\tEAA89C7822E5AA63B57E6C5EC99C4540 /* MRProgressView.h in Headers */,\n\t\t\t\tE9D9C5D81A1F34DDFA3616AE91D71385 /* MRStopableView.h in Headers */,\n\t\t\t\t87895EF9BEF0CFACE3AC7C3316F1E159 /* MRStopButton.h in Headers */,\n\t\t\t\t316879A6DF33BD9562D61E58D8C4B4CF /* UIImage+MRImageEffects.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t001BC949C81D3446CC112FB2A6823CA6 /* SAMKeychain */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 76711B89D8382AC5965BA97A77DC4DD0 /* Build configuration list for PBXNativeTarget \"SAMKeychain\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF5E4E875612D7D1B180A4DB1CEBB8491 /* Sources */,\n\t\t\t\tBBE23CD672042A59D3F34AF454059CF6 /* Frameworks */,\n\t\t\t\t8BC897BE11C865F6759DCAC26F9472FB /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SAMKeychain;\n\t\t\tproductName = SAMKeychain;\n\t\t\tproductReference = B28D0494DC34E330FBC88D8F6750D067 /* libSAMKeychain.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t48A42406A606C78F98A4B3336F77FF0D /* Pods-Dash */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 52E8F242087D6ACBFC346EBD11536992 /* Build configuration list for PBXNativeTarget \"Pods-Dash\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t85870ED0988820628606F1A7F53D9E96 /* Sources */,\n\t\t\t\t8C0EF796FC450CFED13130EF2DD63F8D /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t754073EEDEF8E439221B630F4C62E1FC /* PBXTargetDependency */,\n\t\t\t\t075D196118D7CA3D358DDCE9DCF4F7DC /* PBXTargetDependency */,\n\t\t\t\t7B2B8A6993E48B2EA86142199B924C14 /* PBXTargetDependency */,\n\t\t\t\tEC657C4F6416213EF88051F4ED3AF165 /* PBXTargetDependency */,\n\t\t\t\tED11F44E10CDC55245FAED2F3678911F /* PBXTargetDependency */,\n\t\t\t\t1A0FFE96C77E2402A12D4601E7EEFE91 /* PBXTargetDependency */,\n\t\t\t\t138A894BCF0AC929CC2B8EEE3C1BB4B2 /* PBXTargetDependency */,\n\t\t\t\tCB4D5D58FD25277B4FA761041C0986BA /* PBXTargetDependency */,\n\t\t\t\tDD2AE86A3B8B0C7297E92A33B7634F6B /* PBXTargetDependency */,\n\t\t\t\t3B13D30DF64076F0E3E77FDE1182F5E8 /* PBXTargetDependency */,\n\t\t\t\tC28227CA74C0E0DC3D9EDC6E76B2E106 /* PBXTargetDependency */,\n\t\t\t\t4C62C6141433269DA5AD6C732F04392C /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-Dash\";\n\t\t\tproductName = \"Pods-Dash\";\n\t\t\tproductReference = 93B457B27E1D2F99D3CE8B924FD1DB87 /* libPods-Dash.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t51B8BD3A7215E1C49BDFF9624C81C122 /* Reachability */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1C34E3308D4C92F59BE48B7295ED723C /* Build configuration list for PBXNativeTarget \"Reachability\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t11929BBD3127B80F545C89E375CFBAEC /* Sources */,\n\t\t\t\t3D70A7F1F6A9B30FF91433F85C2A291F /* Frameworks */,\n\t\t\t\t65519B2EC462D5F876B7E6D6B9C1BA25 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Reachability;\n\t\t\tproductName = Reachability;\n\t\t\tproductReference = 104F93417FF54A8015815E19065F0062 /* libReachability.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B5D16F1430E3813C6D9A8E7A6E3A4E3F /* Build configuration list for PBXNativeTarget \"DZNEmptyDataSet\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2261311B0BB20FFAAC730C6BC4FAC607 /* Sources */,\n\t\t\t\t337A15437F2D8E9608BBC9A7F937EB94 /* Frameworks */,\n\t\t\t\t9077FD721AC492135E5F3B9A67F65E6E /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = DZNEmptyDataSet;\n\t\t\tproductName = DZNEmptyDataSet;\n\t\t\tproductReference = 0D00F6FD7848428B8380399EA18E45D7 /* libDZNEmptyDataSet.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t6B79ACF002EDBC3062BBBF2EFE601A77 /* AutoCoding */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A1A88288A9FB80F394B96B6AC10371EA /* Build configuration list for PBXNativeTarget \"AutoCoding\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD2D9D0B2D16951CFD340A2B720695184 /* Sources */,\n\t\t\t\t07F9A2B76D80F3F87BA513132EEDB319 /* Frameworks */,\n\t\t\t\t1C89A2F9933F1331048AAEBF279C3CEE /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AutoCoding;\n\t\t\tproductName = AutoCoding;\n\t\t\tproductReference = 12883A78A65F5415395681C1CCE2FB7B /* libAutoCoding.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t7C214356709EB3EA286F3E87E9ABE638 /* JGMethodSwizzler */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 66DC9510EFF7EC3EE55E09584196482B /* Build configuration list for PBXNativeTarget \"JGMethodSwizzler\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE67AA28ABABE1A820E3DBB37035B2522 /* Sources */,\n\t\t\t\t47ED6F13E7DBE1E3CAF7C3880FE7543E /* Frameworks */,\n\t\t\t\tC7A25D3B201357FE16F25F63A72FAB78 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = JGMethodSwizzler;\n\t\t\tproductName = JGMethodSwizzler;\n\t\t\tproductReference = F448AA8EA61FAC4CBE9F713DE167453D /* libJGMethodSwizzler.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t84595B87540703321C4F92ED4C7575FE /* MRProgress */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 25231E6D5B81F6BB5C76801BCEF0F68A /* Build configuration list for PBXNativeTarget \"MRProgress\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t92BE3887BDD57388DEFB6C13A6437920 /* Sources */,\n\t\t\t\tB400B9F23CFC43953B22A2339BB1C9AB /* Frameworks */,\n\t\t\t\tECCD3F487CF43A573061A196C64CFDB4 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = MRProgress;\n\t\t\tproductName = MRProgress;\n\t\t\tproductReference = 16CE2E9B4DFC59E2E4E29137CC201E55 /* libMRProgress.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t85407D653E1E1525EECFECD395E9C4BC /* KissXML */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 27FFF3B4C45C0DD3A8FADFC6E762CC19 /* Build configuration list for PBXNativeTarget \"KissXML\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7A11432A2889AEC9BD047E44CDE6E92C /* Sources */,\n\t\t\t\t52241EECC4E4FA254010FF3C07D03C0C /* Frameworks */,\n\t\t\t\t9CA3F444F534E481EB287FFD51B16A21 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = KissXML;\n\t\t\tproductName = KissXML;\n\t\t\tproductReference = 63340E6208CA7F26315EA524567E6FD3 /* libKissXML.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t93968741040D3F47493996951FB3A9C3 /* Pods-Dash-Dash App Store */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = ADC679317283D2A904E27BB5C0BCF999 /* Build configuration list for PBXNativeTarget \"Pods-Dash-Dash App Store\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tBA85BB07D0EEDDC8E078611F57A423E4 /* Sources */,\n\t\t\t\t9034BC61AF8E7945C51164FD2871B099 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tAAA1772A0750CCAB55C215BF42D37D15 /* PBXTargetDependency */,\n\t\t\t\t9C6F5F05408D11FFAD0E8D3604BF56A0 /* PBXTargetDependency */,\n\t\t\t\t4C60B948F95036D109CAD84D52BFE28D /* PBXTargetDependency */,\n\t\t\t\tFC7B480FF7CC0CB8A00B39965358B419 /* PBXTargetDependency */,\n\t\t\t\tDDE2C834FEF9B29BCA0B5183A6DB4F3C /* PBXTargetDependency */,\n\t\t\t\t1DF3E4FB0FCAD8D9EEA54CB0256EC542 /* PBXTargetDependency */,\n\t\t\t\t8264B0A32031E2FB2B11C8946C09E029 /* PBXTargetDependency */,\n\t\t\t\t29FE70F3184C01E8097E8B20AA1333BE /* PBXTargetDependency */,\n\t\t\t\t0A4068CF46718A185A6890EDA5293946 /* PBXTargetDependency */,\n\t\t\t\tBAA521CC178E981E9A48D13FD61A7436 /* PBXTargetDependency */,\n\t\t\t\tD8E2E9B3F8D48B7F2BE3C7A22D67CD9F /* PBXTargetDependency */,\n\t\t\t\t890F569B45EFD033CF3893682D84EF90 /* PBXTargetDependency */,\n\t\t\t\tD3BDD540979E1E5BFA43E7B8B5BBA19B /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-Dash-Dash App Store\";\n\t\t\tproductName = \"Pods-Dash-Dash App Store\";\n\t\t\tproductReference = D27D6F1E0CF866727C3740CE96B1B2A0 /* libPods-Dash-Dash App Store.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t9A07BB0F2F4F1B91893B1C6FBF5370AD /* GZIP */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7AF3083CB2D38E8B84BE26EFE7738D19 /* Build configuration list for PBXNativeTarget \"GZIP\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t88C78B333D06D9872DE4E55FEF866D29 /* Sources */,\n\t\t\t\tF502727A3FD570F98F41E94B84DAE80E /* Frameworks */,\n\t\t\t\t3C8A9FFFFE9B9681FBD4DB5E158B1A6B /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = GZIP;\n\t\t\tproductName = GZIP;\n\t\t\tproductReference = 6DB335F79D3A762AB892FAF86D4C44EC /* libGZIP.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tB2F85E59A9E8D81925672C4C86FFB341 /* UIActionSheet+Blocks */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9598142E62D36247AAA38397A57F13CE /* Build configuration list for PBXNativeTarget \"UIActionSheet+Blocks\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7358CB2999A380341CE08F1316E084B0 /* Sources */,\n\t\t\t\t1151C52AFCC2B03BC2D493E621827010 /* Frameworks */,\n\t\t\t\tE1FC82BD36D516B9240AC4FC263D4957 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"UIActionSheet+Blocks\";\n\t\t\tproductName = \"UIActionSheet+Blocks\";\n\t\t\tproductReference = 4D77F184C03D91F974EDD54234A8532F /* libUIActionSheet+Blocks.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tC587F1B2FA2CB38A29F84936DEFD569D /* HockeySDK-HockeySDKResources */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0FC2FABFCFEBF498AF80B6AE02C030A5 /* Build configuration list for PBXNativeTarget \"HockeySDK-HockeySDKResources\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t0FF9CBA4DD3425B7E8E790CB76D18160 /* Sources */,\n\t\t\t\tD83F41C35122B9469EFE0B26DE89F3E2 /* Frameworks */,\n\t\t\t\tEDD671D0392060F0FE733EF56A6C89BA /* 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 = \"HockeySDK-HockeySDKResources\";\n\t\t\tproductName = \"HockeySDK-HockeySDKResources\";\n\t\t\tproductReference = 88AFEC1F5BCE183847916970F0B9EA45 /* HockeySDKResources.bundle */;\n\t\t\tproductType = \"com.apple.product-type.bundle\";\n\t\t};\n\t\tDADAF06B5E16CD200A3DE165E9BA39E1 /* UIAlertView+Blocks */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6B819F801BA9352673C17E081DB38DE9 /* Build configuration list for PBXNativeTarget \"UIAlertView+Blocks\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEB867292960838D808E464E76ED054BF /* Sources */,\n\t\t\t\t193103B8F8F6FFB0BD8F43815488878B /* Frameworks */,\n\t\t\t\tB1A74C34B4DDF8400178EB3D58739551 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"UIAlertView+Blocks\";\n\t\t\tproductName = \"UIAlertView+Blocks\";\n\t\t\tproductReference = DD5134FBB59949CD358CEF56FC63FBF0 /* libUIAlertView+Blocks.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tE7D82D1B5D56CA867A0AD3B41611D15F /* DTBonjour */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 00CD87AFF561E11DF57D0ED948CB3961 /* Build configuration list for PBXNativeTarget \"DTBonjour\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE0D81412C7113A49B8C5735D9C9D983E /* Sources */,\n\t\t\t\t902B8011750038C212E6AA09AAABD7DB /* Frameworks */,\n\t\t\t\t9BCD2E99AFDCB0060E1BB354D6BF1C6F /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = DTBonjour;\n\t\t\tproductName = DTBonjour;\n\t\t\tproductReference = 85CDF0B04D620505A5756242E236179C /* libDTBonjour.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\tFA90B05AA5C2F1ADFD061D57E35B0F7A /* NSTimer-Blocks */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1662348920CBB1C6452CF92458303289 /* Build configuration list for PBXNativeTarget \"NSTimer-Blocks\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD33CD92522167E97BD402A293EDA1E99 /* Sources */,\n\t\t\t\tFB9E53A23841A32B3798606739F8EBC9 /* Frameworks */,\n\t\t\t\tDF43DBEB42812793DE3A46DB7107D73D /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"NSTimer-Blocks\";\n\t\t\tproductName = \"NSTimer-Blocks\";\n\t\t\tproductReference = BF032C7C6DA415681352D289149BCBF0 /* libNSTimer-Blocks.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\tD41D8CD98F00B204E9800998ECF8427E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0930;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t};\n\t\t\tbuildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* 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 = 7DB346D0F39D3F0E887471402A8071AB;\n\t\t\tproductRefGroup = 326108964A9E4DB1933FF21E8DDFCCCE /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6B79ACF002EDBC3062BBBF2EFE601A77 /* AutoCoding */,\n\t\t\t\tE7D82D1B5D56CA867A0AD3B41611D15F /* DTBonjour */,\n\t\t\t\t5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */,\n\t\t\t\t9A07BB0F2F4F1B91893B1C6FBF5370AD /* GZIP */,\n\t\t\t\tC587F1B2FA2CB38A29F84936DEFD569D /* HockeySDK-HockeySDKResources */,\n\t\t\t\t7C214356709EB3EA286F3E87E9ABE638 /* JGMethodSwizzler */,\n\t\t\t\t85407D653E1E1525EECFECD395E9C4BC /* KissXML */,\n\t\t\t\t84595B87540703321C4F92ED4C7575FE /* MRProgress */,\n\t\t\t\tFA90B05AA5C2F1ADFD061D57E35B0F7A /* NSTimer-Blocks */,\n\t\t\t\t48A42406A606C78F98A4B3336F77FF0D /* Pods-Dash */,\n\t\t\t\t93968741040D3F47493996951FB3A9C3 /* Pods-Dash-Dash App Store */,\n\t\t\t\t51B8BD3A7215E1C49BDFF9624C81C122 /* Reachability */,\n\t\t\t\t001BC949C81D3446CC112FB2A6823CA6 /* SAMKeychain */,\n\t\t\t\tB2F85E59A9E8D81925672C4C86FFB341 /* UIActionSheet+Blocks */,\n\t\t\t\tDADAF06B5E16CD200A3DE165E9BA39E1 /* UIAlertView+Blocks */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tEDD671D0392060F0FE733EF56A6C89BA /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t970466C82DB88ECDDD27BF3E9DF4FC46 /* AppIconPlaceHolder.png in Resources */,\n\t\t\t\t1741C39F86DB6FEA459F2B549CD326FB /* Arrow.png in Resources */,\n\t\t\t\t4BD0CD3F98A9DECD717A405B6F5B7D85 /* Arrow@2x.png in Resources */,\n\t\t\t\tE244908082C989A96CA733AD2B3C78AB /* Arrow@3x.png in Resources */,\n\t\t\t\tEEBE916DB2F225C07EF64E2D05060418 /* authorize_denied.png in Resources */,\n\t\t\t\tD07FABF52BC4DA8B8D3C35DCAD6BC2BD /* authorize_denied@2x.png in Resources */,\n\t\t\t\t945181D2B7E30D3C0B07EDEC26E1FC2B /* authorize_denied@3x.png in Resources */,\n\t\t\t\tDDC7B4901BAFE62B6B02777D1FA029F4 /* bg.png in Resources */,\n\t\t\t\tBA2233A98BC53B7D3A80D66A15750525 /* Blur.png in Resources */,\n\t\t\t\t34F1B4DCE098F105AAE2C9CA9A58EF85 /* Blur@2x.png in Resources */,\n\t\t\t\t94673DF28CFD10AF179F7D04CDA8BAC5 /* Blur@3x.png in Resources */,\n\t\t\t\t94B7C8911B2A9A08A71606D9581A1148 /* buttonRoundedDelete.png in Resources */,\n\t\t\t\t3B13A83F0B416416FE3AE60DD68D00B4 /* buttonRoundedDelete@2x.png in Resources */,\n\t\t\t\t1B9228F487DF7B494E7E8E93DF2D2371 /* buttonRoundedDeleteHighlighted.png in Resources */,\n\t\t\t\t10E71ECB9306E5534B085AEA0BCD8A52 /* buttonRoundedDeleteHighlighted@2x.png in Resources */,\n\t\t\t\tA416F348274132328F2F7889EE0070B0 /* buttonRoundedRegular.png in Resources */,\n\t\t\t\t0EB4EA6580DAE04E7C6E70ECF6434B32 /* buttonRoundedRegular@2x.png in Resources */,\n\t\t\t\t05B2A27272B2CE67127CD9DD9E729606 /* buttonRoundedRegularHighlighted.png in Resources */,\n\t\t\t\t95B86A37516E4159141D192C653EC815 /* buttonRoundedRegularHighlighted@2x.png in Resources */,\n\t\t\t\tC55B22B5563005DBE84409659356E8F3 /* Cancel.png in Resources */,\n\t\t\t\t7D498B858EFD7F9E012A78B81781175B /* Cancel@2x.png in Resources */,\n\t\t\t\t3E08E40938C162E223543E74CC97374E /* Cancel@3x.png in Resources */,\n\t\t\t\t4F01E11E5BC96B92C255589CF5BBCC49 /* de.lproj in Resources */,\n\t\t\t\t682F3F35A8D7954EAD87213CF6D92CA6 /* en.lproj in Resources */,\n\t\t\t\tA9DDA23615CC07AA99D48471BF75C2C1 /* es.lproj in Resources */,\n\t\t\t\tB8D849B69A2177B7C31381E54D1A0712 /* fa.lproj in Resources */,\n\t\t\t\tFC3045CA8195C0BF3460910978BEE9B2 /* feedbackActivity.png in Resources */,\n\t\t\t\tAD12DCF1C2174A7E2FA68AF2D7D59DAF /* feedbackActivity@2x.png in Resources */,\n\t\t\t\t40902EEE245159F48FE2048E0DAE9168 /* feedbackActivity@2x~ipad.png in Resources */,\n\t\t\t\tD9DEFA783A3190B4261843DCF2D07E6E /* feedbackActivity@3x.png in Resources */,\n\t\t\t\t59CA5F7719005184AB71884C81DFA971 /* feedbackActivity~ipad.png in Resources */,\n\t\t\t\tCF06D2A6538A5E191A84AAD84742D4B2 /* FeedbackPlaceholder.png in Resources */,\n\t\t\t\t6EC8E3228BB60E487E156467919BA83A /* fr.lproj in Resources */,\n\t\t\t\t10102D2E1E4FCF01E4839F71170EF4FA /* hr.lproj in Resources */,\n\t\t\t\t0BE0EB2E46F8813032EC45640B8B595B /* hu.lproj in Resources */,\n\t\t\t\t7C4D1F326A2B12AE370997778531801A /* iconCamera.png in Resources */,\n\t\t\t\tBF9BA87EFEB1661385681C47E3F5AF1F /* iconCamera@2x.png in Resources */,\n\t\t\t\t3D99AEFD65C4B18FF4D751CC43DEAF0D /* IconGradient.png in Resources */,\n\t\t\t\tCCFF4CE602C8186E2465ADE936E75F08 /* IconGradient@2x.png in Resources */,\n\t\t\t\t4EC2B357CD04FCBA1A75CC7A477153CC /* it.lproj in Resources */,\n\t\t\t\t9369C7444953229DAAFC0D616CCAC0FF /* ja.lproj in Resources */,\n\t\t\t\t35720EF83CF77037C3DF93CCA5394BF6 /* nb.lproj in Resources */,\n\t\t\t\t2744196B80834C8C64B2B22220285201 /* nl.lproj in Resources */,\n\t\t\t\tCA8BF5345E764D249B03B1A6778AED0F /* Ok.png in Resources */,\n\t\t\t\t7D99EDF1A4767CCDB9B5E29DA6D6B8D6 /* Ok@2x.png in Resources */,\n\t\t\t\tECAE78B15FAE7AF144F6EA0A1F03AF16 /* Ok@3x.png in Resources */,\n\t\t\t\t4548C1011A02C777B4B263AD821A2DD3 /* pt-PT.lproj in Resources */,\n\t\t\t\tA8D32AA73678855CF6E93D4FFEA2F7AF /* pt.lproj in Resources */,\n\t\t\t\t7BF1BC9703683E3CDD159A6264CFB58B /* Rectangle.png in Resources */,\n\t\t\t\t8D401BC540B6CF254C8C5E2B2E41636D /* Rectangle@2x.png in Resources */,\n\t\t\t\t211848600C7182B0051E73DE82B20421 /* Rectangle@3x.png in Resources */,\n\t\t\t\t7DDD41B9276BFE828CD85F7E049F9A7A /* ru.lproj in Resources */,\n\t\t\t\t7FC1A2AC6EE5A2A9FED69B5D8C39ECA9 /* tr.lproj in Resources */,\n\t\t\t\t8F7E5E1D1B7D7B814864BFCAEBCAF00F /* zh-Hans.lproj in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t0FF9CBA4DD3425B7E8E790CB76D18160 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t11929BBD3127B80F545C89E375CFBAEC /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t518635F73746F6AC6FAB80281F5FFBE5 /* Reachability-dummy.m in Sources */,\n\t\t\t\tBB639C5280B0B5146F7A423B92C0B9DD /* Reachability.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2261311B0BB20FFAAC730C6BC4FAC607 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t853A9C3D08C8663BC7CD6B9F3B2CDF82 /* DZNEmptyDataSet-dummy.m in Sources */,\n\t\t\t\t35DE995FE1330AC6A960B9A41EBA5BE1 /* UIScrollView+EmptyDataSet.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7358CB2999A380341CE08F1316E084B0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t222F2E16CD9C0942488716084D20E59B /* UIActionSheet+Blocks-dummy.m in Sources */,\n\t\t\t\t880D737B2ADE1817A5541EE531A885A6 /* UIActionSheet+Blocks.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A11432A2889AEC9BD047E44CDE6E92C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB6C70846F73FBF29EF6884148FE10D52 /* DDXMLDocument.m in Sources */,\n\t\t\t\tABAD06AA5EFA82D3694D7EF495F35BF2 /* DDXMLElement.m in Sources */,\n\t\t\t\tBDFBB01F3C921A41A6861154627D3BC2 /* DDXMLElementAdditions.m in Sources */,\n\t\t\t\t687B2FDD0AAB81AE870D13E703C43A76 /* DDXMLNode.m in Sources */,\n\t\t\t\t30257396D21B0270BA8CB0966BFCBA78 /* KissXML-dummy.m in Sources */,\n\t\t\t\tCD37886F1CF48A1DE0D1AF047F7BD37A /* NSString+DDXML.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t85870ED0988820628606F1A7F53D9E96 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7C9932F486CC710949304F3E5174DBDA /* Pods-Dash-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t88C78B333D06D9872DE4E55FEF866D29 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tABC6717E8D915376E89BC88749877AF2 /* GZIP-dummy.m in Sources */,\n\t\t\t\t305B1478BF6997FBB91CEC7CC4B66545 /* NSData+GZIP.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t92BE3887BDD57388DEFB6C13A6437920 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC192B09BAEC8DD38B8CB80CD93975389 /* MRActivityIndicatorView.m in Sources */,\n\t\t\t\t35D49A3C17A4531B622581515375086B /* MRBlurView.m in Sources */,\n\t\t\t\t7093E19B30DE09BA7814269DA51CA622 /* MRCircularProgressView.m in Sources */,\n\t\t\t\tCE3C10407C377723B454E62E5E9071DE /* MRIconView.m in Sources */,\n\t\t\t\t64D623FEDDAC23BDA3A853D623C5D9A2 /* MRNavigationBarProgressView.m in Sources */,\n\t\t\t\t346864D11D763C076018847484B03709 /* MRProgress-dummy.m in Sources */,\n\t\t\t\tB48752A7C35E86FBE6C9B08DDEA7F972 /* MRProgressOverlayView.m in Sources */,\n\t\t\t\t555F6CA45E9184776CB2CC4EB50A4057 /* MRProgressView.m in Sources */,\n\t\t\t\t28D88E4C381A992360345EC739B3E8FD /* MRStopButton.m in Sources */,\n\t\t\t\tE18F6605DAF832B7261E79F0D0EDFEB6 /* UIImage+MRImageEffects.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBA85BB07D0EEDDC8E078611F57A423E4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t27D496CF5EE7BA692B7D16E0B442D9F9 /* Pods-Dash-Dash App Store-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD2D9D0B2D16951CFD340A2B720695184 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC8E714DEC1EFBF9A671A153FD1323CD9 /* AutoCoding-dummy.m in Sources */,\n\t\t\t\t3DE15B6BA3E28208CE1B429C27EF08FA /* AutoCoding.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD33CD92522167E97BD402A293EDA1E99 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBF8E6137595AE3D14FE2BD3E9448DDFD /* NSTimer+Blocks.m in Sources */,\n\t\t\t\tD1D927CF7E659A0B1815BB61B35E1570 /* NSTimer-Blocks-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE0D81412C7113A49B8C5735D9C9D983E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD4560C8A16C01866A8AEAD4892BCF1BD /* DTBonjour-dummy.m in Sources */,\n\t\t\t\tE2E7D79D78E4D6AB18B12DCC37DFEDF6 /* DTBonjourDataChunk.m in Sources */,\n\t\t\t\t781D8A34B99AF419688D9DC70220B2C0 /* DTBonjourDataConnection.m in Sources */,\n\t\t\t\t73E63C7B0EAA5A9659C38F1CCE850837 /* DTBonjourServer.m in Sources */,\n\t\t\t\tD16E811FC9BA80554A32C10AD954B70F /* NSScanner+DTBonjour.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE67AA28ABABE1A820E3DBB37035B2522 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t39CB850EF4296921B301F2F60C5A094A /* JGMethodSwizzler-dummy.m in Sources */,\n\t\t\t\t46BAB6394E367A6742A1EC295A24F0C1 /* JGMethodSwizzler.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB867292960838D808E464E76ED054BF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t37A59DD6DDA29B24E168EBF22652F927 /* UIAlertView+Blocks-dummy.m in Sources */,\n\t\t\t\t75D44699D0B8624F62EFD3869A923CFC /* UIAlertView+Blocks.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF5E4E875612D7D1B180A4DB1CEBB8491 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t674952B3CF29046A4CD03B998A1BF2DB /* SAMKeychain-dummy.m in Sources */,\n\t\t\t\t9F517A0B7A6D86A000F09E64D1D854A3 /* SAMKeychain.m in Sources */,\n\t\t\t\tD424DBAFC12C066FB827DF6315A0C91E /* SAMKeychainQuery.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\t075D196118D7CA3D358DDCE9DCF4F7DC /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = DTBonjour;\n\t\t\ttarget = E7D82D1B5D56CA867A0AD3B41611D15F /* DTBonjour */;\n\t\t\ttargetProxy = 4EC09E8966CB2CE6AC85C2D026B2AC03 /* PBXContainerItemProxy */;\n\t\t};\n\t\t0A4068CF46718A185A6890EDA5293946 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"NSTimer-Blocks\";\n\t\t\ttarget = FA90B05AA5C2F1ADFD061D57E35B0F7A /* NSTimer-Blocks */;\n\t\t\ttargetProxy = A52BBC4252D6C5812FBB2598931673F4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t138A894BCF0AC929CC2B8EEE3C1BB4B2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = MRProgress;\n\t\t\ttarget = 84595B87540703321C4F92ED4C7575FE /* MRProgress */;\n\t\t\ttargetProxy = B2E376447672E5AEED15D7EC8A094297 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1A0FFE96C77E2402A12D4601E7EEFE91 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = KissXML;\n\t\t\ttarget = 85407D653E1E1525EECFECD395E9C4BC /* KissXML */;\n\t\t\ttargetProxy = 0A010E712E16F1BABE3FFE60D65BDD41 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1DF3E4FB0FCAD8D9EEA54CB0256EC542 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = JGMethodSwizzler;\n\t\t\ttarget = 7C214356709EB3EA286F3E87E9ABE638 /* JGMethodSwizzler */;\n\t\t\ttargetProxy = C0DDED5DC8F23722FC319E6E179D14CC /* PBXContainerItemProxy */;\n\t\t};\n\t\t29FE70F3184C01E8097E8B20AA1333BE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = MRProgress;\n\t\t\ttarget = 84595B87540703321C4F92ED4C7575FE /* MRProgress */;\n\t\t\ttargetProxy = 673175C622B6C2DD473C07E065FBC5BE /* PBXContainerItemProxy */;\n\t\t};\n\t\t3B13D30DF64076F0E3E77FDE1182F5E8 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SAMKeychain;\n\t\t\ttarget = 001BC949C81D3446CC112FB2A6823CA6 /* SAMKeychain */;\n\t\t\ttargetProxy = AA45C3B8D919C565A0D184957BBC1276 /* PBXContainerItemProxy */;\n\t\t};\n\t\t4C60B948F95036D109CAD84D52BFE28D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = DZNEmptyDataSet;\n\t\t\ttarget = 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */;\n\t\t\ttargetProxy = ACC57718D77DB15712A61B3367F59B05 /* PBXContainerItemProxy */;\n\t\t};\n\t\t4C62C6141433269DA5AD6C732F04392C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"UIAlertView+Blocks\";\n\t\t\ttarget = DADAF06B5E16CD200A3DE165E9BA39E1 /* UIAlertView+Blocks */;\n\t\t\ttargetProxy = 0BD3AF11070D61A2B9202F89F2D8B132 /* PBXContainerItemProxy */;\n\t\t};\n\t\t754073EEDEF8E439221B630F4C62E1FC /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = AutoCoding;\n\t\t\ttarget = 6B79ACF002EDBC3062BBBF2EFE601A77 /* AutoCoding */;\n\t\t\ttargetProxy = 0164EE61A588E9DA58A5ED2F8A43D775 /* PBXContainerItemProxy */;\n\t\t};\n\t\t7B2B8A6993E48B2EA86142199B924C14 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = DZNEmptyDataSet;\n\t\t\ttarget = 5437890023F30CA85DFCA260CA914D48 /* DZNEmptyDataSet */;\n\t\t\ttargetProxy = 24975C0EB4271870CCBB8411831C4791 /* PBXContainerItemProxy */;\n\t\t};\n\t\t8264B0A32031E2FB2B11C8946C09E029 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = KissXML;\n\t\t\ttarget = 85407D653E1E1525EECFECD395E9C4BC /* KissXML */;\n\t\t\ttargetProxy = 8A5DC2557384E1EE688F595E0BBEB627 /* PBXContainerItemProxy */;\n\t\t};\n\t\t890F569B45EFD033CF3893682D84EF90 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"UIActionSheet+Blocks\";\n\t\t\ttarget = B2F85E59A9E8D81925672C4C86FFB341 /* UIActionSheet+Blocks */;\n\t\t\ttargetProxy = 91F58B28666440A7CAA0E9B0436FACAA /* PBXContainerItemProxy */;\n\t\t};\n\t\t9C6F5F05408D11FFAD0E8D3604BF56A0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = DTBonjour;\n\t\t\ttarget = E7D82D1B5D56CA867A0AD3B41611D15F /* DTBonjour */;\n\t\t\ttargetProxy = 18A5E93AC00668AE563E024377383F06 /* PBXContainerItemProxy */;\n\t\t};\n\t\tAAA1772A0750CCAB55C215BF42D37D15 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = AutoCoding;\n\t\t\ttarget = 6B79ACF002EDBC3062BBBF2EFE601A77 /* AutoCoding */;\n\t\t\ttargetProxy = 126242EDC27747F1B05914816285C84E /* PBXContainerItemProxy */;\n\t\t};\n\t\tBAA521CC178E981E9A48D13FD61A7436 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Reachability;\n\t\t\ttarget = 51B8BD3A7215E1C49BDFF9624C81C122 /* Reachability */;\n\t\t\ttargetProxy = 46039A0327730D97650BD3FA503FC6FF /* PBXContainerItemProxy */;\n\t\t};\n\t\tC28227CA74C0E0DC3D9EDC6E76B2E106 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"UIActionSheet+Blocks\";\n\t\t\ttarget = B2F85E59A9E8D81925672C4C86FFB341 /* UIActionSheet+Blocks */;\n\t\t\ttargetProxy = 7E37BC20B54CC453EC94D2A33BBE7E32 /* PBXContainerItemProxy */;\n\t\t};\n\t\tCB4D5D58FD25277B4FA761041C0986BA /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"NSTimer-Blocks\";\n\t\t\ttarget = FA90B05AA5C2F1ADFD061D57E35B0F7A /* NSTimer-Blocks */;\n\t\t\ttargetProxy = B76B94CC2B23C0E485E85A53B152D741 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD3BDD540979E1E5BFA43E7B8B5BBA19B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"UIAlertView+Blocks\";\n\t\t\ttarget = DADAF06B5E16CD200A3DE165E9BA39E1 /* UIAlertView+Blocks */;\n\t\t\ttargetProxy = 91FD28CD77F598923CA6DE04F1DC7F66 /* PBXContainerItemProxy */;\n\t\t};\n\t\tD8E2E9B3F8D48B7F2BE3C7A22D67CD9F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SAMKeychain;\n\t\t\ttarget = 001BC949C81D3446CC112FB2A6823CA6 /* SAMKeychain */;\n\t\t\ttargetProxy = B59F03ECB0F3301FF34FB07614CDF203 /* PBXContainerItemProxy */;\n\t\t};\n\t\tDD2AE86A3B8B0C7297E92A33B7634F6B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Reachability;\n\t\t\ttarget = 51B8BD3A7215E1C49BDFF9624C81C122 /* Reachability */;\n\t\t\ttargetProxy = 4930B72C00D5A4522AEAF45A91FE28A7 /* PBXContainerItemProxy */;\n\t\t};\n\t\tDDE2C834FEF9B29BCA0B5183A6DB4F3C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"HockeySDK-HockeySDKResources\";\n\t\t\ttarget = C587F1B2FA2CB38A29F84936DEFD569D /* HockeySDK-HockeySDKResources */;\n\t\t\ttargetProxy = 287341CC8385E6E015D8FBAD1D8E6F76 /* PBXContainerItemProxy */;\n\t\t};\n\t\tEC657C4F6416213EF88051F4ED3AF165 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = GZIP;\n\t\t\ttarget = 9A07BB0F2F4F1B91893B1C6FBF5370AD /* GZIP */;\n\t\t\ttargetProxy = EDC243D81097BD6385F6345BA2612301 /* PBXContainerItemProxy */;\n\t\t};\n\t\tED11F44E10CDC55245FAED2F3678911F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = JGMethodSwizzler;\n\t\t\ttarget = 7C214356709EB3EA286F3E87E9ABE638 /* JGMethodSwizzler */;\n\t\t\ttargetProxy = 5D9806CFBCC7DEE9D3A9A4BF2B611125 /* PBXContainerItemProxy */;\n\t\t};\n\t\tFC7B480FF7CC0CB8A00B39965358B419 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = GZIP;\n\t\t\ttarget = 9A07BB0F2F4F1B91893B1C6FBF5370AD /* GZIP */;\n\t\t\ttargetProxy = CA39055B88F944B9B875F5107E9B50F6 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0E0219F2A14118F94B7872095CA7F383 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 983473DA2AEB53A34C6BDE44801A0926 /* SAMKeychain.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SAMKeychain/SAMKeychain-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t0F5846263DFF167156D99980FC118B40 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BF1FA01D0210D011E3D4EE235FBD4083 /* DTBonjour.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/DTBonjour/DTBonjour-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t149F683B4107765F292D8AE6903713AE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2F180F4A30921E1AAAAB3216CB244920 /* MRProgress.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MRProgress/MRProgress-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1A23D0535F9CB61ADA209FD5E85EAD86 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 73FC0BFFD1ED9DB968A2881BE528C162 /* Pods-Dash-Dash App Store.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2096F75BD1F3786E662DF08BEEDDD63E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5B983C0171A4ACCE151173377A894AC7 /* Reachability.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Reachability/Reachability-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t26F954BA177A9A46FFFD4E23ED11D67A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = 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_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_RELEASE=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\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 = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t38B7AF2F3B7BC842EA9883778014381F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2F2216C81601AF4BF010CE1A174A879E /* GZIP.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/GZIP/GZIP-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4745D849F0187B4428BE74F2753A440C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 983473DA2AEB53A34C6BDE44801A0926 /* SAMKeychain.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SAMKeychain/SAMKeychain-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4B2F295CBC0FCCBC420B81D17156D59B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A2094A9ED71A519FFC1F65E0B8A4EF88 /* NSTimer-Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/NSTimer-Blocks/NSTimer-Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5C215C181D6C22B13BAE33D8777C4B2B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A2094A9ED71A519FFC1F65E0B8A4EF88 /* NSTimer-Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/NSTimer-Blocks/NSTimer-Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6097C6E9056BEA6688AB6BA3DF3C8751 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5B983C0171A4ACCE151173377A894AC7 /* Reachability.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Reachability/Reachability-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t74D46BDDE311CF37C586C56E73878BCC /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C408198D9D085441B2287D6A9913CC4D /* JGMethodSwizzler.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/JGMethodSwizzler/JGMethodSwizzler-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t78F396B7CB0DAE19FFEC258B6CECBD48 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2F180F4A30921E1AAAAB3216CB244920 /* MRProgress.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MRProgress/MRProgress-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7F17F5F07D5B5A253573D40A83BB2363 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3E531164633FB25AF4591712A3E2040B /* Pods-Dash.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t810FBEDAEF4994BA7D69B0224DF665A1 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E9882BEB273105CC10726B7609551527 /* UIActionSheet+Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/UIActionSheet+Blocks/UIActionSheet+Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8689393B82B21654E475B368E1E1E908 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6F235F3E87F30CDC1AB2EED0B2FF14B /* Pods-Dash.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t88D784148159D796E0BF3B6FDA2957F7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D883A6285BBA55CE226C8006DFE25741 /* KissXML.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/KissXML/KissXML-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8B56DF5790ED93284DC3D8A645820BB7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C7EFACEA351E50B925CFA7DA44D34A2A /* UIAlertView+Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/UIAlertView+Blocks/UIAlertView+Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8BCE6FCE034D56C096BAB5CFE2FA51C4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCONFIGURATION_BUILD_DIR = \"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/HockeySDK\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/HockeySDK/ResourceBundle-HockeySDKResources-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"${PRODUCT_BUNDLE_IDENTIFIER}\";\n\t\t\t\tPRODUCT_NAME = HockeySDKResources;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8D67096C87E49A4D6384CDAB885BF405 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C681197DEBD6E2C5856051E22CAB73A8 /* DZNEmptyDataSet.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t984B9CCD9FE97D1259CD4052AB816C76 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BF1FA01D0210D011E3D4EE235FBD4083 /* DTBonjour.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/DTBonjour/DTBonjour-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9DE2319F28E4C46D8BAA85AE50DBFC29 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C408198D9D085441B2287D6A9913CC4D /* JGMethodSwizzler.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/JGMethodSwizzler/JGMethodSwizzler-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tACC9F1B15BA0F567D59525A904CC3557 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E9882BEB273105CC10726B7609551527 /* UIActionSheet+Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/UIActionSheet+Blocks/UIActionSheet+Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB4D21B4293A363A69A7C4BFD039140EE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3C39B4364B7076B8908B8B116F624AE1 /* AutoCoding.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/AutoCoding/AutoCoding-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC5A0A3A10F7C0BA4D27F71FAF33BDEEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C7EFACEA351E50B925CFA7DA44D34A2A /* UIAlertView+Blocks.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/UIAlertView+Blocks/UIAlertView+Blocks-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tC70E01CD165D8554DC3FA5F28D420B93 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 2F2216C81601AF4BF010CE1A174A879E /* GZIP.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/GZIP/GZIP-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD8199868075D0B8BADDD3465D218AC26 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3C39B4364B7076B8908B8B116F624AE1 /* AutoCoding.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/AutoCoding/AutoCoding-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE2BF6D6731C31DE69900B7B24E6F0445 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = 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_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_DEBUG=1\",\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_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\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 = 9.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tE8CB17F0F1AD9A64D800F278D8F33B5F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = D883A6285BBA55CE226C8006DFE25741 /* KissXML.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/KissXML/KissXML-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF384A8C28EE2767B11C7CB0174734888 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BFDF824F36DFFB6F90C8157DAC66BA75 /* Pods-Dash-Dash App Store.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.0;\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF7C8884A4169F61E895CAA8D6AD1CE77 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCONFIGURATION_BUILD_DIR = \"$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/HockeySDK\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/HockeySDK/ResourceBundle-HockeySDKResources-Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"${PRODUCT_BUNDLE_IDENTIFIER}\";\n\t\t\t\tPRODUCT_NAME = HockeySDKResources;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tWRAPPER_EXTENSION = bundle;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tFDBC60D547E8DA8EBEB2B948346AAD97 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = C681197DEBD6E2C5856051E22CAB73A8 /* DZNEmptyDataSet.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPRIVATE_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tPUBLIC_HEADERS_FOLDER_PATH = \"\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\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\t00CD87AFF561E11DF57D0ED948CB3961 /* Build configuration list for PBXNativeTarget \"DTBonjour\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0F5846263DFF167156D99980FC118B40 /* Debug */,\n\t\t\t\t984B9CCD9FE97D1259CD4052AB816C76 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0FC2FABFCFEBF498AF80B6AE02C030A5 /* Build configuration list for PBXNativeTarget \"HockeySDK-HockeySDKResources\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF7C8884A4169F61E895CAA8D6AD1CE77 /* Debug */,\n\t\t\t\t8BCE6FCE034D56C096BAB5CFE2FA51C4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1662348920CBB1C6452CF92458303289 /* Build configuration list for PBXNativeTarget \"NSTimer-Blocks\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4B2F295CBC0FCCBC420B81D17156D59B /* Debug */,\n\t\t\t\t5C215C181D6C22B13BAE33D8777C4B2B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1C34E3308D4C92F59BE48B7295ED723C /* Build configuration list for PBXNativeTarget \"Reachability\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2096F75BD1F3786E662DF08BEEDDD63E /* Debug */,\n\t\t\t\t6097C6E9056BEA6688AB6BA3DF3C8751 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t25231E6D5B81F6BB5C76801BCEF0F68A /* Build configuration list for PBXNativeTarget \"MRProgress\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t149F683B4107765F292D8AE6903713AE /* Debug */,\n\t\t\t\t78F396B7CB0DAE19FFEC258B6CECBD48 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t27FFF3B4C45C0DD3A8FADFC6E762CC19 /* Build configuration list for PBXNativeTarget \"KissXML\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t88D784148159D796E0BF3B6FDA2957F7 /* Debug */,\n\t\t\t\tE8CB17F0F1AD9A64D800F278D8F33B5F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE2BF6D6731C31DE69900B7B24E6F0445 /* Debug */,\n\t\t\t\t26F954BA177A9A46FFFD4E23ED11D67A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t52E8F242087D6ACBFC346EBD11536992 /* Build configuration list for PBXNativeTarget \"Pods-Dash\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8689393B82B21654E475B368E1E1E908 /* Debug */,\n\t\t\t\t7F17F5F07D5B5A253573D40A83BB2363 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t66DC9510EFF7EC3EE55E09584196482B /* Build configuration list for PBXNativeTarget \"JGMethodSwizzler\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9DE2319F28E4C46D8BAA85AE50DBFC29 /* Debug */,\n\t\t\t\t74D46BDDE311CF37C586C56E73878BCC /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6B819F801BA9352673C17E081DB38DE9 /* Build configuration list for PBXNativeTarget \"UIAlertView+Blocks\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8B56DF5790ED93284DC3D8A645820BB7 /* Debug */,\n\t\t\t\tC5A0A3A10F7C0BA4D27F71FAF33BDEEE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t76711B89D8382AC5965BA97A77DC4DD0 /* Build configuration list for PBXNativeTarget \"SAMKeychain\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0E0219F2A14118F94B7872095CA7F383 /* Debug */,\n\t\t\t\t4745D849F0187B4428BE74F2753A440C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7AF3083CB2D38E8B84BE26EFE7738D19 /* Build configuration list for PBXNativeTarget \"GZIP\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC70E01CD165D8554DC3FA5F28D420B93 /* Debug */,\n\t\t\t\t38B7AF2F3B7BC842EA9883778014381F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9598142E62D36247AAA38397A57F13CE /* Build configuration list for PBXNativeTarget \"UIActionSheet+Blocks\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tACC9F1B15BA0F567D59525A904CC3557 /* Debug */,\n\t\t\t\t810FBEDAEF4994BA7D69B0224DF665A1 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA1A88288A9FB80F394B96B6AC10371EA /* Build configuration list for PBXNativeTarget \"AutoCoding\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB4D21B4293A363A69A7C4BFD039140EE /* Debug */,\n\t\t\t\tD8199868075D0B8BADDD3465D218AC26 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tADC679317283D2A904E27BB5C0BCF999 /* Build configuration list for PBXNativeTarget \"Pods-Dash-Dash App Store\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tF384A8C28EE2767B11C7CB0174734888 /* Debug */,\n\t\t\t\t1A23D0535F9CB61ADA209FD5E85EAD86 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB5D16F1430E3813C6D9A8E7A6E3A4E3F /* Build configuration list for PBXNativeTarget \"DZNEmptyDataSet\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8D67096C87E49A4D6384CDAB885BF405 /* Debug */,\n\t\t\t\tFDBC60D547E8DA8EBEB2B948346AAD97 /* 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 = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n}\n"
  },
  {
    "path": "Pods/Reachability/LICENCE.txt",
    "content": "Copyright (c) 2011-2013, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Pods/Reachability/README.md",
    "content": "[![Reference Status](https://www.versioneye.com/objective-c/reachability/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/reachability/references)\n\n# Reachability\n\nThis is a drop-in replacement for Apple's `Reachability` class. It is ARC-compatible, and it uses the new GCD methods to notify of network interface changes.\n\nIn addition to the standard `NSNotification`, it supports the use of blocks for when the network becomes reachable and unreachable.\n\nFinally, you can specify whether a WWAN connection is considered \"reachable\".\n\n*DO NOT OPEN BUGS UNTIL YOU HAVE TESTED ON DEVICE*\n\n## Requirements\n\nOnce you have added the `.h/m` files to your project, simply:\n\n* Go to the `Project->TARGETS->Build Phases->Link Binary With Libraries`.\n* Press the plus in the lower left of the list.\n* Add `SystemConfiguration.framework`.\n\nBoom, you're done.\n\n## Examples\n\n### Block Example\n\nThis sample uses blocks to notify when the interface state has changed. The blocks will be called on a **BACKGROUND THREAD**, so you need to dispatch UI updates onto the main thread.\n\n\t// Allocate a reachability object\n\tReachability* reach = [Reachability reachabilityWithHostname:@\"www.google.com\"];\n\n\t// Set the blocks\n\treach.reachableBlock = ^(Reachability*reach)\n\t{\n\t\t// keep in mind this is called on a background thread\n\t\t// and if you are updating the UI it needs to happen\n\t\t// on the main thread, like this:\n\n\t\tdispatch_async(dispatch_get_main_queue(), ^{\n\t\t  NSLog(@\"REACHABLE!\");\n\t\t});\n\t};\n\n\treach.unreachableBlock = ^(Reachability*reach)\n\t{\n\t\tNSLog(@\"UNREACHABLE!\");\n\t};\n\n\t// Start the notifier, which will cause the reachability object to retain itself!\n\t[reach startNotifier];\n\n### `NSNotification` Example\n\nThis sample will use `NSNotification`s to notify when the interface has changed. They will be delivered on the **MAIN THREAD**, so you *can* do UI updates from within the function.\n\nIn addition, it asks the `Reachability` object to consider the WWAN (3G/EDGE/CDMA) as a non-reachable connection (you might use this if you are writing a video streaming app, for example, to save the user's data plan).\n\n\t// Allocate a reachability object\n\tReachability* reach = [Reachability reachabilityWithHostname:@\"www.google.com\"];\n\n\t// Tell the reachability that we DON'T want to be reachable on 3G/EDGE/CDMA\n\treach.reachableOnWWAN = NO;\n\n\t// Here we set up a NSNotification observer. The Reachability that caused the notification\n\t// is passed in the object parameter\n\t[[NSNotificationCenter defaultCenter] addObserver:self\n\t\t\t\t\t\t\t\t\t\t\t selector:@selector(reachabilityChanged:)\n\t\t\t\t\t\t\t\t\t\t\t\t name:kReachabilityChangedNotification\n\t\t\t\t\t\t\t\t\t\t\t   object:nil];\n\n\t[reach startNotifier];\n\n## Tell the world\n\nHead over to [Projects using Reachability](https://github.com/tonymillion/Reachability/wiki/Projects-using-Reachability) and add your project for \"Maximum Wins!\".\n"
  },
  {
    "path": "Pods/Reachability/Reachability.h",
    "content": "/*\n Copyright (c) 2011, Tony Million.\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n 1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n \n 2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE. \n */\n\n#import <Foundation/Foundation.h>\n#import <SystemConfiguration/SystemConfiguration.h>\n\n\n/** \n * Create NS_ENUM macro if it does not exist on the targeted version of iOS or OS X.\n *\n * @see http://nshipster.com/ns_enum-ns_options/\n **/\n#ifndef NS_ENUM\n#define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type\n#endif\n\nextern NSString *const kReachabilityChangedNotification;\n\ntypedef NS_ENUM(NSInteger, NetworkStatus) {\n    // Apple NetworkStatus Compatible Names.\n    NotReachable = 0,\n    ReachableViaWiFi = 2,\n    ReachableViaWWAN = 1\n};\n\n@class Reachability;\n\ntypedef void (^NetworkReachable)(Reachability * reachability);\ntypedef void (^NetworkUnreachable)(Reachability * reachability);\n\n\n@interface Reachability : NSObject\n\n@property (nonatomic, copy) NetworkReachable    reachableBlock;\n@property (nonatomic, copy) NetworkUnreachable  unreachableBlock;\n\n@property (nonatomic, assign) BOOL reachableOnWWAN;\n\n\n+(Reachability*)reachabilityWithHostname:(NSString*)hostname;\n// This is identical to the function above, but is here to maintain\n//compatibility with Apples original code. (see .m)\n+(Reachability*)reachabilityWithHostName:(NSString*)hostname;\n+(Reachability*)reachabilityForInternetConnection;\n+(Reachability*)reachabilityWithAddress:(void *)hostAddress;\n+(Reachability*)reachabilityForLocalWiFi;\n\n-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref;\n\n-(BOOL)startNotifier;\n-(void)stopNotifier;\n\n-(BOOL)isReachable;\n-(BOOL)isReachableViaWWAN;\n-(BOOL)isReachableViaWiFi;\n\n// WWAN may be available, but not active until a connection has been established.\n// WiFi may require a connection for VPN on Demand.\n-(BOOL)isConnectionRequired; // Identical DDG variant.\n-(BOOL)connectionRequired; // Apple's routine.\n// Dynamic, on demand connection?\n-(BOOL)isConnectionOnDemand;\n// Is user intervention required?\n-(BOOL)isInterventionRequired;\n\n-(NetworkStatus)currentReachabilityStatus;\n-(SCNetworkReachabilityFlags)reachabilityFlags;\n-(NSString*)currentReachabilityString;\n-(NSString*)currentReachabilityFlags;\n\n@end\n"
  },
  {
    "path": "Pods/Reachability/Reachability.m",
    "content": "/*\n Copyright (c) 2011, Tony Million.\n All rights reserved.\n \n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n \n 1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n \n 2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n \n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n POSSIBILITY OF SUCH DAMAGE. \n */\n\n#import \"Reachability.h\"\n\n#import <sys/socket.h>\n#import <netinet/in.h>\n#import <netinet6/in6.h>\n#import <arpa/inet.h>\n#import <ifaddrs.h>\n#import <netdb.h>\n\n\nNSString *const kReachabilityChangedNotification = @\"kReachabilityChangedNotification\";\n\n\n@interface Reachability ()\n\n@property (nonatomic, assign) SCNetworkReachabilityRef  reachabilityRef;\n@property (nonatomic, strong) dispatch_queue_t          reachabilitySerialQueue;\n@property (nonatomic, strong) id                        reachabilityObject;\n\n-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags;\n-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags;\n\n@end\n\n\nstatic NSString *reachabilityFlags(SCNetworkReachabilityFlags flags) \n{\n    return [NSString stringWithFormat:@\"%c%c %c%c%c%c%c%c%c\",\n#if\tTARGET_OS_IPHONE\n            (flags & kSCNetworkReachabilityFlagsIsWWAN)               ? 'W' : '-',\n#else\n            'X',\n#endif\n            (flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',\n            (flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',\n            (flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',\n            (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',\n            (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)  ? 'C' : '-',\n            (flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-',\n            (flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',\n            (flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-'];\n}\n\n// Start listening for reachability notifications on the current run loop\nstatic void TMReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void* info) \n{\n#pragma unused (target)\n\n    Reachability *reachability = ((__bridge Reachability*)info);\n\n    // We probably don't need an autoreleasepool here, as GCD docs state each queue has its own autorelease pool,\n    // but what the heck eh?\n    @autoreleasepool \n    {\n        [reachability reachabilityChanged:flags];\n    }\n}\n\n\n@implementation Reachability\n\n#pragma mark - Class Constructor Methods\n\n+(Reachability*)reachabilityWithHostName:(NSString*)hostname\n{\n    return [Reachability reachabilityWithHostname:hostname];\n}\n\n+(Reachability*)reachabilityWithHostname:(NSString*)hostname\n{\n    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);\n    if (ref) \n    {\n        id reachability = [[self alloc] initWithReachabilityRef:ref];\n\n        return reachability;\n    }\n    \n    return nil;\n}\n\n+(Reachability *)reachabilityWithAddress:(void *)hostAddress\n{\n    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)hostAddress);\n    if (ref) \n    {\n        id reachability = [[self alloc] initWithReachabilityRef:ref];\n        \n        return reachability;\n    }\n    \n    return nil;\n}\n\n+(Reachability *)reachabilityForInternetConnection \n{   \n    struct sockaddr_in zeroAddress;\n    bzero(&zeroAddress, sizeof(zeroAddress));\n    zeroAddress.sin_len = sizeof(zeroAddress);\n    zeroAddress.sin_family = AF_INET;\n    \n    return [self reachabilityWithAddress:&zeroAddress];\n}\n\n+(Reachability*)reachabilityForLocalWiFi\n{\n    struct sockaddr_in localWifiAddress;\n    bzero(&localWifiAddress, sizeof(localWifiAddress));\n    localWifiAddress.sin_len            = sizeof(localWifiAddress);\n    localWifiAddress.sin_family         = AF_INET;\n    // IN_LINKLOCALNETNUM is defined in <netinet/in.h> as 169.254.0.0\n    localWifiAddress.sin_addr.s_addr    = htonl(IN_LINKLOCALNETNUM);\n    \n    return [self reachabilityWithAddress:&localWifiAddress];\n}\n\n\n// Initialization methods\n\n-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref \n{\n    self = [super init];\n    if (self != nil) \n    {\n        self.reachableOnWWAN = YES;\n        self.reachabilityRef = ref;\n\n        // We need to create a serial queue.\n        // We allocate this once for the lifetime of the notifier.\n\n        self.reachabilitySerialQueue = dispatch_queue_create(\"com.tonymillion.reachability\", NULL);\n    }\n    \n    return self;    \n}\n\n-(void)dealloc\n{\n    [self stopNotifier];\n\n    if(self.reachabilityRef)\n    {\n        CFRelease(self.reachabilityRef);\n        self.reachabilityRef = nil;\n    }\n\n\tself.reachableBlock          = nil;\n\tself.unreachableBlock        = nil;\n    self.reachabilitySerialQueue = nil;\n}\n\n#pragma mark - Notifier Methods\n\n// Notifier \n// NOTE: This uses GCD to trigger the blocks - they *WILL NOT* be called on THE MAIN THREAD\n// - In other words DO NOT DO ANY UI UPDATES IN THE BLOCKS.\n//   INSTEAD USE dispatch_async(dispatch_get_main_queue(), ^{UISTUFF}) (or dispatch_sync if you want)\n\n-(BOOL)startNotifier\n{\n    // allow start notifier to be called multiple times\n    if(self.reachabilityObject && (self.reachabilityObject == self))\n    {\n        return YES;\n    }\n\n\n    SCNetworkReachabilityContext    context = { 0, NULL, NULL, NULL, NULL };\n    context.info = (__bridge void *)self;\n\n    if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context))\n    {\n        // Set it as our reachability queue, which will retain the queue\n        if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))\n        {\n            // this should do a retain on ourself, so as long as we're in notifier mode we shouldn't disappear out from under ourselves\n            // woah\n            self.reachabilityObject = self;\n            return YES;\n        }\n        else\n        {\n#ifdef DEBUG\n            NSLog(@\"SCNetworkReachabilitySetDispatchQueue() failed: %s\", SCErrorString(SCError()));\n#endif\n\n            // UH OH - FAILURE - stop any callbacks!\n            SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);\n        }\n    }\n    else\n    {\n#ifdef DEBUG\n        NSLog(@\"SCNetworkReachabilitySetCallback() failed: %s\", SCErrorString(SCError()));\n#endif\n    }\n\n    // if we get here we fail at the internet\n    self.reachabilityObject = nil;\n    return NO;\n}\n\n-(void)stopNotifier\n{\n    // First stop, any callbacks!\n    SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);\n    \n    // Unregister target from the GCD serial dispatch queue.\n    SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL);\n\n    self.reachabilityObject = nil;\n}\n\n#pragma mark - reachability tests\n\n// This is for the case where you flick the airplane mode;\n// you end up getting something like this:\n//Reachability: WR ct-----\n//Reachability: -- -------\n//Reachability: WR ct-----\n//Reachability: -- -------\n// We treat this as 4 UNREACHABLE triggers - really apple should do better than this\n\n#define testcase (kSCNetworkReachabilityFlagsConnectionRequired | kSCNetworkReachabilityFlagsTransientConnection)\n\n-(BOOL)isReachableWithFlags:(SCNetworkReachabilityFlags)flags\n{\n    BOOL connectionUP = YES;\n    \n    if(!(flags & kSCNetworkReachabilityFlagsReachable))\n        connectionUP = NO;\n    \n    if( (flags & testcase) == testcase )\n        connectionUP = NO;\n    \n#if\tTARGET_OS_IPHONE\n    if(flags & kSCNetworkReachabilityFlagsIsWWAN)\n    {\n        // We're on 3G.\n        if(!self.reachableOnWWAN)\n        {\n            // We don't want to connect when on 3G.\n            connectionUP = NO;\n        }\n    }\n#endif\n    \n    return connectionUP;\n}\n\n-(BOOL)isReachable\n{\n    SCNetworkReachabilityFlags flags;  \n    \n    if(!SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n        return NO;\n    \n    return [self isReachableWithFlags:flags];\n}\n\n-(BOOL)isReachableViaWWAN \n{\n#if\tTARGET_OS_IPHONE\n\n    SCNetworkReachabilityFlags flags = 0;\n    \n    if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n    {\n        // Check we're REACHABLE\n        if(flags & kSCNetworkReachabilityFlagsReachable)\n        {\n            // Now, check we're on WWAN\n            if(flags & kSCNetworkReachabilityFlagsIsWWAN)\n            {\n                return YES;\n            }\n        }\n    }\n#endif\n    \n    return NO;\n}\n\n-(BOOL)isReachableViaWiFi \n{\n    SCNetworkReachabilityFlags flags = 0;\n    \n    if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n    {\n        // Check we're reachable\n        if((flags & kSCNetworkReachabilityFlagsReachable))\n        {\n#if\tTARGET_OS_IPHONE\n            // Check we're NOT on WWAN\n            if((flags & kSCNetworkReachabilityFlagsIsWWAN))\n            {\n                return NO;\n            }\n#endif\n            return YES;\n        }\n    }\n    \n    return NO;\n}\n\n\n// WWAN may be available, but not active until a connection has been established.\n// WiFi may require a connection for VPN on Demand.\n-(BOOL)isConnectionRequired\n{\n    return [self connectionRequired];\n}\n\n-(BOOL)connectionRequired\n{\n    SCNetworkReachabilityFlags flags;\n\t\n\tif(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n    {\n\t\treturn (flags & kSCNetworkReachabilityFlagsConnectionRequired);\n\t}\n    \n    return NO;\n}\n\n// Dynamic, on demand connection?\n-(BOOL)isConnectionOnDemand\n{\n\tSCNetworkReachabilityFlags flags;\n\t\n\tif (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n    {\n\t\treturn ((flags & kSCNetworkReachabilityFlagsConnectionRequired) &&\n\t\t\t\t(flags & (kSCNetworkReachabilityFlagsConnectionOnTraffic | kSCNetworkReachabilityFlagsConnectionOnDemand)));\n\t}\n\t\n\treturn NO;\n}\n\n// Is user intervention required?\n-(BOOL)isInterventionRequired\n{\n    SCNetworkReachabilityFlags flags;\n\t\n\tif (SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))\n    {\n\t\treturn ((flags & kSCNetworkReachabilityFlagsConnectionRequired) &&\n\t\t\t\t(flags & kSCNetworkReachabilityFlagsInterventionRequired));\n\t}\n\t\n\treturn NO;\n}\n\n\n#pragma mark - reachability status stuff\n\n-(NetworkStatus)currentReachabilityStatus\n{\n    if([self isReachable])\n    {\n        if([self isReachableViaWiFi])\n            return ReachableViaWiFi;\n        \n#if\tTARGET_OS_IPHONE\n        return ReachableViaWWAN;\n#endif\n    }\n    \n    return NotReachable;\n}\n\n-(SCNetworkReachabilityFlags)reachabilityFlags\n{\n    SCNetworkReachabilityFlags flags = 0;\n    \n    if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags)) \n    {\n        return flags;\n    }\n    \n    return 0;\n}\n\n-(NSString*)currentReachabilityString\n{\n\tNetworkStatus temp = [self currentReachabilityStatus];\n\t\n\tif(temp == ReachableViaWWAN)\n\t{\n        // Updated for the fact that we have CDMA phones now!\n\t\treturn NSLocalizedString(@\"Cellular\", @\"\");\n\t}\n\tif (temp == ReachableViaWiFi) \n\t{\n\t\treturn NSLocalizedString(@\"WiFi\", @\"\");\n\t}\n\t\n\treturn NSLocalizedString(@\"No Connection\", @\"\");\n}\n\n-(NSString*)currentReachabilityFlags\n{\n    return reachabilityFlags([self reachabilityFlags]);\n}\n\n#pragma mark - Callback function calls this method\n\n-(void)reachabilityChanged:(SCNetworkReachabilityFlags)flags\n{\n    if([self isReachableWithFlags:flags])\n    {\n        if(self.reachableBlock)\n        {\n            self.reachableBlock(self);\n        }\n    }\n    else\n    {\n        if(self.unreachableBlock)\n        {\n            self.unreachableBlock(self);\n        }\n    }\n    \n    // this makes sure the change notification happens on the MAIN THREAD\n    dispatch_async(dispatch_get_main_queue(), ^{\n        [[NSNotificationCenter defaultCenter] postNotificationName:kReachabilityChangedNotification \n                                                            object:self];\n    });\n}\n\n#pragma mark - Debug Description\n\n- (NSString *) description\n{\n    NSString *description = [NSString stringWithFormat:@\"<%@: %#x (%@)>\",\n                             NSStringFromClass([self class]), (unsigned int) self, [self currentReachabilityFlags]];\n    return description;\n}\n\n@end\n"
  },
  {
    "path": "Pods/SAMKeychain/LICENSE",
    "content": "Copyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/SAMKeychain/Readme.markdown",
    "content": "# SAMKeychain\n\n[![Version](https://img.shields.io/github/release/soffes/SAMKeychain.svg)](https://github.com/soffes/SAMKeychain/releases)\n[![CocoaPods](https://img.shields.io/cocoapods/v/SAMKeychain.svg)](https://cocoapods.org/pods/SAMKeychain)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\nSAMKeychain is a simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system Keychain on Mac OS X and iOS.\n\n## Adding to Your Project\n\nSimply add the following to your Podfile if you're using CocoaPods:\n\n``` ruby\npod 'SAMKeychain'\n```\n\nor Cartfile if you're using Carthage:\n\n```\ngithub \"soffes/SAMKeychain\"\n```\n\nTo manually add to your project:\n\n1. Add `Security.framework` to your target\n2. Add `SAMKeychain.h`, `SAMKeychain.m`, `SAMKeychainQuery.h`, and `SAMKeychainQuery.m` to your project.\n\nSAMKeychain requires ARC.\n\nNote: Currently SAMKeychain does not support Mac OS 10.6.\n\n## Working with the Keychain\n\nSAMKeychain has the following class methods for working with the system keychain:\n\n```objective-c\n+ (NSArray *)allAccounts;\n+ (NSArray *)accountsForService:(NSString *)serviceName;\n+ (NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;\n+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;\n+ (void)setAccessibilityType:(CFTypeRef)accessibilityType;\n+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;\n```\n\nEasy as that. (See [SAMKeychain.h](https://github.com/soffes/samkeychain/blob/master/Sources/SAMKeychain.h) and [SAMKeychainQuery.h](https://github.com/soffes/samkeychain/blob/master/Sources/SAMKeychainQuery.h) for all of the methods.)\n\n\n## Documentation\n\n### Use prepared documentation\n\nRead the [online documentation](http://cocoadocs.org/docsets/SAMKeychain).\n\n## Debugging\n\nIf your saving to the keychain fails, use the NSError object to handle it. You can invoke `[error code]` to get the numeric error code. A few values are defined in SAMKeychain.h, and the rest in SecBase.h.\n\n```objective-c\nNSError *error = nil;\nSAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\nquery.service = @\"MyService\";\nquery.account = @\"soffes\";\n[query fetch:&error];\n\nif ([error code] == errSecItemNotFound) {\n    NSLog(@\"Password not found\");\n} else if (error != nil) {\n\tNSLog(@\"Some other error occurred: %@\", [error localizedDescription]);\n}\n```\n\nObviously, you should do something more sophisticated. You can just call `[error localizedDescription]` if all you need is the error message.\n\n## Disclaimer\n\nWorking with the keychain is pretty sucky. You should really check for errors and failures. This library doesn't make it any more stable, it just wraps up all of the annoying C APIs.\n\nYou also really should not use the default but set the `accessibilityType`.\n`kSecAttrAccessibleWhenUnlocked` should work for most applications. See\n[Apple Documentation](https://developer.apple.com/library/ios/DOCUMENTATION/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/constant_group/Keychain_Item_Accessibility_Constants)\nfor other options.\n\n## Thanks\n\nThis was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors. SAMKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](https://github.com/soffes/sstoolkit).\n\nA huge thanks to [Caleb Davenport](https://github.com/calebd) for leading the way on version 1.0 of SAMKeychain.\n"
  },
  {
    "path": "Pods/SAMKeychain/Sources/SAMKeychain.h",
    "content": "//\n//  SAMKeychain.h\n//  SAMKeychain\n//\n//  Created by Sam Soffes on 5/19/10.\n//  Copyright (c) 2010-2014 Sam Soffes. All rights reserved.\n//\n\n#if __has_feature(modules)\n\t@import Foundation;\n#else\n\t#import <Foundation/Foundation.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Error code specific to SAMKeychain that can be returned in NSError objects.\n For codes returned by the operating system, refer to SecBase.h for your\n platform.\n */\ntypedef NS_ENUM(OSStatus, SAMKeychainErrorCode) {\n\t/** Some of the arguments were invalid. */\n\tSAMKeychainErrorBadArguments = -1001,\n};\n\n/** SAMKeychain error domain */\nextern NSString *const kSAMKeychainErrorDomain;\n\n/** Account name. */\nextern NSString *const kSAMKeychainAccountKey;\n\n/**\n Time the item was created.\n\n The value will be a string.\n */\nextern NSString *const kSAMKeychainCreatedAtKey;\n\n/** Item class. */\nextern NSString *const kSAMKeychainClassKey;\n\n/** Item description. */\nextern NSString *const kSAMKeychainDescriptionKey;\n\n/** Item label. */\nextern NSString *const kSAMKeychainLabelKey;\n\n/** Time the item was last modified.\n\n The value will be a string.\n */\nextern NSString *const kSAMKeychainLastModifiedKey;\n\n/** Where the item was created. */\nextern NSString *const kSAMKeychainWhereKey;\n\n/**\n Simple wrapper for accessing accounts, getting passwords, setting passwords, and deleting passwords using the system\n Keychain on Mac OS X and iOS.\n\n This was originally inspired by EMKeychain and SDKeychain (both of which are now gone). Thanks to the authors.\n SAMKeychain has since switched to a simpler implementation that was abstracted from [SSToolkit](http://sstoolk.it).\n */\n@interface SAMKeychain : NSObject\n\n#pragma mark - Classic methods\n\n/**\n Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't have a\n password for the given parameters.\n\n @param serviceName The service for which to return the corresponding password.\n\n @param account The account for which to return the corresponding password.\n\n @return Returns a string containing the password for a given account and service, or `nil` if the Keychain doesn't\n have a password for the given parameters.\n */\n+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account;\n+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none)));\n\n/**\n Returns a nsdata containing the password for a given account and service, or `nil` if the Keychain doesn't have a\n password for the given parameters.\n\n @param serviceName The service for which to return the corresponding password.\n\n @param account The account for which to return the corresponding password.\n\n @return Returns a nsdata containing the password for a given account and service, or `nil` if the Keychain doesn't\n have a password for the given parameters.\n */\n+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account;\n+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none)));\n\n\n/**\n Deletes a password from the Keychain.\n\n @param serviceName The service for which to delete the corresponding password.\n\n @param account The account for which to delete the corresponding password.\n\n @return Returns `YES` on success, or `NO` on failure.\n */\n+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account;\n+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none)));\n\n\n/**\n Sets a password in the Keychain.\n\n @param password The password to store in the Keychain.\n\n @param serviceName The service for which to set the corresponding password.\n\n @param account The account for which to set the corresponding password.\n\n @return Returns `YES` on success, or `NO` on failure.\n */\n+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account;\n+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none)));\n\n/**\n Sets a password in the Keychain.\n\n @param password The password to store in the Keychain.\n\n @param serviceName The service for which to set the corresponding password.\n\n @param account The account for which to set the corresponding password.\n\n @return Returns `YES` on success, or `NO` on failure.\n */\n+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account;\n+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error __attribute__((swift_error(none)));\n\n/**\n Returns an array containing the Keychain's accounts, or `nil` if the Keychain has no accounts.\n\n See the `NSString` constants declared in SAMKeychain.h for a list of keys that can be used when accessing the\n dictionaries returned by this method.\n\n @return An array of dictionaries containing the Keychain's accounts, or `nil` if the Keychain doesn't have any\n accounts. The order of the objects in the array isn't defined.\n */\n+ (nullable NSArray<NSDictionary<NSString *, id> *> *)allAccounts;\n+ (nullable NSArray<NSDictionary<NSString *, id> *> *)allAccounts:(NSError *__autoreleasing *)error __attribute__((swift_error(none)));\n\n\n/**\n Returns an array containing the Keychain's accounts for a given service, or `nil` if the Keychain doesn't have any\n accounts for the given service.\n\n See the `NSString` constants declared in SAMKeychain.h for a list of keys that can be used when accessing the\n dictionaries returned by this method.\n\n @param serviceName The service for which to return the corresponding accounts.\n\n @return An array of dictionaries containing the Keychain's accounts for a given `serviceName`, or `nil` if the Keychain\n doesn't have any accounts for the given `serviceName`. The order of the objects in the array isn't defined.\n */\n+ (nullable NSArray<NSDictionary<NSString *, id> *> *)accountsForService:(nullable NSString *)serviceName;\n+ (nullable NSArray<NSDictionary<NSString *, id> *> *)accountsForService:(nullable NSString *)serviceName error:(NSError *__autoreleasing *)error __attribute__((swift_error(none)));\n\n\n#pragma mark - Configuration\n\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n/**\n Returns the accessibility type for all future passwords saved to the Keychain.\n\n @return Returns the accessibility type.\n\n The return value will be `NULL` or one of the \"Keychain Item Accessibility\n Constants\" used for determining when a keychain item should be readable.\n\n @see setAccessibilityType\n */\n+ (CFTypeRef)accessibilityType;\n\n/**\n Sets the accessibility type for all future passwords saved to the Keychain.\n\n @param accessibilityType One of the \"Keychain Item Accessibility Constants\"\n used for determining when a keychain item should be readable.\n\n If the value is `NULL` (the default), the Keychain default will be used which\n is highly insecure. You really should use at least `kSecAttrAccessibleAfterFirstUnlock`\n for background applications or `kSecAttrAccessibleWhenUnlocked` for all\n other applications.\n\n @see accessibilityType\n */\n+ (void)setAccessibilityType:(CFTypeRef)accessibilityType;\n#endif\n\n@end\n\nNS_ASSUME_NONNULL_END\n\n#import <SAMKeychain/SAMKeychainQuery.h>\n"
  },
  {
    "path": "Pods/SAMKeychain/Sources/SAMKeychain.m",
    "content": "//\n//  SAMKeychain.m\n//  SAMKeychain\n//\n//  Created by Sam Soffes on 5/19/10.\n//  Copyright (c) 2010-2014 Sam Soffes. All rights reserved.\n//\n\n#import \"SAMKeychain.h\"\n#import \"SAMKeychainQuery.h\"\n\nNSString *const kSAMKeychainErrorDomain = @\"com.samsoffes.samkeychain\";\nNSString *const kSAMKeychainAccountKey = @\"acct\";\nNSString *const kSAMKeychainCreatedAtKey = @\"cdat\";\nNSString *const kSAMKeychainClassKey = @\"labl\";\nNSString *const kSAMKeychainDescriptionKey = @\"desc\";\nNSString *const kSAMKeychainLabelKey = @\"labl\";\nNSString *const kSAMKeychainLastModifiedKey = @\"mdat\";\nNSString *const kSAMKeychainWhereKey = @\"svce\";\n\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n\tstatic CFTypeRef SAMKeychainAccessibilityType = NULL;\n#endif\n\n@implementation SAMKeychain\n\n+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account {\n\treturn [self passwordForService:serviceName account:account error:nil];\n}\n\n\n+ (nullable NSString *)passwordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error {\n\tSAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n\tquery.service = serviceName;\n\tquery.account = account;\n\t[query fetch:error];\n\treturn query.password;\n}\n\n+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account {\n\treturn [self passwordDataForService:serviceName account:account error:nil];\n}\n\n+ (nullable NSData *)passwordDataForService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error {\n    SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n    query.service = serviceName;\n    query.account = account;\n    [query fetch:error];\n\n    return query.passwordData;\n}\n\n\n+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account {\n\treturn [self deletePasswordForService:serviceName account:account error:nil];\n}\n\n\n+ (BOOL)deletePasswordForService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error {\n\tSAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n\tquery.service = serviceName;\n\tquery.account = account;\n\treturn [query deleteItem:error];\n}\n\n\n+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account {\n\treturn [self setPassword:password forService:serviceName account:account error:nil];\n}\n\n\n+ (BOOL)setPassword:(NSString *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError *__autoreleasing *)error {\n\tSAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n\tquery.service = serviceName;\n\tquery.account = account;\n\tquery.password = password;\n\treturn [query save:error];\n}\n\n+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account {\n\treturn [self setPasswordData:password forService:serviceName account:account error:nil];\n}\n\n\n+ (BOOL)setPasswordData:(NSData *)password forService:(NSString *)serviceName account:(NSString *)account error:(NSError **)error {\n    SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n    query.service = serviceName;\n    query.account = account;\n    query.passwordData = password;\n    return [query save:error];\n}\n\n+ (nullable NSArray *)allAccounts {\n\treturn [self allAccounts:nil];\n}\n\n\n+ (nullable NSArray *)allAccounts:(NSError *__autoreleasing *)error {\n    return [self accountsForService:nil error:error];\n}\n\n\n+ (nullable NSArray *)accountsForService:(nullable NSString *)serviceName {\n\treturn [self accountsForService:serviceName error:nil];\n}\n\n\n+ (nullable NSArray *)accountsForService:(nullable NSString *)serviceName error:(NSError *__autoreleasing *)error {\n    SAMKeychainQuery *query = [[SAMKeychainQuery alloc] init];\n    query.service = serviceName;\n    return [query fetchAll:error];\n}\n\n\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n+ (CFTypeRef)accessibilityType {\n\treturn SAMKeychainAccessibilityType;\n}\n\n\n+ (void)setAccessibilityType:(CFTypeRef)accessibilityType {\n\tCFRetain(accessibilityType);\n\tif (SAMKeychainAccessibilityType) {\n\t\tCFRelease(SAMKeychainAccessibilityType);\n\t}\n\tSAMKeychainAccessibilityType = accessibilityType;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Pods/SAMKeychain/Sources/SAMKeychainQuery.h",
    "content": "//\n//  SAMKeychainQuery.h\n//  SAMKeychain\n//\n//  Created by Caleb Davenport on 3/19/13.\n//  Copyright (c) 2013-2014 Sam Soffes. All rights reserved.\n//\n\n#if __has_feature(modules)\n\t@import Foundation;\n\t@import Security;\n#else\n\t#import <Foundation/Foundation.h>\n\t#import <Security/Security.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n#if __IPHONE_7_0 || __MAC_10_9\n\t// Keychain synchronization available at compile time\n\t#define SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE 1\n#endif\n\n#if __IPHONE_3_0 || __MAC_10_9\n\t// Keychain access group available at compile time\n\t#define SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE 1\n#endif\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\ntypedef NS_ENUM(NSUInteger, SAMKeychainQuerySynchronizationMode) {\n\tSAMKeychainQuerySynchronizationModeAny,\n\tSAMKeychainQuerySynchronizationModeNo,\n\tSAMKeychainQuerySynchronizationModeYes\n};\n#endif\n\n/**\n Simple interface for querying or modifying keychain items.\n */\n@interface SAMKeychainQuery : NSObject\n\n/** kSecAttrAccount */\n@property (nonatomic, copy, nullable) NSString *account;\n\n/** kSecAttrService */\n@property (nonatomic, copy, nullable) NSString *service;\n\n/** kSecAttrLabel */\n@property (nonatomic, copy, nullable) NSString *label;\n\n#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE\n/** kSecAttrAccessGroup (only used on iOS) */\n@property (nonatomic, copy, nullable) NSString *accessGroup;\n#endif\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\n/** kSecAttrSynchronizable */\n@property (nonatomic) SAMKeychainQuerySynchronizationMode synchronizationMode;\n#endif\n\n/** Root storage for password information */\n@property (nonatomic, copy, nullable) NSData *passwordData;\n\n/**\n This property automatically transitions between an object and the value of\n `passwordData` using NSKeyedArchiver and NSKeyedUnarchiver.\n */\n@property (nonatomic, copy, nullable) id<NSCoding> passwordObject;\n\n/**\n Convenience accessor for setting and getting a password string. Passes through\n to `passwordData` using UTF-8 string encoding.\n */\n@property (nonatomic, copy, nullable) NSString *password;\n\n\n///------------------------\n/// @name Saving & Deleting\n///------------------------\n\n/**\n Save the receiver's attributes as a keychain item. Existing items with the\n given account, service, and access group will first be deleted.\n\n @param error Populated should an error occur.\n\n @return `YES` if saving was successful, `NO` otherwise.\n */\n- (BOOL)save:(NSError **)error;\n\n/**\n Delete keychain items that match the given account, service, and access group.\n\n @param error Populated should an error occur.\n\n @return `YES` if saving was successful, `NO` otherwise.\n */\n- (BOOL)deleteItem:(NSError **)error;\n\n\n///---------------\n/// @name Fetching\n///---------------\n\n/**\n Fetch all keychain items that match the given account, service, and access\n group. The values of `password` and `passwordData` are ignored when fetching.\n\n @param error Populated should an error occur.\n\n @return An array of dictionaries that represent all matching keychain items or\n `nil` should an error occur.\n The order of the items is not determined.\n */\n- (nullable NSArray<NSDictionary<NSString *, id> *> *)fetchAll:(NSError **)error;\n\n/**\n Fetch the keychain item that matches the given account, service, and access\n group. The `password` and `passwordData` properties will be populated unless\n an error occurs. The values of `password` and `passwordData` are ignored when\n fetching.\n\n @param error Populated should an error occur.\n\n @return `YES` if fetching was successful, `NO` otherwise.\n */\n- (BOOL)fetch:(NSError **)error;\n\n\n///-----------------------------\n/// @name Synchronization Status\n///-----------------------------\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\n/**\n Returns a boolean indicating if keychain synchronization is available on the device at runtime. The #define \n SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE is only for compile time. If you are checking for the presence of synchronization,\n you should use this method.\n \n @return A value indicating if keychain synchronization is available\n */\n+ (BOOL)isSynchronizationAvailable;\n#endif\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/SAMKeychain/Sources/SAMKeychainQuery.m",
    "content": "//\n//  SAMKeychainQuery.m\n//  SAMKeychain\n//\n//  Created by Caleb Davenport on 3/19/13.\n//  Copyright (c) 2013-2014 Sam Soffes. All rights reserved.\n//\n\n#import \"SAMKeychainQuery.h\"\n#import \"SAMKeychain.h\"\n\n@implementation SAMKeychainQuery\n\n@synthesize account = _account;\n@synthesize service = _service;\n@synthesize label = _label;\n@synthesize passwordData = _passwordData;\n\n#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE\n@synthesize accessGroup = _accessGroup;\n#endif\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\n@synthesize synchronizationMode = _synchronizationMode;\n#endif\n\n#pragma mark - Public\n\n- (BOOL)save:(NSError *__autoreleasing *)error {\n\tOSStatus status = SAMKeychainErrorBadArguments;\n\tif (!self.service || !self.account || !self.passwordData) {\n\t\tif (error) {\n\t\t\t*error = [[self class] errorWithCode:status];\n\t\t}\n\t\treturn NO;\n\t}\n\tNSMutableDictionary *query = nil;\n\tNSMutableDictionary * searchQuery = [self query];\n\tstatus = SecItemCopyMatching((__bridge CFDictionaryRef)searchQuery, nil);\n\tif (status == errSecSuccess) {//item already exists, update it!\n\t\tquery = [[NSMutableDictionary alloc]init];\n\t\t[query setObject:self.passwordData forKey:(__bridge id)kSecValueData];\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n\t\tCFTypeRef accessibilityType = [SAMKeychain accessibilityType];\n\t\tif (accessibilityType) {\n\t\t\t[query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible];\n\t\t}\n#endif\n\t\tstatus = SecItemUpdate((__bridge CFDictionaryRef)(searchQuery), (__bridge CFDictionaryRef)(query));\n\t}else if(status == errSecItemNotFound){//item not found, create it!\n\t\tquery = [self query];\n\t\tif (self.label) {\n\t\t\t[query setObject:self.label forKey:(__bridge id)kSecAttrLabel];\n\t\t}\n\t\t[query setObject:self.passwordData forKey:(__bridge id)kSecValueData];\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n\t\tCFTypeRef accessibilityType = [SAMKeychain accessibilityType];\n\t\tif (accessibilityType) {\n\t\t\t[query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible];\n\t\t}\n#endif\n\t\tstatus = SecItemAdd((__bridge CFDictionaryRef)query, NULL);\n\t}\n\tif (status != errSecSuccess && error != NULL) {\n\t\t*error = [[self class] errorWithCode:status];\n\t}\n\treturn (status == errSecSuccess);}\n\n\n- (BOOL)deleteItem:(NSError *__autoreleasing *)error {\n\tOSStatus status = SAMKeychainErrorBadArguments;\n\tif (!self.service || !self.account) {\n\t\tif (error) {\n\t\t\t*error = [[self class] errorWithCode:status];\n\t\t}\n\t\treturn NO;\n\t}\n\n\tNSMutableDictionary *query = [self query];\n#if TARGET_OS_IPHONE\n\tstatus = SecItemDelete((__bridge CFDictionaryRef)query);\n#else\n\t// On Mac OS, SecItemDelete will not delete a key created in a different\n\t// app, nor in a different version of the same app.\n\t//\n\t// To replicate the issue, save a password, change to the code and\n\t// rebuild the app, and then attempt to delete that password.\n\t//\n\t// This was true in OS X 10.6 and probably later versions as well.\n\t//\n\t// Work around it by using SecItemCopyMatching and SecKeychainItemDelete.\n\tCFTypeRef result = NULL;\n\t[query setObject:@YES forKey:(__bridge id)kSecReturnRef];\n\tstatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);\n\tif (status == errSecSuccess) {\n\t\tstatus = SecKeychainItemDelete((SecKeychainItemRef)result);\n\t\tCFRelease(result);\n\t}\n#endif\n\n\tif (status != errSecSuccess && error != NULL) {\n\t\t*error = [[self class] errorWithCode:status];\n\t}\n\n\treturn (status == errSecSuccess);\n}\n\n\n- (nullable NSArray *)fetchAll:(NSError *__autoreleasing *)error {\n\tNSMutableDictionary *query = [self query];\n\t[query setObject:@YES forKey:(__bridge id)kSecReturnAttributes];\n\t[query setObject:(__bridge id)kSecMatchLimitAll forKey:(__bridge id)kSecMatchLimit];\n#if __IPHONE_4_0 && TARGET_OS_IPHONE\n\tCFTypeRef accessibilityType = [SAMKeychain accessibilityType];\n\tif (accessibilityType) {\n\t\t[query setObject:(__bridge id)accessibilityType forKey:(__bridge id)kSecAttrAccessible];\n\t}\n#endif\n\n\tCFTypeRef result = NULL;\n\tOSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);\n\tif (status != errSecSuccess && error != NULL) {\n\t\t*error = [[self class] errorWithCode:status];\n\t\treturn nil;\n\t}\n\n\treturn (__bridge_transfer NSArray *)result;\n}\n\n\n- (BOOL)fetch:(NSError *__autoreleasing *)error {\n\tOSStatus status = SAMKeychainErrorBadArguments;\n\tif (!self.service || !self.account) {\n\t\tif (error) {\n\t\t\t*error = [[self class] errorWithCode:status];\n\t\t}\n\t\treturn NO;\n\t}\n\n\tCFTypeRef result = NULL;\n\tNSMutableDictionary *query = [self query];\n\t[query setObject:@YES forKey:(__bridge id)kSecReturnData];\n\t[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit];\n\tstatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, &result);\n\n\tif (status != errSecSuccess) {\n\t\tif (error) {\n\t\t\t*error = [[self class] errorWithCode:status];\n\t\t}\n\t\treturn NO;\n\t}\n\n\tself.passwordData = (__bridge_transfer NSData *)result;\n\treturn YES;\n}\n\n\n#pragma mark - Accessors\n\n- (void)setPasswordObject:(id<NSCoding>)object {\n\tself.passwordData = [NSKeyedArchiver archivedDataWithRootObject:object];\n}\n\n\n- (id<NSCoding>)passwordObject {\n\tif ([self.passwordData length]) {\n\t\treturn [NSKeyedUnarchiver unarchiveObjectWithData:self.passwordData];\n\t}\n\treturn nil;\n}\n\n\n- (void)setPassword:(NSString *)password {\n\tself.passwordData = [password dataUsingEncoding:NSUTF8StringEncoding];\n}\n\n\n- (NSString *)password {\n\tif ([self.passwordData length]) {\n\t\treturn [[NSString alloc] initWithData:self.passwordData encoding:NSUTF8StringEncoding];\n\t}\n\treturn nil;\n}\n\n\n#pragma mark - Synchronization Status\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\n+ (BOOL)isSynchronizationAvailable {\n#if TARGET_OS_IPHONE\n\t// Apple suggested way to check for 7.0 at runtime\n\t// https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/SupportingEarlieriOS.html\n\treturn floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;\n#else\n\treturn floor(NSFoundationVersionNumber) > NSFoundationVersionNumber10_8_4;\n#endif\n}\n#endif\n\n\n#pragma mark - Private\n\n- (NSMutableDictionary *)query {\n\tNSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:3];\n\t[dictionary setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass];\n\n\tif (self.service) {\n\t\t[dictionary setObject:self.service forKey:(__bridge id)kSecAttrService];\n\t}\n\n\tif (self.account) {\n\t\t[dictionary setObject:self.account forKey:(__bridge id)kSecAttrAccount];\n\t}\n\n#ifdef SAMKEYCHAIN_ACCESS_GROUP_AVAILABLE\n#if !TARGET_IPHONE_SIMULATOR\n\tif (self.accessGroup) {\n\t\t[dictionary setObject:self.accessGroup forKey:(__bridge id)kSecAttrAccessGroup];\n\t}\n#endif\n#endif\n\n#ifdef SAMKEYCHAIN_SYNCHRONIZATION_AVAILABLE\n\tif ([[self class] isSynchronizationAvailable]) {\n\t\tid value;\n\n\t\tswitch (self.synchronizationMode) {\n\t\t\tcase SAMKeychainQuerySynchronizationModeNo: {\n\t\t\t  value = @NO;\n\t\t\t  break;\n\t\t\t}\n\t\t\tcase SAMKeychainQuerySynchronizationModeYes: {\n\t\t\t  value = @YES;\n\t\t\t  break;\n\t\t\t}\n\t\t\tcase SAMKeychainQuerySynchronizationModeAny: {\n\t\t\t  value = (__bridge id)(kSecAttrSynchronizableAny);\n\t\t\t  break;\n\t\t\t}\n\t\t}\n\n\t\t[dictionary setObject:value forKey:(__bridge id)(kSecAttrSynchronizable)];\n\t}\n#endif\n\n\treturn dictionary;\n}\n\n\n+ (NSError *)errorWithCode:(OSStatus) code {\n\tstatic dispatch_once_t onceToken;\n\tstatic NSBundle *resourcesBundle = nil;\n\tdispatch_once(&onceToken, ^{\n\t\tNSURL *url = [[NSBundle bundleForClass:[SAMKeychainQuery class]] URLForResource:@\"SAMKeychain\" withExtension:@\"bundle\"];\n\t\tresourcesBundle = [NSBundle bundleWithURL:url];\n\t});\n\t\n\tNSString *message = nil;\n\tswitch (code) {\n\t\tcase errSecSuccess: return nil;\n\t\tcase SAMKeychainErrorBadArguments: message = NSLocalizedStringFromTableInBundle(@\"SAMKeychainErrorBadArguments\", @\"SAMKeychain\", resourcesBundle, nil); break;\n\n#if TARGET_OS_IPHONE\n\t\tcase errSecUnimplemented: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecUnimplemented\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecParam: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecParam\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecAllocate: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecAllocate\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecNotAvailable: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecNotAvailable\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecDuplicateItem: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecDuplicateItem\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecItemNotFound: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecItemNotFound\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecInteractionNotAllowed: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecInteractionNotAllowed\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecDecode: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecDecode\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tcase errSecAuthFailed: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecAuthFailed\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tmessage = NSLocalizedStringFromTableInBundle(@\"errSecDefault\", @\"SAMKeychain\", resourcesBundle, nil);\n\t\t}\n#else\n\t\tdefault:\n\t\t\tmessage = (__bridge_transfer NSString *)SecCopyErrorMessageString(code, NULL);\n#endif\n\t}\n\n\tNSDictionary *userInfo = nil;\n\tif (message) {\n\t\tuserInfo = @{ NSLocalizedDescriptionKey : message };\n\t}\n\treturn [NSError errorWithDomain:kSAMKeychainErrorDomain code:code userInfo:userInfo];\n}\n\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/AutoCoding/AutoCoding-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_AutoCoding : NSObject\n@end\n@implementation PodsDummy_AutoCoding\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/AutoCoding/AutoCoding-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/AutoCoding/AutoCoding.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/AutoCoding\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/AutoCoding\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/AutoCoding\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/DTBonjour/DTBonjour-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_DTBonjour : NSObject\n@end\n@implementation PodsDummy_DTBonjour\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/DTBonjour/DTBonjour-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/DTBonjour/DTBonjour.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/DTBonjour\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/DTBonjour\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"CoreFoundation\" -framework \"Foundation\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../Modified Pods/DTBonjour\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_DZNEmptyDataSet : NSObject\n@end\n@implementation PodsDummy_DZNEmptyDataSet\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/DZNEmptyDataSet/DZNEmptyDataSet.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/DZNEmptyDataSet\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/GZIP/GZIP-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_GZIP : NSObject\n@end\n@implementation PodsDummy_GZIP\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/GZIP/GZIP-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/GZIP/GZIP.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/GZIP\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/GZIP\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -l\"z\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/GZIP\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/HockeySDK/ResourceBundle-HockeySDKResources-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>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</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>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>5.1.2</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/JGMethodSwizzler/JGMethodSwizzler-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_JGMethodSwizzler : NSObject\n@end\n@implementation PodsDummy_JGMethodSwizzler\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/JGMethodSwizzler/JGMethodSwizzler-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/JGMethodSwizzler/JGMethodSwizzler.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JGMethodSwizzler\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"Foundation\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/JGMethodSwizzler\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/KissXML/KissXML-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_KissXML : NSObject\n@end\n@implementation PodsDummy_KissXML\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/KissXML/KissXML-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/KissXML/KissXML.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KissXML\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/KissXML\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\" $(SDKROOT)/usr/include/libxml2\nOTHER_LDFLAGS = -l\"xml2\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../Modified Pods/KissXML-5.1.2\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/MRProgress/MRProgress-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_MRProgress : NSObject\n@end\n@implementation PodsDummy_MRProgress\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/MRProgress/MRProgress-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/MRProgress/MRProgress.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MRProgress\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/MRProgress\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"Accelerate\" -framework \"CoreGraphics\" -framework \"QuartzCore\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/../Modified Pods/MRProgress\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/NSTimer-Blocks/NSTimer-Blocks-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_NSTimer_Blocks : NSObject\n@end\n@implementation PodsDummy_NSTimer_Blocks\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/NSTimer-Blocks/NSTimer-Blocks-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/NSTimer-Blocks/NSTimer-Blocks.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/NSTimer-Blocks\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/NSTimer-Blocks\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## AutoCoding\n\nAutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.\n\n## DTBonjour\n\nCopyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## DZNEmptyDataSet\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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## GZIP\n\nGZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution.\n\n## KissXML\n\nCopyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n## MRProgress\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## NSTimer-Blocks\n\nREADME\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n## Reachability\n\nCopyright (c) 2011, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## SAMKeychain\n\nCopyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## UIActionSheet+Blocks\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## UIAlertView+Blocks\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash-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>AutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>AutoCoding</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>Copyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DTBonjour</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>The MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DZNEmptyDataSet</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>GZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>GZIP</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>Copyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>KissXML</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>The MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT License</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>MRProgress</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>README\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>Copyright (C) 2011 by Random Ideas, LLC</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>NSTimer-Blocks</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>Copyright (c) 2011, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Reachability</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>Copyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SAMKeychain</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIActionSheet+Blocks</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIAlertView+Blocks</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 - https://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": "Pods/Target Support Files/Pods-Dash/Pods-Dash-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_Dash : NSObject\n@end\n@implementation PodsDummy_Pods_Dash\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${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  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_resource \"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_resource \"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\"\nfi\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\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`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash.debug.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(SDKROOT)/usr/include/libxml2 $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/AutoCoding\" \"${PODS_CONFIGURATION_BUILD_DIR}/DTBonjour\" \"${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet\" \"${PODS_CONFIGURATION_BUILD_DIR}/GZIP\" \"${PODS_CONFIGURATION_BUILD_DIR}/JGMethodSwizzler\" \"${PODS_CONFIGURATION_BUILD_DIR}/KissXML\" \"${PODS_CONFIGURATION_BUILD_DIR}/MRProgress\" \"${PODS_CONFIGURATION_BUILD_DIR}/NSTimer-Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/Reachability\" \"${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIActionSheet+Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIAlertView+Blocks\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/AutoCoding\" -isystem \"${PODS_ROOT}/Headers/Public/DTBonjour\" -isystem \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" -isystem \"${PODS_ROOT}/Headers/Public/GZIP\" -isystem \"${PODS_ROOT}/Headers/Public/HockeySDK\" -isystem \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" -isystem \"${PODS_ROOT}/Headers/Public/KissXML\" -isystem \"${PODS_ROOT}/Headers/Public/MRProgress\" -isystem \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/Reachability\" -isystem \"${PODS_ROOT}/Headers/Public/SAMKeychain\" -isystem \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"AutoCoding\" -l\"DTBonjour\" -l\"DZNEmptyDataSet\" -l\"GZIP\" -l\"JGMethodSwizzler\" -l\"KissXML\" -l\"MRProgress\" -l\"NSTimer-Blocks\" -l\"Reachability\" -l\"SAMKeychain\" -l\"UIActionSheet+Blocks\" -l\"UIAlertView+Blocks\" -l\"xml2\" -l\"z\" -framework \"Accelerate\" -framework \"CoreFoundation\" -framework \"CoreGraphics\" -framework \"Foundation\" -framework \"QuartzCore\" -framework \"Security\" -framework \"SystemConfiguration\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/..\nPODS_ROOT = ${SRCROOT}/../Pods\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash/Pods-Dash.release.xcconfig",
    "content": "GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(SDKROOT)/usr/include/libxml2 $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/AutoCoding\" \"${PODS_CONFIGURATION_BUILD_DIR}/DTBonjour\" \"${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet\" \"${PODS_CONFIGURATION_BUILD_DIR}/GZIP\" \"${PODS_CONFIGURATION_BUILD_DIR}/JGMethodSwizzler\" \"${PODS_CONFIGURATION_BUILD_DIR}/KissXML\" \"${PODS_CONFIGURATION_BUILD_DIR}/MRProgress\" \"${PODS_CONFIGURATION_BUILD_DIR}/NSTimer-Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/Reachability\" \"${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIActionSheet+Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIAlertView+Blocks\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/AutoCoding\" -isystem \"${PODS_ROOT}/Headers/Public/DTBonjour\" -isystem \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" -isystem \"${PODS_ROOT}/Headers/Public/GZIP\" -isystem \"${PODS_ROOT}/Headers/Public/HockeySDK\" -isystem \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" -isystem \"${PODS_ROOT}/Headers/Public/KissXML\" -isystem \"${PODS_ROOT}/Headers/Public/MRProgress\" -isystem \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/Reachability\" -isystem \"${PODS_ROOT}/Headers/Public/SAMKeychain\" -isystem \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"AutoCoding\" -l\"DTBonjour\" -l\"DZNEmptyDataSet\" -l\"GZIP\" -l\"JGMethodSwizzler\" -l\"KissXML\" -l\"MRProgress\" -l\"NSTimer-Blocks\" -l\"Reachability\" -l\"SAMKeychain\" -l\"UIActionSheet+Blocks\" -l\"UIAlertView+Blocks\" -l\"xml2\" -l\"z\" -framework \"Accelerate\" -framework \"CoreFoundation\" -framework \"CoreGraphics\" -framework \"Foundation\" -framework \"QuartzCore\" -framework \"Security\" -framework \"SystemConfiguration\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/..\nPODS_ROOT = ${SRCROOT}/../Pods\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## AutoCoding\n\nAutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.\n\n## DTBonjour\n\nCopyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## DZNEmptyDataSet\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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## GZIP\n\nGZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution.\n\n## KissXML\n\nCopyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n## MRProgress\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## NSTimer-Blocks\n\nREADME\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n## Reachability\n\nCopyright (c) 2011, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\n## SAMKeychain\n\nCopyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## UIActionSheet+Blocks\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## UIAlertView+Blocks\n\nThe MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## HockeySDK\n\n## Licenses\n\nThe Hockey SDK is provided under the following license:\n\n    The MIT License\n    Copyright (c) Microsoft Corporation.\n    All rights reserved.\n\t\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\t\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as noted below, PLCrashReporter \nis provided under the following license:\n\n    Copyright (c) 2008 - 2015 Plausible Labs Cooperative, Inc.\n    Copyright (c) 2012 - 2015 HockeyApp, Bit Stadium GmbH.\n    All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nThe protobuf-c library, as well as the PLCrashLogWriterEncoding.c\nfile are licensed as follows:\n\n    Copyright 2008, Dave Benson.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with\n    the License. You may obtain a copy of the License\n    at http://www.apache.org/licenses/LICENSE-2.0 Unless\n    required by applicable law or agreed to in writing,\n    software distributed under the License is distributed on\n    an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    KIND, either express or implied. See the License for the\n    specific language governing permissions and limitations\n    under the License.\n\nTTTAttributedLabel is licensed as follows:\n\n    Copyright (c) 2011 Mattt Thompson (http://mattt.me/)\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nSFHFKeychainUtils is licensed as follows:\n\n    Created by Buzz Andersen on 10/20/08.\n    Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone.\n    Copyright 2008 Sci-Fi Hi-Fi. All rights reserved.\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nGZIP is licensed as follow:\n    \n    Created by Nick Lockwood on 03/06/2012.\n    Copyright (C) 2012 Charcoal Design\n    \n    Distributed under the permissive zlib License\n    Get the latest version from here:\n    \n    https://github.com/nicklockwood/GZIP\n    \n    This software is provided 'as-is', without any express or implied\n    warranty.  In no event will the authors be held liable for any damages\n    arising from the use of this software.\n    \n    Permission is granted to anyone to use this software for any purpose,\n    including commercial applications, and to alter it and redistribute it\n    freely, subject to the following restrictions:\n    \n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n    \n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n    \n    3. This notice may not be removed or altered from any source distribution.\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-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>AutoCoding\n\nCopyright (C) 2011 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n\n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n\n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>AutoCoding</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>Copyright (c) 2011, Oliver Drobnik All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer. \n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DTBonjour</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>The MIT License (MIT)\n\nCopyright (c) 2015 Ignacio Romero Zurbuchen iromero@dzen.cl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>DZNEmptyDataSet</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>GZIP\n\nCopyright (C) 2012 Charcoal Design\n\nThis software is provided 'as-is', without any express or implied\nwarranty.  In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n1. The origin of this software must not be misrepresented; you must not\n   claim that you wrote the original software. If you use this software\n   in a product, an acknowledgment in the product documentation would be\n   appreciated but is not required.\n   \n2. Altered source versions must be plainly marked as such, and must not be\n   misrepresented as being the original software.\n   \n3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>zlib</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>GZIP</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>Copyright (c) 2012, Robbie Hanson\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>KissXML</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>The MIT License (MIT)\n\nCopyright (c) 2013 Marius Rackwitz\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT License</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>MRProgress</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>README\n======\n\nExtremely simple category on NSTimer which makes it able to use blocks.\n\nHOW IT WORKS\n------------\n\nI figure if you're using a block, you probably won't need to pass any userinfo object into the timer... you can get to whatever you need just from the block.  So, I just hijack the `+scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:` class method and it's brother `-init...`, setting it to use itself as the target, and to execute the class method `+jdExecuteSimpleBlock:` (which is part of the category) then pass the block you specify as the userInfo object which is then uses in the execute method.  Pretty straightforward stuff.\n\nHOW TO USE IT\n-------------\n\nVery simple:\n\n\t[NSTimer scheduledTimerWithTimeInterval:2.0 block:^\n\t{\n\t\t[someObj doSomething];\n\t\t[someOtherObj doSomethingElse];\n\t\t// ... etc ...\n\t} repeats:NO];\n\t\nThis may be overkill for most NSTimer operations... I mean, do you really have a need for a block?  Couldn't you use the selector methods?  Sure you could... but sometimes it's more elegant to use a block... so here you go.\n\n\nLICENSE\n-------\n\nCopyright (C) 2011 by Random Ideas, LLC\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>Copyright (C) 2011 by Random Ideas, LLC</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>NSTimer-Blocks</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>Copyright (c) 2011, Tony Million.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>BSD</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Reachability</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>Copyright (c) 2010-2016 Sam Soffes, http://soff.es\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SAMKeychain</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIActionSheet+Blocks</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>The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>UIAlertView+Blocks</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>## Licenses\n\nThe Hockey SDK is provided under the following license:\n\n    The MIT License\n    Copyright (c) Microsoft Corporation.\n    All rights reserved.\n\t\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\t\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nExcept as noted below, PLCrashReporter \nis provided under the following license:\n\n    Copyright (c) 2008 - 2015 Plausible Labs Cooperative, Inc.\n    Copyright (c) 2012 - 2015 HockeyApp, Bit Stadium GmbH.\n    All rights reserved.\n\n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nThe protobuf-c library, as well as the PLCrashLogWriterEncoding.c\nfile are licensed as follows:\n\n    Copyright 2008, Dave Benson.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with\n    the License. You may obtain a copy of the License\n    at http://www.apache.org/licenses/LICENSE-2.0 Unless\n    required by applicable law or agreed to in writing,\n    software distributed under the License is distributed on\n    an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n    KIND, either express or implied. See the License for the\n    specific language governing permissions and limitations\n    under the License.\n\nTTTAttributedLabel is licensed as follows:\n\n    Copyright (c) 2011 Mattt Thompson (http://mattt.me/)\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nSFHFKeychainUtils is licensed as follows:\n\n    Created by Buzz Andersen on 10/20/08.\n    Based partly on code by Jonathan Wight, Jon Crosby, and Mike Malone.\n    Copyright 2008 Sci-Fi Hi-Fi. All rights reserved.\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation\n    files (the \"Software\"), to deal in the Software without\n    restriction, including without limitation the rights to use,\n    copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following\n    conditions:\n\n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n    OTHER DEALINGS IN THE SOFTWARE.\n\nGZIP is licensed as follow:\n    \n    Created by Nick Lockwood on 03/06/2012.\n    Copyright (C) 2012 Charcoal Design\n    \n    Distributed under the permissive zlib License\n    Get the latest version from here:\n    \n    https://github.com/nicklockwood/GZIP\n    \n    This software is provided 'as-is', without any express or implied\n    warranty.  In no event will the authors be held liable for any damages\n    arising from the use of this software.\n    \n    Permission is granted to anyone to use this software for any purpose,\n    including commercial applications, and to alter it and redistribute it\n    freely, subject to the following restrictions:\n    \n    1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n    \n    2. Altered source versions must be plainly marked as such, and must not be\n    misrepresented as being the original software.\n    \n    3. This notice may not be removed or altered from any source distribution.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>HockeySDK</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 - https://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": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_Dash_Dash_App_Store : NSObject\n@end\n@implementation PodsDummy_Pods_Dash_Dash_App_Store\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# Used as a return value for each invocation of `strip_invalid_archs` function.\nSTRIP_BINARY_RETVAL=0\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\n# Copies and strips a vendored framework\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies and strips a vendored dSYM\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    # Copy the dSYM into a the targets temp dir.\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DERIVED_FILES_DIR}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"\n\n    local basename\n    basename=\"$(basename -s .framework.dSYM \"$source\")\"\n    binary=\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}\"\n\n    # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n    if [[ \"$(file \"$binary\")\" == *\"Mach-O dSYM companion\"* ]]; then\n      strip_invalid_archs \"$binary\"\n    fi\n\n    if [[ $STRIP_BINARY_RETVAL == 1 ]]; then\n      # Move the stripped file into its final destination.\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"\n    else\n      # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.\n      touch \"${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM\"\n    fi\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current target binary\n  binary_archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)\"\n  # Intersect them with the architectures we are building for\n  intersected_archs=\"$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\\n' | sort | uniq -d)\"\n  # If there are no archs supported by this binary then warn the user\n  if [[ -z \"$intersected_archs\" ]]; then\n    echo \"warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS).\"\n    STRIP_BINARY_RETVAL=0\n    return\n  fi\n  stripped=\"\"\n  for arch in $binary_archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n  STRIP_BINARY_RETVAL=1\n}\n\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${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  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_resource \"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\"\n  install_resource \"${PODS_CONFIGURATION_BUILD_DIR}/HockeySDK/HockeySDKResources.bundle\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_resource \"${PODS_ROOT}/SAMKeychain/Support/SAMKeychain.bundle\"\n  install_resource \"${PODS_CONFIGURATION_BUILD_DIR}/HockeySDK/HockeySDKResources.bundle\"\nfi\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\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`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store.debug.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(SDKROOT)/usr/include/libxml2 $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/AutoCoding\" \"${PODS_CONFIGURATION_BUILD_DIR}/DTBonjour\" \"${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet\" \"${PODS_CONFIGURATION_BUILD_DIR}/GZIP\" \"${PODS_CONFIGURATION_BUILD_DIR}/JGMethodSwizzler\" \"${PODS_CONFIGURATION_BUILD_DIR}/KissXML\" \"${PODS_CONFIGURATION_BUILD_DIR}/MRProgress\" \"${PODS_CONFIGURATION_BUILD_DIR}/NSTimer-Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/Reachability\" \"${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIActionSheet+Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIAlertView+Blocks\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/AutoCoding\" -isystem \"${PODS_ROOT}/Headers/Public/DTBonjour\" -isystem \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" -isystem \"${PODS_ROOT}/Headers/Public/GZIP\" -isystem \"${PODS_ROOT}/Headers/Public/HockeySDK\" -isystem \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" -isystem \"${PODS_ROOT}/Headers/Public/KissXML\" -isystem \"${PODS_ROOT}/Headers/Public/MRProgress\" -isystem \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/Reachability\" -isystem \"${PODS_ROOT}/Headers/Public/SAMKeychain\" -isystem \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"AutoCoding\" -l\"DTBonjour\" -l\"DZNEmptyDataSet\" -l\"GZIP\" -l\"JGMethodSwizzler\" -l\"KissXML\" -l\"MRProgress\" -l\"NSTimer-Blocks\" -l\"Reachability\" -l\"SAMKeychain\" -l\"UIActionSheet+Blocks\" -l\"UIAlertView+Blocks\" -l\"c++\" -l\"xml2\" -l\"z\" -framework \"Accelerate\" -framework \"CoreFoundation\" -framework \"CoreGraphics\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"Foundation\" -framework \"HockeySDK\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"QuickLook\" -framework \"Security\" -framework \"SystemConfiguration\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/..\nPODS_ROOT = ${SRCROOT}/../Pods\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-Dash-Dash App Store/Pods-Dash-Dash App Store.release.xcconfig",
    "content": "FRAMEWORK_SEARCH_PATHS = $(inherited) \"${PODS_ROOT}/HockeySDK/HockeySDK-iOS/HockeySDK.embeddedframework\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = $(SDKROOT)/usr/include/libxml2 $(inherited) \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nLIBRARY_SEARCH_PATHS = $(inherited) \"${PODS_CONFIGURATION_BUILD_DIR}/AutoCoding\" \"${PODS_CONFIGURATION_BUILD_DIR}/DTBonjour\" \"${PODS_CONFIGURATION_BUILD_DIR}/DZNEmptyDataSet\" \"${PODS_CONFIGURATION_BUILD_DIR}/GZIP\" \"${PODS_CONFIGURATION_BUILD_DIR}/JGMethodSwizzler\" \"${PODS_CONFIGURATION_BUILD_DIR}/KissXML\" \"${PODS_CONFIGURATION_BUILD_DIR}/MRProgress\" \"${PODS_CONFIGURATION_BUILD_DIR}/NSTimer-Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/Reachability\" \"${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIActionSheet+Blocks\" \"${PODS_CONFIGURATION_BUILD_DIR}/UIAlertView+Blocks\"\nOTHER_CFLAGS = $(inherited) -isystem \"${PODS_ROOT}/Headers/Public\" -isystem \"${PODS_ROOT}/Headers/Public/AutoCoding\" -isystem \"${PODS_ROOT}/Headers/Public/DTBonjour\" -isystem \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" -isystem \"${PODS_ROOT}/Headers/Public/GZIP\" -isystem \"${PODS_ROOT}/Headers/Public/HockeySDK\" -isystem \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" -isystem \"${PODS_ROOT}/Headers/Public/KissXML\" -isystem \"${PODS_ROOT}/Headers/Public/MRProgress\" -isystem \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/Reachability\" -isystem \"${PODS_ROOT}/Headers/Public/SAMKeychain\" -isystem \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" -isystem \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = $(inherited) -ObjC -l\"AutoCoding\" -l\"DTBonjour\" -l\"DZNEmptyDataSet\" -l\"GZIP\" -l\"JGMethodSwizzler\" -l\"KissXML\" -l\"MRProgress\" -l\"NSTimer-Blocks\" -l\"Reachability\" -l\"SAMKeychain\" -l\"UIActionSheet+Blocks\" -l\"UIAlertView+Blocks\" -l\"c++\" -l\"xml2\" -l\"z\" -framework \"Accelerate\" -framework \"CoreFoundation\" -framework \"CoreGraphics\" -framework \"CoreTelephony\" -framework \"CoreText\" -framework \"Foundation\" -framework \"HockeySDK\" -framework \"MobileCoreServices\" -framework \"QuartzCore\" -framework \"QuickLook\" -framework \"Security\" -framework \"SystemConfiguration\" -framework \"UIKit\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/..\nPODS_ROOT = ${SRCROOT}/../Pods\n"
  },
  {
    "path": "Pods/Target Support Files/Reachability/Reachability-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Reachability : NSObject\n@end\n@implementation PodsDummy_Reachability\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Reachability/Reachability-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Reachability/Reachability.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Reachability\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/Reachability\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"SystemConfiguration\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Reachability\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/SAMKeychain/SAMKeychain-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SAMKeychain : NSObject\n@end\n@implementation PodsDummy_SAMKeychain\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/SAMKeychain/SAMKeychain-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/SAMKeychain/SAMKeychain.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SAMKeychain\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/SAMKeychain\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nOTHER_LDFLAGS = -framework \"Foundation\" -framework \"Security\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/SAMKeychain\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/UIActionSheet+Blocks/UIActionSheet+Blocks-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_UIActionSheet_Blocks : NSObject\n@end\n@implementation PodsDummy_UIActionSheet_Blocks\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/UIActionSheet+Blocks/UIActionSheet+Blocks-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/UIActionSheet+Blocks/UIActionSheet+Blocks.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/UIActionSheet+Blocks\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/UIActionSheet+Blocks\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/UIAlertView+Blocks/UIAlertView+Blocks-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_UIAlertView_Blocks : NSObject\n@end\n@implementation PodsDummy_UIAlertView_Blocks\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/UIAlertView+Blocks/UIAlertView+Blocks-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/UIAlertView+Blocks/UIAlertView+Blocks.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/UIAlertView+Blocks\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Private/UIAlertView+Blocks\" \"${PODS_ROOT}/Headers/Public\" \"${PODS_ROOT}/Headers/Public/AutoCoding\" \"${PODS_ROOT}/Headers/Public/DTBonjour\" \"${PODS_ROOT}/Headers/Public/DZNEmptyDataSet\" \"${PODS_ROOT}/Headers/Public/GZIP\" \"${PODS_ROOT}/Headers/Public/HockeySDK\" \"${PODS_ROOT}/Headers/Public/JGMethodSwizzler\" \"${PODS_ROOT}/Headers/Public/KissXML\" \"${PODS_ROOT}/Headers/Public/MRProgress\" \"${PODS_ROOT}/Headers/Public/NSTimer-Blocks\" \"${PODS_ROOT}/Headers/Public/Reachability\" \"${PODS_ROOT}/Headers/Public/SAMKeychain\" \"${PODS_ROOT}/Headers/Public/UIActionSheet+Blocks\" \"${PODS_ROOT}/Headers/Public/UIAlertView+Blocks\"\nPODS_BUILD_DIR = ${BUILD_DIR}\nPODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/UIAlertView+Blocks\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/UIActionSheet+Blocks/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/UIActionSheet+Blocks/README.md",
    "content": "UIActionSheet+Blocks\n===================\n\nCategory on UIActionSheet to use inline block callbacks instead of delegate callbacks.\n\nUIActionSheet was created in a time before blocks, ARC, and judging by its naming – touch screens too. Who “clicks” on an action sheet anyway?\n\nLets modernize this shizzle with some blocks goodness.\n\n```objc\ntypedef void (^UIActionSheetBlock) (UIActionSheet *actionSheet);\ntypedef void (^UIActionSheetCompletionBlock) (UIActionSheet *actionSheet, NSInteger buttonIndex);\n\n@property (copy, nonatomic) UIActionSheetCompletionBlock tapBlock;\n@property (copy, nonatomic) UIActionSheetCompletionBlock willDismissBlock;\n@property (copy, nonatomic) UIActionSheetCompletionBlock didDismissBlock;\n\n@property (copy, nonatomic) UIActionSheetBlock willPresentBlock;\n@property (copy, nonatomic) UIActionSheetBlock didPresentBlock;\n@property (copy, nonatomic) UIActionSheetBlock cancelBlock;\n```\n\nYou can create and show an action sheet in a single call, e.g.\n\n```objc\n[UIActionSheet showInView:self.view\n                withTitle:@\"Are you sure you want to delete all the things?\"\n        cancelButtonTitle:@\"Cancel\"\n   destructiveButtonTitle:@\"Delete all the things\"\n        otherButtonTitles:@[@\"Just some of the things\", @\"Most of the things\"]\n                 tapBlock:^(UIActionSheet *actionSheet, NSInteger buttonIndex) {\n                     NSLog(@\"Chose %@\", [actionSheet buttonTitleAtIndex:buttonIndex]);\n                 }];\n```\n\nThe full suite of action methods are supported, including `showFromTabBar:`, `showFromToolbar:`, `showInView:`, `showFromBarButtonItem:animated:` and `showFromRect:inView:animated:`.\n\nIf you need further customization, you can create and configure an action sheet as you usually would, and then assign blocks to the action sheet, e.g.\n\n```objc\nUIActionSheet *as = [[UIActionSheet alloc] initWithTitle:@\"Choose a coffee\"\n                                                delegate:nil\n                                       cancelButtonTitle:@\"Cancel\"\n                                  destructiveButtonTitle:nil\n                                       otherButtonTitles:@\"Flat White\", @\"Latte\", @\"Cappuccino\", @\"Long Black\", nil];\n\nas.actionSheetStyle = UIActionSheetStyleBlackTranslucent;\n\nas.tapBlock = ^(UIActionSheet *actionSheet, NSInteger buttonIndex){\n    NSLog(@\"Chose %@\", [actionSheet buttonTitleAtIndex:buttonIndex]);\n};\n\n[as showInView:self.view];\n```\n\nIf a delegate was set on the action sheet, the delegate will be preserved and the blocks will be executed _before_ the delegate is called.\n\n## Requirements\n\nBlocks - so iOS 4.0 and later. Compatible with both ARC and traditional retain/release code.\n\n## Usage\n\nAdd `UIActionSheet+Blocks.h/m` into your project, or `pod 'UIActionSheet+Blocks'` using CocoaPods.\n\n## Alert Views\n\nIf you’d like similar functionality on UIAlertView too, check out twin-sister [UIAlertView+Blocks](https://github.com/ryanmaxwell/UIAlertView-Blocks).\n\n## iOS 8 and UIAlertController\n\nCheck out [UIAlertController+Blocks](https://github.com/ryanmaxwell/UIAlertController-Blocks) if you would like to migrate to UIAlertController, and use a familiar API."
  },
  {
    "path": "Pods/UIActionSheet+Blocks/UIActionSheet+Blocks.h",
    "content": "//\n//  UIActionSheet+Blocks.h\n//  UIActionSheetBlocks\n//\n//  Created by Ryan Maxwell on 31/08/13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2013 Ryan Maxwell\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of\n//  this software and associated documentation files (the \"Software\"), to deal in\n//  the Software without restriction, including without limitation the rights to\n//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n//  the Software, and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all\n//  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, FITNESS\n//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#import <UIKit/UIKit.h>\n\ntypedef void (^UIActionSheetBlock) (UIActionSheet * __nonnull actionSheet);\ntypedef void (^UIActionSheetCompletionBlock) (UIActionSheet * __nonnull actionSheet, NSInteger buttonIndex);\n\n@interface UIActionSheet (Blocks)\n\n+ (nonnull instancetype)showFromTabBar:(nonnull UITabBar *)tabBar\n                     withTitle:(nullable NSString *)title\n             cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n        destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle\n             otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                      tapBlock:(nullable UIActionSheetCompletionBlock)tapBlock;\n\n+ (nonnull instancetype)showFromToolbar:(nonnull UIToolbar *)toolbar\n                      withTitle:(nullable NSString *)title\n              cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n         destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle\n              otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                       tapBlock:(nullable UIActionSheetCompletionBlock)tapBlock;\n\n+ (nonnull instancetype)showInView:(nonnull UIView *)view\n                 withTitle:(nullable NSString *)title\n         cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n    destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle\n         otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                  tapBlock:(nullable UIActionSheetCompletionBlock)tapBlock;\n\n+ (nonnull instancetype)showFromBarButtonItem:(nonnull UIBarButtonItem *)barButtonItem\n                             animated:(BOOL)animated\n                            withTitle:(nullable NSString *)title\n                    cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n               destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle\n                    otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                             tapBlock:(nullable UIActionSheetCompletionBlock)tapBlock;\n\n+ (nonnull instancetype)showFromRect:(CGRect)rect\n                      inView:(nonnull UIView *)view\n                    animated:(BOOL)animated\n                   withTitle:(nullable NSString *)title\n           cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n      destructiveButtonTitle:(nullable NSString *)destructiveButtonTitle\n           otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                    tapBlock:(nullable UIActionSheetCompletionBlock)tapBlock;\n\n@property (copy, nonatomic, nullable) UIActionSheetCompletionBlock tapBlock;\n@property (copy, nonatomic, nullable) UIActionSheetCompletionBlock willDismissBlock;\n@property (copy, nonatomic, nullable) UIActionSheetCompletionBlock didDismissBlock;\n\n@property (copy, nonatomic, nullable) UIActionSheetBlock willPresentBlock;\n@property (copy, nonatomic, nullable) UIActionSheetBlock didPresentBlock;\n@property (copy, nonatomic, nullable) UIActionSheetBlock cancelBlock;\n\n@end\n"
  },
  {
    "path": "Pods/UIActionSheet+Blocks/UIActionSheet+Blocks.m",
    "content": "//\n//  UIActionSheet+Blocks.m\n//  UIActionSheetBlocks\n//\n//  Created by Ryan Maxwell on 31/08/13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2013 Ryan Maxwell\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of\n//  this software and associated documentation files (the \"Software\"), to deal in\n//  the Software without restriction, including without limitation the rights to\n//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n//  the Software, and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all\n//  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, FITNESS\n//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#import \"UIActionSheet+Blocks.h\"\n\n#import <objc/runtime.h>\n\nstatic const void *UIActionSheetOriginalDelegateKey = &UIActionSheetOriginalDelegateKey;\n\nstatic const void *UIActionSheetTapBlockKey         = &UIActionSheetTapBlockKey;\nstatic const void *UIActionSheetWillPresentBlockKey = &UIActionSheetWillPresentBlockKey;\nstatic const void *UIActionSheetDidPresentBlockKey  = &UIActionSheetDidPresentBlockKey;\nstatic const void *UIActionSheetWillDismissBlockKey = &UIActionSheetWillDismissBlockKey;\nstatic const void *UIActionSheetDidDismissBlockKey  = &UIActionSheetDidDismissBlockKey;\nstatic const void *UIActionSheetCancelBlockKey      = &UIActionSheetCancelBlockKey;\n\n#define NSArrayObjectMaybeNil(__ARRAY__, __INDEX__) ((__INDEX__ >= [__ARRAY__ count]) ? nil : [__ARRAY__ objectAtIndex:__INDEX__])\n// This is a hack to turn an array into a variable argument list. There is no good way to expand arrays into variable argument lists in Objective-C. This works by nil-terminating the list as soon as we overstep the bounds of the array. The obvious glitch is that we only support a finite number of buttons.\n#define NSArrayToVariableArgumentsList(__ARRAYNAME__) NSArrayObjectMaybeNil(__ARRAYNAME__, 0), NSArrayObjectMaybeNil(__ARRAYNAME__, 1), NSArrayObjectMaybeNil(__ARRAYNAME__, 2), NSArrayObjectMaybeNil(__ARRAYNAME__, 3), NSArrayObjectMaybeNil(__ARRAYNAME__, 4), NSArrayObjectMaybeNil(__ARRAYNAME__, 5), NSArrayObjectMaybeNil(__ARRAYNAME__, 6), NSArrayObjectMaybeNil(__ARRAYNAME__, 7), NSArrayObjectMaybeNil(__ARRAYNAME__, 8), NSArrayObjectMaybeNil(__ARRAYNAME__, 9), nil\n\n@implementation UIActionSheet (Blocks)\n\n+ (instancetype)showFromTabBar:(UITabBar *)tabBar\n                     withTitle:(NSString *)title\n             cancelButtonTitle:(NSString *)cancelButtonTitle\n        destructiveButtonTitle:(NSString *)destructiveButtonTitle\n             otherButtonTitles:(NSArray *)otherButtonTitles\n                      tapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    \n    UIActionSheet *actionSheet = [[self alloc] initWithTitle:title\n                                                    delegate:nil\n                                           cancelButtonTitle:cancelButtonTitle\n                                      destructiveButtonTitle:destructiveButtonTitle\n                                           otherButtonTitles:NSArrayToVariableArgumentsList(otherButtonTitles)];\n\n    if (tapBlock) {\n        actionSheet.tapBlock = tapBlock;\n    }\n    \n    [actionSheet showFromTabBar:tabBar];\n    \n#if !__has_feature(objc_arc)\n    return [actionSheet autorelease];\n#else\n    return actionSheet;\n#endif\n}\n\n+ (instancetype)showFromToolbar:(UIToolbar *)toolbar\n                      withTitle:(NSString *)title\n              cancelButtonTitle:(NSString *)cancelButtonTitle\n         destructiveButtonTitle:(NSString *)destructiveButtonTitle\n              otherButtonTitles:(NSArray *)otherButtonTitles\n                       tapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    \n    UIActionSheet *actionSheet = [[self alloc] initWithTitle:title\n                                                    delegate:nil\n                                           cancelButtonTitle:cancelButtonTitle\n                                      destructiveButtonTitle:destructiveButtonTitle\n                                           otherButtonTitles:NSArrayToVariableArgumentsList(otherButtonTitles)];\n\n    if (tapBlock) {\n        actionSheet.tapBlock = tapBlock;\n    }\n    \n    [actionSheet showFromToolbar:toolbar];\n    \n#if !__has_feature(objc_arc)\n    return [actionSheet autorelease];\n#else\n    return actionSheet;\n#endif\n}\n\n+ (instancetype)showInView:(UIView *)view\n                 withTitle:(NSString *)title\n         cancelButtonTitle:(NSString *)cancelButtonTitle\n    destructiveButtonTitle:(NSString *)destructiveButtonTitle\n         otherButtonTitles:(NSArray *)otherButtonTitles\n                  tapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    \n    UIActionSheet *actionSheet = [[self alloc] initWithTitle:title\n                                                    delegate:nil\n                                           cancelButtonTitle:cancelButtonTitle\n                                      destructiveButtonTitle:destructiveButtonTitle\n                                           otherButtonTitles:NSArrayToVariableArgumentsList(otherButtonTitles)];\n\n    if (tapBlock) {\n        actionSheet.tapBlock = tapBlock;\n    }\n    \n    [actionSheet showInView:view];\n    \n#if !__has_feature(objc_arc)\n    return [actionSheet autorelease];\n#else\n    return actionSheet;\n#endif\n}\n\n+ (instancetype)showFromBarButtonItem:(UIBarButtonItem *)barButtonItem\n                             animated:(BOOL)animated\n                            withTitle:(NSString *)title\n                    cancelButtonTitle:(NSString *)cancelButtonTitle\n               destructiveButtonTitle:(NSString *)destructiveButtonTitle\n                    otherButtonTitles:(NSArray *)otherButtonTitles\n                             tapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    \n    UIActionSheet *actionSheet = [[self alloc] initWithTitle:title\n                                                    delegate:nil\n                                           cancelButtonTitle:cancelButtonTitle\n                                      destructiveButtonTitle:destructiveButtonTitle\n                                           otherButtonTitles:NSArrayToVariableArgumentsList(otherButtonTitles)];\n\n    if (tapBlock) {\n        actionSheet.tapBlock = tapBlock;\n    }\n    \n    [actionSheet showFromBarButtonItem:barButtonItem animated:animated];\n    \n#if !__has_feature(objc_arc)\n    return [actionSheet autorelease];\n#else\n    return actionSheet;\n#endif\n}\n\n+ (instancetype)showFromRect:(CGRect)rect\n                      inView:(UIView *)view\n                    animated:(BOOL)animated\n                   withTitle:(NSString *)title\n           cancelButtonTitle:(NSString *)cancelButtonTitle\n      destructiveButtonTitle:(NSString *)destructiveButtonTitle\n           otherButtonTitles:(NSArray *)otherButtonTitles\n                    tapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    \n    UIActionSheet *actionSheet = [[self alloc] initWithTitle:title\n                                                    delegate:nil\n                                           cancelButtonTitle:cancelButtonTitle\n                                      destructiveButtonTitle:destructiveButtonTitle\n                                           otherButtonTitles:NSArrayToVariableArgumentsList(otherButtonTitles)];\n\n    if (tapBlock) {\n        actionSheet.tapBlock = tapBlock;\n    }\n    \n    [actionSheet showFromRect:rect inView:view animated:animated];\n    \n#if !__has_feature(objc_arc)\n    return [actionSheet autorelease];\n#else\n    return actionSheet;\n#endif\n}\n\n#pragma mark -\n\n- (void)_checkActionSheetDelegate {\n    if (self.delegate != (id<UIActionSheetDelegate>)self) {\n        objc_setAssociatedObject(self, UIActionSheetOriginalDelegateKey, self.delegate, OBJC_ASSOCIATION_ASSIGN);\n        self.delegate = (id<UIActionSheetDelegate>)self;\n    }\n}\n\n- (UIActionSheetCompletionBlock)tapBlock {\n    return objc_getAssociatedObject(self, UIActionSheetTapBlockKey);\n}\n\n- (void)setTapBlock:(UIActionSheetCompletionBlock)tapBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetTapBlockKey, tapBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIActionSheetCompletionBlock)willDismissBlock {\n    return objc_getAssociatedObject(self, UIActionSheetWillDismissBlockKey);\n}\n\n- (void)setWillDismissBlock:(UIActionSheetCompletionBlock)willDismissBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetWillDismissBlockKey, willDismissBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIActionSheetCompletionBlock)didDismissBlock {\n    return objc_getAssociatedObject(self, UIActionSheetDidDismissBlockKey);\n}\n\n- (void)setDidDismissBlock:(UIActionSheetCompletionBlock)didDismissBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetDidDismissBlockKey, didDismissBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIActionSheetBlock)willPresentBlock {\n    return objc_getAssociatedObject(self, UIActionSheetWillPresentBlockKey);\n}\n\n- (void)setWillPresentBlock:(UIActionSheetBlock)willPresentBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetWillPresentBlockKey, willPresentBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIActionSheetBlock)didPresentBlock {\n    return objc_getAssociatedObject(self, UIActionSheetDidPresentBlockKey);\n}\n\n- (void)setDidPresentBlock:(UIActionSheetBlock)didPresentBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetDidPresentBlockKey, didPresentBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIActionSheetBlock)cancelBlock {\n    return objc_getAssociatedObject(self, UIActionSheetCancelBlockKey);\n}\n\n- (void)setCancelBlock:(UIActionSheetBlock)cancelBlock {\n    [self _checkActionSheetDelegate];\n    objc_setAssociatedObject(self, UIActionSheetCancelBlockKey, cancelBlock, OBJC_ASSOCIATION_COPY);\n}\n\n#pragma mark - UIActionSheetDelegate\n\n- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {\n    UIActionSheetBlock completion = actionSheet.willPresentBlock;\n    \n    if (completion) {\n        completion(actionSheet);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(willPresentActionSheet:)]) {\n        [originalDelegate willPresentActionSheet:actionSheet];\n    }\n}\n\n- (void)didPresentActionSheet:(UIActionSheet *)actionSheet {\n    UIActionSheetBlock completion = actionSheet.didPresentBlock;\n    \n    if (completion) {\n        completion(actionSheet);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(didPresentActionSheet:)]) {\n        [originalDelegate didPresentActionSheet:actionSheet];\n    }\n}\n\n- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {\n    UIActionSheetCompletionBlock completion = actionSheet.tapBlock;\n    \n    if (completion) {\n        completion(actionSheet, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(actionSheet:clickedButtonAtIndex:)]) {\n        [originalDelegate actionSheet:actionSheet clickedButtonAtIndex:buttonIndex];\n    }\n}\n\n- (void)actionSheetCancel:(UIActionSheet *)actionSheet {\n    UIActionSheetBlock completion = actionSheet.cancelBlock;\n    \n    if (completion) {\n        completion(actionSheet);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(actionSheetCancel:)]) {\n        [originalDelegate actionSheetCancel:actionSheet];\n    }\n}\n\n- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {\n    UIActionSheetCompletionBlock completion = actionSheet.willDismissBlock;\n    \n    if (completion) {\n        completion(actionSheet, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(actionSheet:willDismissWithButtonIndex:)]) {\n        [originalDelegate actionSheet:actionSheet willDismissWithButtonIndex:buttonIndex];\n    }\n}\n\n- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {\n    UIActionSheetCompletionBlock completion = actionSheet.didDismissBlock;\n    \n    if (completion) {\n        completion(actionSheet, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIActionSheetOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(actionSheet:didDismissWithButtonIndex:)]) {\n        [originalDelegate actionSheet:actionSheet didDismissWithButtonIndex:buttonIndex];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/UIAlertView+Blocks/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013 Ryan Maxwell\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/UIAlertView+Blocks/README.md",
    "content": "UIAlertView+Blocks\n=================\n\nCategory on UIAlertView to use inline block callbacks instead of delegate callbacks.\n\nUIAlertView was created in a time before blocks, ARC, and judging by its naming – touch screens too. Who “clicks” on an alert view anyway?\n\nLets modernize this shizzle with some blocks goodness.\n\n```objc\ntypedef void (^UIAlertViewBlock) (UIAlertView *alertView);\ntypedef void (^UIAlertViewCompletionBlock) (UIAlertView *alertView, NSInteger buttonIndex);\n\n@property (copy, nonatomic) UIAlertViewCompletionBlock tapBlock;\n@property (copy, nonatomic) UIAlertViewCompletionBlock willDismissBlock;\n@property (copy, nonatomic) UIAlertViewCompletionBlock didDismissBlock;\n\n@property (copy, nonatomic) UIAlertViewBlock willPresentBlock;\n@property (copy, nonatomic) UIAlertViewBlock didPresentBlock;\n@property (copy, nonatomic) UIAlertViewBlock cancelBlock;\n\n@property (copy, nonatomic) BOOL(^shouldEnableFirstOtherButtonBlock)(UIAlertView *alertView);\n```\n\nYou can create and show an alert in a single call, e.g.\n\n```objc\n[UIAlertView showWithTitle:@\"Drink Selection\"\n                   message:@\"Choose a refreshing beverage\"\n         cancelButtonTitle:@\"Cancel\"\n         otherButtonTitles:@[@\"Beer\", @\"Wine\"]\n                  tapBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {\n                      if (buttonIndex == [alertView cancelButtonIndex]) {\n                          NSLog(@\"Cancelled\");\n                      } else if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@\"Beer\"]) {\n                          NSLog(@\"Have a cold beer\");\n                      } else if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@\"Wine\"]) {\n                          NSLog(@\"Have a glass of chardonnay\");\n                      }\n                  }];\n```\n\nIf you need further customization, you can create and configure an alert as you usually would, and then assign blocks to the alert, e.g.\n\n```objc\nUIAlertView *av = [[UIAlertView alloc] initWithTitle:@\"Sign in to my awesome service\"\n                                             message:@\"I promise I won’t steal your password\"\n                                            delegate:self\n                                   cancelButtonTitle:@\"Cancel\"\n                                   otherButtonTitles:@\"OK\", nil];\n\nav.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;\n\nav.tapBlock = ^(UIAlertView *alertView, NSInteger buttonIndex) {\n\tif (buttonIndex == alertView.firstOtherButtonIndex) {\n\t\tNSLog(@\"Username: %@\", [[alertView textFieldAtIndex:0] text]);\n    \tNSLog(@\"Password: %@\", [[alertView textFieldAtIndex:1] text]);\n\t} else if (buttonIndex == alertView.cancelButtonIndex) {\n\t\tNSLog(@\"Cancelled.\");\n\t}\n};\n\nav.shouldEnableFirstOtherButtonBlock = ^BOOL(UIAlertView *alertView) {\n    return ([[[alertView textFieldAtIndex:1] text] length] > 0);\n};\n\n[av show];\n```\n\nIf a delegate was set on the alert view, the delegate will be preserved and the blocks will be executed _before_ the delegate is called.\n\n## Category Requirements\n\nBlocks - so iOS 4.0 and later. Compatible with both ARC and traditional retain/release code.\n\n## Test Project Requirements\n\nThe Xcode test project uses the XCTest framework and so requires >= Xcode 5.\n\n## Usage\n\nAdd `UIAlertView+Blocks.h/m` into your project, or `pod 'UIAlertView+Blocks'` using CocoaPods.\n\n## Action Sheets\n\nIf you’d like similar functionality on UIActionSheet too, check out twin-sister [UIActionSheet+Blocks](https://github.com/ryanmaxwell/UIActionSheet-Blocks).\n\n## iOS 8 and UIAlertController\n\nCheck out [UIAlertController+Blocks](https://github.com/ryanmaxwell/UIAlertController-Blocks) if you would like to migrate to UIAlertController, and use a familiar API.\n"
  },
  {
    "path": "Pods/UIAlertView+Blocks/UIAlertView+Blocks.h",
    "content": "//\n//  UIAlertView+Blocks.h\n//  UIAlertViewBlocks\n//\n//  Created by Ryan Maxwell on 29/08/13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2013 Ryan Maxwell\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of\n//  this software and associated documentation files (the \"Software\"), to deal in\n//  the Software without restriction, including without limitation the rights to\n//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n//  the Software, and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all\n//  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, FITNESS\n//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#import <UIKit/UIKit.h>\n\ntypedef void (^UIAlertViewBlock) (UIAlertView * __nonnull alertView);\ntypedef void (^UIAlertViewCompletionBlock) (UIAlertView * __nonnull alertView, NSInteger buttonIndex);\n\n@interface UIAlertView (Blocks)\n\n+ (nonnull instancetype)showWithTitle:(nullable NSString *)title\n                              message:(nullable NSString *)message\n                                style:(UIAlertViewStyle)style\n                    cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n                    otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                             tapBlock:(nullable UIAlertViewCompletionBlock)tapBlock;\n\n+ (nonnull instancetype)showWithTitle:(nullable NSString *)title\n                              message:(nullable NSString *)message\n                    cancelButtonTitle:(nullable NSString *)cancelButtonTitle\n                    otherButtonTitles:(nullable NSArray *)otherButtonTitles\n                             tapBlock:(nullable UIAlertViewCompletionBlock)tapBlock;\n\n@property (copy, nonatomic, nullable) UIAlertViewCompletionBlock tapBlock;\n@property (copy, nonatomic, nullable) UIAlertViewCompletionBlock willDismissBlock;\n@property (copy, nonatomic, nullable) UIAlertViewCompletionBlock didDismissBlock;\n\n@property (copy, nonatomic, nullable) UIAlertViewBlock willPresentBlock;\n@property (copy, nonatomic, nullable) UIAlertViewBlock didPresentBlock;\n@property (copy, nonatomic, nullable) UIAlertViewBlock cancelBlock;\n\n@property (copy, nonatomic, nullable) BOOL(^shouldEnableFirstOtherButtonBlock)(UIAlertView * __nonnull alertView);\n\n@end\n"
  },
  {
    "path": "Pods/UIAlertView+Blocks/UIAlertView+Blocks.m",
    "content": "//\n//  UIAlertView+Blocks.m\n//  UIAlertViewBlocks\n//\n//  Created by Ryan Maxwell on 29/08/13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2013 Ryan Maxwell\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of\n//  this software and associated documentation files (the \"Software\"), to deal in\n//  the Software without restriction, including without limitation the rights to\n//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n//  the Software, and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all\n//  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, FITNESS\n//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\n#import \"UIAlertView+Blocks.h\"\n\n#import <objc/runtime.h>\n\nstatic const void *UIAlertViewOriginalDelegateKey                   = &UIAlertViewOriginalDelegateKey;\n\nstatic const void *UIAlertViewTapBlockKey                           = &UIAlertViewTapBlockKey;\nstatic const void *UIAlertViewWillPresentBlockKey                   = &UIAlertViewWillPresentBlockKey;\nstatic const void *UIAlertViewDidPresentBlockKey                    = &UIAlertViewDidPresentBlockKey;\nstatic const void *UIAlertViewWillDismissBlockKey                   = &UIAlertViewWillDismissBlockKey;\nstatic const void *UIAlertViewDidDismissBlockKey                    = &UIAlertViewDidDismissBlockKey;\nstatic const void *UIAlertViewCancelBlockKey                        = &UIAlertViewCancelBlockKey;\nstatic const void *UIAlertViewShouldEnableFirstOtherButtonBlockKey  = &UIAlertViewShouldEnableFirstOtherButtonBlockKey;\n\n@implementation UIAlertView (Blocks)\n\n+ (instancetype)showWithTitle:(NSString *)title\n                      message:(NSString *)message\n                        style:(UIAlertViewStyle)style\n            cancelButtonTitle:(NSString *)cancelButtonTitle\n            otherButtonTitles:(NSArray *)otherButtonTitles\n                     tapBlock:(UIAlertViewCompletionBlock)tapBlock {\n    \n    NSString *firstObject = otherButtonTitles.count ? otherButtonTitles[0] : nil;\n    \n    UIAlertView *alertView = [[self alloc] initWithTitle:title\n                                                 message:message\n                                                delegate:nil\n                                       cancelButtonTitle:cancelButtonTitle\n                                       otherButtonTitles:firstObject, nil];\n    \n    alertView.alertViewStyle = style;\n    \n    if (otherButtonTitles.count > 1) {\n        for (NSString *buttonTitle in [otherButtonTitles subarrayWithRange:NSMakeRange(1, otherButtonTitles.count - 1)]) {\n            [alertView addButtonWithTitle:buttonTitle];\n        }\n    }\n    \n    if (tapBlock) {\n        alertView.tapBlock = tapBlock;\n    }\n    \n    [alertView show];\n    \n#if !__has_feature(objc_arc)\n    return [alertView autorelease];\n#else\n    return alertView;\n#endif\n}\n\n\n+ (instancetype)showWithTitle:(NSString *)title\n                      message:(NSString *)message\n            cancelButtonTitle:(NSString *)cancelButtonTitle\n            otherButtonTitles:(NSArray *)otherButtonTitles\n                     tapBlock:(UIAlertViewCompletionBlock)tapBlock {\n    \n    return [self showWithTitle:title\n                       message:message\n                         style:UIAlertViewStyleDefault\n             cancelButtonTitle:cancelButtonTitle\n             otherButtonTitles:otherButtonTitles\n                      tapBlock:tapBlock];\n}\n\n#pragma mark -\n\n- (void)_checkAlertViewDelegate {\n    if (self.delegate != (id<UIAlertViewDelegate>)self) {\n        objc_setAssociatedObject(self, UIAlertViewOriginalDelegateKey, self.delegate, OBJC_ASSOCIATION_ASSIGN);\n        self.delegate = (id<UIAlertViewDelegate>)self;\n    }\n}\n\n- (UIAlertViewCompletionBlock)tapBlock {\n    return objc_getAssociatedObject(self, UIAlertViewTapBlockKey);\n}\n\n- (void)setTapBlock:(UIAlertViewCompletionBlock)tapBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewTapBlockKey, tapBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIAlertViewCompletionBlock)willDismissBlock {\n    return objc_getAssociatedObject(self, UIAlertViewWillDismissBlockKey);\n}\n\n- (void)setWillDismissBlock:(UIAlertViewCompletionBlock)willDismissBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewWillDismissBlockKey, willDismissBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIAlertViewCompletionBlock)didDismissBlock {\n    return objc_getAssociatedObject(self, UIAlertViewDidDismissBlockKey);\n}\n\n- (void)setDidDismissBlock:(UIAlertViewCompletionBlock)didDismissBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewDidDismissBlockKey, didDismissBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIAlertViewBlock)willPresentBlock {\n    return objc_getAssociatedObject(self, UIAlertViewWillPresentBlockKey);\n}\n\n- (void)setWillPresentBlock:(UIAlertViewBlock)willPresentBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewWillPresentBlockKey, willPresentBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIAlertViewBlock)didPresentBlock {\n    return objc_getAssociatedObject(self, UIAlertViewDidPresentBlockKey);\n}\n\n- (void)setDidPresentBlock:(UIAlertViewBlock)didPresentBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewDidPresentBlockKey, didPresentBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (UIAlertViewBlock)cancelBlock {\n    return objc_getAssociatedObject(self, UIAlertViewCancelBlockKey);\n}\n\n- (void)setCancelBlock:(UIAlertViewBlock)cancelBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewCancelBlockKey, cancelBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (void)setShouldEnableFirstOtherButtonBlock:(BOOL(^)(UIAlertView *alertView))shouldEnableFirstOtherButtonBlock {\n    [self _checkAlertViewDelegate];\n    objc_setAssociatedObject(self, UIAlertViewShouldEnableFirstOtherButtonBlockKey, shouldEnableFirstOtherButtonBlock, OBJC_ASSOCIATION_COPY);\n}\n\n- (BOOL(^)(UIAlertView *alertView))shouldEnableFirstOtherButtonBlock {\n    return objc_getAssociatedObject(self, UIAlertViewShouldEnableFirstOtherButtonBlockKey);\n}\n\n#pragma mark - UIAlertViewDelegate\n\n- (void)willPresentAlertView:(UIAlertView *)alertView {\n    UIAlertViewBlock block = alertView.willPresentBlock;\n    \n    if (block) {\n        block(alertView);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(willPresentAlertView:)]) {\n        [originalDelegate willPresentAlertView:alertView];\n    }\n}\n\n- (void)didPresentAlertView:(UIAlertView *)alertView {\n    UIAlertViewBlock block = alertView.didPresentBlock;\n    \n    if (block) {\n        block(alertView);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(didPresentAlertView:)]) {\n        [originalDelegate didPresentAlertView:alertView];\n    }\n}\n\n\n- (void)alertViewCancel:(UIAlertView *)alertView {\n    UIAlertViewBlock block = alertView.cancelBlock;\n    \n    if (block) {\n        block(alertView);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertViewCancel:)]) {\n        [originalDelegate alertViewCancel:alertView];\n    }\n}\n\n- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {\n    UIAlertViewCompletionBlock completion = alertView.tapBlock;\n    \n    if (completion) {\n        completion(alertView, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) {\n        [originalDelegate alertView:alertView clickedButtonAtIndex:buttonIndex];\n    }\n}\n\n- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {\n    UIAlertViewCompletionBlock completion = alertView.willDismissBlock;\n    \n    if (completion) {\n        completion(alertView, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:willDismissWithButtonIndex:)]) {\n        [originalDelegate alertView:alertView willDismissWithButtonIndex:buttonIndex];\n    }\n}\n\n- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {\n    UIAlertViewCompletionBlock completion = alertView.didDismissBlock;\n    \n    if (completion) {\n        completion(alertView, buttonIndex);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertView:didDismissWithButtonIndex:)]) {\n        [originalDelegate alertView:alertView didDismissWithButtonIndex:buttonIndex];\n    }\n}\n\n- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView {\n    BOOL(^shouldEnableFirstOtherButtonBlock)(UIAlertView *alertView) = alertView.shouldEnableFirstOtherButtonBlock;\n    \n    if (shouldEnableFirstOtherButtonBlock) {\n        return shouldEnableFirstOtherButtonBlock(alertView);\n    }\n    \n    id originalDelegate = objc_getAssociatedObject(self, UIAlertViewOriginalDelegateKey);\n    if (originalDelegate && [originalDelegate respondsToSelector:@selector(alertViewShouldEnableFirstOtherButton:)]) {\n        return [originalDelegate alertViewShouldEnableFirstOtherButton:alertView];\n    }\n    \n    return YES;\n}\n\n@end\n"
  },
  {
    "path": "README.md",
    "content": "# Discontinued\n\nDash for iOS was [discontinued](https://blog.kapeli.com/goodbye-dash-for-ios). Please check out [Dash for macOS](https://kapeli.com/dash) instead.\n\n# [Dash for iOS](https://kapeli.com/dash_ios)\n\nDash gives your iPad and iPhone instant offline access to 150+ API documentation sets.\n\nFor more information about Dash, check out https://kapeli.com/dash_ios.\n\nAlso please check out [Dash for macOS](https://kapeli.com/dash).\n\n## Installation Instructions\n\nThe recommended way of installing Dash is through the [App Store](https://itunes.apple.com/us/app/dash-offline-api-docs/id1239167694?mt=8).\n\nAlternatively, you can use Xcode to install Dash on your iOS device using just your Apple ID.\n\nAll you need to do is:\n\n1. Install [Xcode](https://developer.apple.com/xcode/download/)\n1. Download the [Dash for iOS Source Code](https://github.com/Kapeli/Dash-iOS/releases/latest) or `git clone https://github.com/Kapeli/Dash-iOS.git`\n1. Open \"Dash iOS.xcworkspace\" in Xcode\n1. Go to Xcode's Preferences > Accounts and add your Apple ID\n1. In Xcode's sidebar select \"Dash iOS\" and go to General > Identity. Append a word at the end of the *Bundle Identifier* e.g. com.kapeli.dash.ios*.name* so it's unique. Select your Apple ID in Signing > Team\n1. Connect your iPad or iPhone using USB and select it in Xcode's Product menu > Destination\n1. Press CMD+R or Product > Run to install Dash\n1. If you install using a free (non-developer) account, make sure to rebuild Dash every 7 days, otherwise it will quit at launch when your certificate expires\n\n[Contact me](https://kapeli.com/contact) if you need help.\n\n## Contribution Guidelines\n\nI am currently only accepting pull requests that fix bugs or add/improve features. I can't allocate time to review pull requests that only refactor things or add comments.\n\nTry to maintain the same coding style I use (e.g. curly braces on their own line). I know it's a bit different from anyone else's and you might disagree with it, but having sections of code with a different style would make things worse.\n"
  }
]