From cb4d1140d74a7f453e4aa656beab254a3eb811ec Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Thu, 28 Feb 2019 02:23:18 +0200 Subject: [PATCH 01/41] Removed pods --- README.md | 1 + ios/{RCTMqtt => }/Mqtt.h | 0 ios/{RCTMqtt => }/Mqtt.m | 0 ios/{RCTMqtt => }/RCTMqtt.h | 0 ios/{RCTMqtt => }/RCTMqtt.m | 0 .../RCTMqtt.xcodeproj/project.pbxproj | 96 - ios/RCTMqtt/Podfile | 9 - ios/RCTMqtt/Podfile.lock | 23 - .../MQTTClient/ForegroundReconnection.h | 1 - .../Headers/Private/MQTTClient/GCDTimer.h | 1 - .../Private/MQTTClient/MQTTCFSocketDecoder.h | 1 - .../Private/MQTTClient/MQTTCFSocketEncoder.h | 1 - .../MQTTClient/MQTTCFSocketTransport.h | 1 - .../Headers/Private/MQTTClient/MQTTClient.h | 1 - .../MQTTClient/MQTTCoreDataPersistence.h | 1 - .../Headers/Private/MQTTClient/MQTTDecoder.h | 1 - .../MQTTClient/MQTTInMemoryPersistence.h | 1 - .../Pods/Headers/Private/MQTTClient/MQTTLog.h | 1 - .../Headers/Private/MQTTClient/MQTTMessage.h | 1 - .../Private/MQTTClient/MQTTPersistence.h | 1 - .../Private/MQTTClient/MQTTProperties.h | 1 - .../MQTTClient/MQTTSSLSecurityPolicy.h | 1 - .../MQTTClient/MQTTSSLSecurityPolicyDecoder.h | 1 - .../MQTTClient/MQTTSSLSecurityPolicyEncoder.h | 1 - .../MQTTSSLSecurityPolicyTransport.h | 1 - .../Headers/Private/MQTTClient/MQTTSession.h | 1 - .../Private/MQTTClient/MQTTSessionLegacy.h | 1 - .../Private/MQTTClient/MQTTSessionManager.h | 1 - .../Private/MQTTClient/MQTTSessionSynchron.h | 1 - .../Headers/Private/MQTTClient/MQTTStrict.h | 1 - .../Private/MQTTClient/MQTTTransport.h | 1 - .../Private/MQTTClient/ReconnectTimer.h | 1 - .../MQTTClient/ForegroundReconnection.h | 1 - .../Pods/Headers/Public/MQTTClient/GCDTimer.h | 1 - .../Public/MQTTClient/MQTTCFSocketDecoder.h | 1 - .../Public/MQTTClient/MQTTCFSocketEncoder.h | 1 - .../Public/MQTTClient/MQTTCFSocketTransport.h | 1 - .../Headers/Public/MQTTClient/MQTTClient.h | 1 - .../MQTTClient/MQTTCoreDataPersistence.h | 1 - .../Headers/Public/MQTTClient/MQTTDecoder.h | 1 - .../MQTTClient/MQTTInMemoryPersistence.h | 1 - .../Pods/Headers/Public/MQTTClient/MQTTLog.h | 1 - .../Headers/Public/MQTTClient/MQTTMessage.h | 1 - .../Public/MQTTClient/MQTTPersistence.h | 1 - .../Public/MQTTClient/MQTTProperties.h | 1 - .../Public/MQTTClient/MQTTSSLSecurityPolicy.h | 1 - .../MQTTClient/MQTTSSLSecurityPolicyDecoder.h | 1 - .../MQTTClient/MQTTSSLSecurityPolicyEncoder.h | 1 - .../MQTTSSLSecurityPolicyTransport.h | 1 - .../Headers/Public/MQTTClient/MQTTSession.h | 1 - .../Public/MQTTClient/MQTTSessionLegacy.h | 1 - .../Public/MQTTClient/MQTTSessionManager.h | 1 - .../Public/MQTTClient/MQTTSessionSynchron.h | 1 - .../Headers/Public/MQTTClient/MQTTStrict.h | 1 - .../Headers/Public/MQTTClient/MQTTTransport.h | 1 - .../Public/MQTTClient/ReconnectTimer.h | 1 - ios/RCTMqtt/Pods/MQTTClient/LICENSE | 230 --- .../MQTTClient/ForegroundReconnection.h | 23 - .../MQTTClient/ForegroundReconnection.m | 83 - .../MQTTClient/MQTTClient/GCDTimer.h | 19 - .../MQTTClient/MQTTClient/GCDTimer.m | 59 - .../MQTTClient/MQTTCFSocketDecoder.h | 39 - .../MQTTClient/MQTTCFSocketDecoder.m | 90 - .../MQTTClient/MQTTCFSocketEncoder.h | 38 - .../MQTTClient/MQTTCFSocketEncoder.m | 115 -- .../MQTTClient/MQTTCFSocketTransport.h | 79 - .../MQTTClient/MQTTCFSocketTransport.m | 237 --- .../MQTTClient/MQTTClient/MQTTClient.h | 39 - .../MQTTClient/MQTTCoreDataPersistence.h | 21 - .../MQTTClient/MQTTCoreDataPersistence.m | 513 ------ .../MQTTClient/MQTTClient/MQTTDecoder.h | 66 - .../MQTTClient/MQTTClient/MQTTDecoder.m | 215 --- .../MQTTClient/MQTTInMemoryPersistence.h | 16 - .../MQTTClient/MQTTInMemoryPersistence.m | 180 -- .../MQTTClient/MQTTClient/MQTTLog.h | 123 -- .../MQTTClient/MQTTClient/MQTTLog.m | 27 - .../MQTTClient/MQTTClient/MQTTMessage.h | 233 --- .../MQTTClient/MQTTClient/MQTTMessage.m | 762 -------- .../MQTTClient/MQTTClient/MQTTPersistence.h | 124 -- .../MQTTClient/MQTTClient/MQTTProperties.h | 76 - .../MQTTClient/MQTTClient/MQTTProperties.m | 336 ---- .../MQTTClient/MQTTSSLSecurityPolicy.h | 158 -- .../MQTTClient/MQTTSSLSecurityPolicy.m | 297 --- .../MQTTClient/MQTTSSLSecurityPolicyDecoder.h | 19 - .../MQTTClient/MQTTSSLSecurityPolicyDecoder.m | 60 - .../MQTTClient/MQTTSSLSecurityPolicyEncoder.h | 18 - .../MQTTClient/MQTTSSLSecurityPolicyEncoder.m | 60 - .../MQTTSSLSecurityPolicyTransport.h | 30 - .../MQTTSSLSecurityPolicyTransport.m | 98 - .../MQTTClient/MQTTClient/MQTTSession.h | 886 --------- .../MQTTClient/MQTTClient/MQTTSession.m | 1641 ----------------- .../MQTTClient/MQTTClient/MQTTSessionLegacy.h | 112 -- .../MQTTClient/MQTTClient/MQTTSessionLegacy.m | 86 - .../MQTTClient/MQTTSessionManager.h | 237 --- .../MQTTClient/MQTTSessionManager.m | 420 ----- .../MQTTClient/MQTTSessionSynchron.h | 194 -- .../MQTTClient/MQTTSessionSynchron.m | 192 -- .../MQTTClient/MQTTClient/MQTTStrict.h | 33 - .../MQTTClient/MQTTClient/MQTTStrict.m | 22 - .../MQTTClient/MQTTClient/MQTTTransport.h | 114 -- .../MQTTClient/MQTTClient/MQTTTransport.m | 40 - .../MQTTClient/MQTTClient/ReconnectTimer.h | 21 - .../MQTTClient/MQTTClient/ReconnectTimer.m | 67 - ios/RCTMqtt/Pods/MQTTClient/README.md | 153 -- ios/RCTMqtt/Pods/Manifest.lock | 23 - .../Pods/Pods.xcodeproj/project.pbxproj | 696 ------- .../MQTTClient/MQTTClient-dummy.m | 5 - .../MQTTClient/MQTTClient-prefix.pch | 12 - .../MQTTClient/MQTTClient.xcconfig | 9 - .../Pods-RCTMqtt-acknowledgements.markdown | 237 --- .../Pods-RCTMqtt-acknowledgements.plist | 269 --- .../Pods-RCTMqtt/Pods-RCTMqtt-dummy.m | 5 - .../Pods-RCTMqtt/Pods-RCTMqtt-resources.sh | 118 -- .../Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig | 9 - .../Pods-RCTMqtt.release.xcconfig | 9 - .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - package.json | 6 +- 118 files changed, 4 insertions(+), 10290 deletions(-) rename ios/{RCTMqtt => }/Mqtt.h (100%) rename ios/{RCTMqtt => }/Mqtt.m (100%) rename ios/{RCTMqtt => }/RCTMqtt.h (100%) rename ios/{RCTMqtt => }/RCTMqtt.m (100%) rename ios/{RCTMqtt => }/RCTMqtt.xcodeproj/project.pbxproj (68%) delete mode 100644 ios/RCTMqtt/Podfile delete mode 100644 ios/RCTMqtt/Podfile.lock delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ForegroundReconnection.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/GCDTimer.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketEncoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTClient.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCoreDataPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTInMemoryPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTLog.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTMessage.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTProperties.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicy.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyEncoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSession.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionLegacy.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionManager.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionSynchron.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTStrict.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ReconnectTimer.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ForegroundReconnection.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/GCDTimer.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketEncoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTClient.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCoreDataPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTInMemoryPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTLog.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTMessage.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTPersistence.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTProperties.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicy.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyDecoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyEncoder.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSession.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionLegacy.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionManager.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionSynchron.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTStrict.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTTransport.h delete mode 120000 ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ReconnectTimer.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/LICENSE delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h delete mode 100755 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h delete mode 100755 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m delete mode 100644 ios/RCTMqtt/Pods/MQTTClient/README.md delete mode 100644 ios/RCTMqtt/Pods/Manifest.lock delete mode 100644 ios/RCTMqtt/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.markdown delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.plist delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-dummy.m delete mode 100755 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-resources.sh delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig delete mode 100644 ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.release.xcconfig delete mode 100644 ios/RCTMqtt/RCTMqtt.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/RCTMqtt/RCTMqtt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/README.md b/README.md index 7b05986..36f0506 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ yarn add rusfearuth/react-native-mqtt - Go to `node_modules` ➜ `react-native-mqtt` and add `RCTMqtt.xcodeproj` - In XCode, in the project navigator, select your project. Add `libRCTmqtt.a` and `libicucore.tbd` to your project's `Build Phases` ➜ `Link Binary With Libraries` - Click `RCTMqtt.xcodeproj` in the project navigator and go the `Build Settings` tab. Make sure 'All' is toggled on (instead of 'Basic'). In the `Search Paths` section, look for `Header Search Paths` and make sure it contains both `$(SRCROOT)/../../react-native/React` - mark as `recursive`. +Add `pod 'MQTTClient'` to your podfile and `pod install` - Run your project (`Cmd+R`) diff --git a/ios/RCTMqtt/Mqtt.h b/ios/Mqtt.h similarity index 100% rename from ios/RCTMqtt/Mqtt.h rename to ios/Mqtt.h diff --git a/ios/RCTMqtt/Mqtt.m b/ios/Mqtt.m similarity index 100% rename from ios/RCTMqtt/Mqtt.m rename to ios/Mqtt.m diff --git a/ios/RCTMqtt/RCTMqtt.h b/ios/RCTMqtt.h similarity index 100% rename from ios/RCTMqtt/RCTMqtt.h rename to ios/RCTMqtt.h diff --git a/ios/RCTMqtt/RCTMqtt.m b/ios/RCTMqtt.m similarity index 100% rename from ios/RCTMqtt/RCTMqtt.m rename to ios/RCTMqtt.m diff --git a/ios/RCTMqtt/RCTMqtt.xcodeproj/project.pbxproj b/ios/RCTMqtt.xcodeproj/project.pbxproj similarity index 68% rename from ios/RCTMqtt/RCTMqtt.xcodeproj/project.pbxproj rename to ios/RCTMqtt.xcodeproj/project.pbxproj index 01e2e11..633ae6c 100644 --- a/ios/RCTMqtt/RCTMqtt.xcodeproj/project.pbxproj +++ b/ios/RCTMqtt.xcodeproj/project.pbxproj @@ -7,37 +7,10 @@ objects = { /* Begin PBXBuildFile section */ - A841BE22E98C6742FF425184 /* libPods-RCTMqtt.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B55C262163796F269BAA3909 /* libPods-RCTMqtt.a */; }; D20012C61E4FA06500CE2854 /* Mqtt.m in Sources */ = {isa = PBXBuildFile; fileRef = D20012C51E4FA06500CE2854 /* Mqtt.m */; }; - D22753771E4FC1C1009AB3F8 /* libSocketRocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D22753761E4FC1C1009AB3F8 /* libSocketRocket.a */; }; - D2F42A421E4FBD7C00343251 /* libMQTTClient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D218D27B1E4F7EE2000D8F51 /* libMQTTClient.a */; }; FF7A9D4E1C64788B006743BA /* RCTMqtt.m in Sources */ = {isa = PBXBuildFile; fileRef = FF7A9D4C1C64788B006743BA /* RCTMqtt.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - D218D27A1E4F7EE2000D8F51 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 318E89590A5684E53EC2C67636F92021; - remoteInfo = MQTTClient; - }; - D218D27C1E4F7EE2000D8F51 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = B970A7F185BF945A74ADFEE2441A7F5B; - remoteInfo = "Pods-RCTMqtt"; - }; - D22753751E4FC1C1009AB3F8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 8BA2FB05B17409076B33A55A70DFB4CC; - remoteInfo = SocketRocket; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ FF7A9D3E1C64785B006743BA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -51,12 +24,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 4249D0004A04076D92547DD0 /* Pods-RCTMqtt.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RCTMqtt.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig"; sourceTree = ""; }; - 65867FF64EF615F5B1FF81B0 /* Pods-RCTMqtt.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RCTMqtt.release.xcconfig"; path = "Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.release.xcconfig"; sourceTree = ""; }; - B55C262163796F269BAA3909 /* libPods-RCTMqtt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RCTMqtt.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D20012C41E4FA06500CE2854 /* Mqtt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Mqtt.h; sourceTree = ""; }; D20012C51E4FA06500CE2854 /* Mqtt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Mqtt.m; sourceTree = ""; }; - D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Pods.xcodeproj; path = Pods/Pods.xcodeproj; sourceTree = ""; }; FF7A9D401C64785B006743BA /* libRCTMqtt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRCTMqtt.a; sourceTree = BUILT_PRODUCTS_DIR; }; FF7A9D4C1C64788B006743BA /* RCTMqtt.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTMqtt.m; sourceTree = ""; }; FF7A9D4D1C64788B006743BA /* RCTMqtt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTMqtt.h; sourceTree = ""; }; @@ -67,42 +36,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D22753771E4FC1C1009AB3F8 /* libSocketRocket.a in Frameworks */, - D2F42A421E4FBD7C00343251 /* libMQTTClient.a in Frameworks */, - A841BE22E98C6742FF425184 /* libPods-RCTMqtt.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 1EA4FFB6633E7E226B726A7B /* Frameworks */ = { - isa = PBXGroup; - children = ( - B55C262163796F269BAA3909 /* libPods-RCTMqtt.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 38EFACF7AB6D9C9C3D24BDCB /* Pods */ = { - isa = PBXGroup; - children = ( - 4249D0004A04076D92547DD0 /* Pods-RCTMqtt.debug.xcconfig */, - 65867FF64EF615F5B1FF81B0 /* Pods-RCTMqtt.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - D218D2751E4F7EE1000D8F51 /* Products */ = { - isa = PBXGroup; - children = ( - D218D27B1E4F7EE2000D8F51 /* libMQTTClient.a */, - D218D27D1E4F7EE2000D8F51 /* libPods-RCTMqtt.a */, - D22753761E4FC1C1009AB3F8 /* libSocketRocket.a */, - ); - name = Products; - sourceTree = ""; - }; FF7A9D371C64785B006743BA = { isa = PBXGroup; children = ( @@ -111,9 +50,6 @@ FF7A9D4C1C64788B006743BA /* RCTMqtt.m */, FF7A9D4D1C64788B006743BA /* RCTMqtt.h */, FF7A9D411C64785B006743BA /* Products */, - 38EFACF7AB6D9C9C3D24BDCB /* Pods */, - 1EA4FFB6633E7E226B726A7B /* Frameworks */, - D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */, ); sourceTree = ""; }; @@ -170,12 +106,6 @@ mainGroup = FF7A9D371C64785B006743BA; productRefGroup = FF7A9D411C64785B006743BA /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = D218D2751E4F7EE1000D8F51 /* Products */; - ProjectRef = D218D2741E4F7EE1000D8F51 /* Pods.xcodeproj */; - }, - ); projectRoot = ""; targets = ( FF7A9D3F1C64785B006743BA /* RCTMqtt */, @@ -183,30 +113,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - D218D27B1E4F7EE2000D8F51 /* libMQTTClient.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libMQTTClient.a; - remoteRef = D218D27A1E4F7EE2000D8F51 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - D218D27D1E4F7EE2000D8F51 /* libPods-RCTMqtt.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libPods-RCTMqtt.a"; - remoteRef = D218D27C1E4F7EE2000D8F51 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - D22753761E4FC1C1009AB3F8 /* libSocketRocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libSocketRocket.a; - remoteRef = D22753751E4FC1C1009AB3F8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXShellScriptBuildPhase section */ 8A2A2943DEA045B900795060 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -323,7 +229,6 @@ }; FF7A9D4A1C64785B006743BA /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4249D0004A04076D92547DD0 /* Pods-RCTMqtt.debug.xcconfig */; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -341,7 +246,6 @@ }; FF7A9D4B1C64785B006743BA /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 65867FF64EF615F5B1FF81B0 /* Pods-RCTMqtt.release.xcconfig */; buildSettings = { HEADER_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/RCTMqtt/Podfile b/ios/RCTMqtt/Podfile deleted file mode 100644 index dec030a..0000000 --- a/ios/RCTMqtt/Podfile +++ /dev/null @@ -1,9 +0,0 @@ -platform :ios, '8.0' - -inhibit_all_warnings! - -pod 'MQTTClient' - -target "RCTMqtt" do -end - diff --git a/ios/RCTMqtt/Podfile.lock b/ios/RCTMqtt/Podfile.lock deleted file mode 100644 index 5be5182..0000000 --- a/ios/RCTMqtt/Podfile.lock +++ /dev/null @@ -1,23 +0,0 @@ -PODS: - - MQTTClient (0.15.2): - - MQTTClient/Core (= 0.15.2) - - MQTTClient/Core (0.15.2): - - MQTTClient/Manager - - MQTTClient/Min - - MQTTClient/Manager (0.15.2): - - MQTTClient/Min - - MQTTClient/Min (0.15.2) - -DEPENDENCIES: - - MQTTClient - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - MQTTClient - -SPEC CHECKSUMS: - MQTTClient: 902c7bcac1501595f3d0b15178c7205b40331fb0 - -PODFILE CHECKSUM: e61f0901f7eb0b464089f1f9f5d404df37195e34 - -COCOAPODS: 1.5.3 diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ForegroundReconnection.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ForegroundReconnection.h deleted file mode 120000 index a0a6c10..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ForegroundReconnection.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/GCDTimer.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/GCDTimer.h deleted file mode 120000 index 0ba42f6..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/GCDTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/GCDTimer.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketDecoder.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketDecoder.h deleted file mode 120000 index 7d7b578..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketEncoder.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketEncoder.h deleted file mode 120000 index 2aa6b09..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketEncoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketTransport.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketTransport.h deleted file mode 120000 index f839863..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCFSocketTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTClient.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTClient.h deleted file mode 120000 index dfad495..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTClient.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTClient.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCoreDataPersistence.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCoreDataPersistence.h deleted file mode 120000 index d3050bc..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTCoreDataPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTDecoder.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTDecoder.h deleted file mode 120000 index 0706dfb..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTInMemoryPersistence.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTInMemoryPersistence.h deleted file mode 120000 index 637458f..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTInMemoryPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTLog.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTLog.h deleted file mode 120000 index d2c08d0..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTLog.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTLog.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTMessage.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTMessage.h deleted file mode 120000 index 4707641..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTPersistence.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTPersistence.h deleted file mode 120000 index 8c019f8..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTProperties.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTProperties.h deleted file mode 120000 index f826613..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTProperties.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicy.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicy.h deleted file mode 120000 index 2769067..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicy.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyDecoder.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyDecoder.h deleted file mode 120000 index 3b682b3..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyEncoder.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyEncoder.h deleted file mode 120000 index 23a7962..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyEncoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyTransport.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyTransport.h deleted file mode 120000 index 0cb5cf2..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSSLSecurityPolicyTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSession.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSession.h deleted file mode 120000 index d1b7f2a..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSession.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSession.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionLegacy.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionLegacy.h deleted file mode 120000 index 7113e0c..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionLegacy.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionManager.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionManager.h deleted file mode 120000 index 1d51286..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionSynchron.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionSynchron.h deleted file mode 120000 index 4a38e20..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTSessionSynchron.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTStrict.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTStrict.h deleted file mode 120000 index e45f52b..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTStrict.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTTransport.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTTransport.h deleted file mode 120000 index 951a8f1..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/MQTTTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ReconnectTimer.h b/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ReconnectTimer.h deleted file mode 120000 index 7ed005b..0000000 --- a/ios/RCTMqtt/Pods/Headers/Private/MQTTClient/ReconnectTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ForegroundReconnection.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ForegroundReconnection.h deleted file mode 120000 index a0a6c10..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ForegroundReconnection.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/GCDTimer.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/GCDTimer.h deleted file mode 120000 index 0ba42f6..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/GCDTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/GCDTimer.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketDecoder.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketDecoder.h deleted file mode 120000 index 7d7b578..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketEncoder.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketEncoder.h deleted file mode 120000 index 2aa6b09..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketEncoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketTransport.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketTransport.h deleted file mode 120000 index f839863..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCFSocketTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTClient.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTClient.h deleted file mode 120000 index dfad495..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTClient.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTClient.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCoreDataPersistence.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCoreDataPersistence.h deleted file mode 120000 index d3050bc..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTCoreDataPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTDecoder.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTDecoder.h deleted file mode 120000 index 0706dfb..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTInMemoryPersistence.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTInMemoryPersistence.h deleted file mode 120000 index 637458f..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTInMemoryPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTLog.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTLog.h deleted file mode 120000 index d2c08d0..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTLog.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTLog.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTMessage.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTMessage.h deleted file mode 120000 index 4707641..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTMessage.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTPersistence.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTPersistence.h deleted file mode 120000 index 8c019f8..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTPersistence.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTProperties.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTProperties.h deleted file mode 120000 index f826613..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTProperties.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicy.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicy.h deleted file mode 120000 index 2769067..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicy.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyDecoder.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyDecoder.h deleted file mode 120000 index 3b682b3..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyDecoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyEncoder.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyEncoder.h deleted file mode 120000 index 23a7962..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyEncoder.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyTransport.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyTransport.h deleted file mode 120000 index 0cb5cf2..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSSLSecurityPolicyTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSession.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSession.h deleted file mode 120000 index d1b7f2a..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSession.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSession.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionLegacy.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionLegacy.h deleted file mode 120000 index 7113e0c..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionLegacy.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionManager.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionManager.h deleted file mode 120000 index 1d51286..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionManager.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionSynchron.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionSynchron.h deleted file mode 120000 index 4a38e20..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTSessionSynchron.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTStrict.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTStrict.h deleted file mode 120000 index e45f52b..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTStrict.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTTransport.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTTransport.h deleted file mode 120000 index 951a8f1..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/MQTTTransport.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ReconnectTimer.h b/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ReconnectTimer.h deleted file mode 120000 index 7ed005b..0000000 --- a/ios/RCTMqtt/Pods/Headers/Public/MQTTClient/ReconnectTimer.h +++ /dev/null @@ -1 +0,0 @@ -../../../MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/MQTTClient/LICENSE b/ios/RCTMqtt/Pods/MQTTClient/LICENSE deleted file mode 100644 index dbc2477..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/LICENSE +++ /dev/null @@ -1,230 +0,0 @@ -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' - from a Contributor if it was added to the Program by such Contributor - itself or anyone acting on such Contributor's behalf. Contributions do not - include additions to the Program which: (i) are separate modules of - software distributed in conjunction with the Program under their own - license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly - perform, distribute and sublicense the Contribution of such Contributor, - if any, and such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of - the Contribution and the Program if, at the time the Contribution is - added by the Contributor, such addition of the Contribution causes such - combination to be covered by the Licensed Patents. The patent license - shall not apply to any other combinations which include the Contribution. - No hardware per se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses - to its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other - entity based on infringement of intellectual property rights or - otherwise. As a condition to exercising the rights and licenses granted - hereunder, each Recipient hereby assumes sole responsibility to secure - any other intellectual property rights needed, if any. For example, if a - third party patent license is required to allow Recipient to distribute - the Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained - within the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, -if a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits and -other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such Commercial -Contributor in connection with its distribution of the Program in a commercial -product offering. The obligations in this section do not apply to any claims -or Losses relating to any actual or alleged intellectual property -infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor to control, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim at -its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using -and distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to the -risks and costs of program errors, compliance with applicable laws, damage to -or loss of data, programs or equipment, and unavailability or interruption of -operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue -and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of the -Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this Agreement, -whether expressly, by implication, estoppel or otherwise. All rights in the -Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - -Copyright (c) 2013-2015 Christoph Krey - -Based on - -https://github.com/m2mIO/mqttIO-objC - -Copyright © 2011, 2013 2lemetry, LLC - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -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. - -THIS 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. - - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h deleted file mode 100644 index d9bc277..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// ForegroundReconnection.h -// MQTTClient -// -// Created by Josip Cavar on 22/08/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import - -#if TARGET_OS_IPHONE == 1 - -@class MQTTSessionManager; - -@interface ForegroundReconnection : NSObject - -@property (weak, nonatomic) MQTTSessionManager *sessionManager; - -- (instancetype)initWithMQTTSessionManager:(MQTTSessionManager *)manager; - -@end - -#endif diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m deleted file mode 100644 index ff5a097..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// ForegroundReconnection.m -// MQTTClient -// -// Created by Josip Cavar on 22/08/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import "ForegroundReconnection.h" - -#if TARGET_OS_IPHONE == 1 -#import "MQTTSessionManager.h" -#import -@interface ForegroundReconnection () - -@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; - -@end - -@implementation ForegroundReconnection - -- (instancetype)initWithMQTTSessionManager:(MQTTSessionManager *)manager { - self = [super init]; - self.sessionManager = manager; - self.backgroundTask = UIBackgroundTaskInvalid; - - NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - - [defaultCenter addObserver:self - selector:@selector(appWillResignActive) - name:UIApplicationWillResignActiveNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(appDidEnterBackground) - name:UIApplicationDidEnterBackgroundNotification - object:nil]; - - [defaultCenter addObserver:self - selector:@selector(appDidBecomeActive) - name:UIApplicationDidBecomeActiveNotification - object:nil]; - return self; -} - -- (void)dealloc { - NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; - [defaultCenter removeObserver:self name:UIApplicationWillResignActiveNotification object:nil]; - [defaultCenter removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; - [defaultCenter removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; -} - -- (void)appWillResignActive { - [self.sessionManager disconnectWithDisconnectHandler:nil]; -} - -- (void)appDidEnterBackground { - if (!self.sessionManager.requiresTearDown) { - // we don't want to tear down session as it's already closed - return; - } - - __weak typeof(self) weakSelf = self; - self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - __strong typeof(weakSelf) strongSelf = weakSelf; - [strongSelf endBackgroundTask]; - }]; -} - -- (void)appDidBecomeActive { - [self.sessionManager connectToLast:nil]; -} - -- (void)endBackgroundTask { - if (self.backgroundTask) { - [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; - self.backgroundTask = UIBackgroundTaskInvalid; - } -} - -@end - -#endif diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h deleted file mode 100644 index 23cfbb3..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Timer.h -// MQTTClient -// -// Created by Josip Cavar on 06/11/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import - -@interface GCDTimer: NSObject - -+ (GCDTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval - repeats:(BOOL)repeats - queue:(dispatch_queue_t)queue - block:(void (^)(void))block; -- (void)invalidate; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m deleted file mode 100644 index 3b72b7a..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m +++ /dev/null @@ -1,59 +0,0 @@ -// -// Timer.m -// MQTTClient -// -// Created by Josip Cavar on 06/11/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import "GCDTimer.h" - -@interface GCDTimer () - -@property (strong, nonatomic) dispatch_source_t timer; - -@end - -@implementation GCDTimer - -+ (GCDTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval - repeats:(BOOL)repeats - queue:(dispatch_queue_t)queue - block:(void (^)(void))block { - GCDTimer *timer = [[GCDTimer alloc] initWithInterval:interval - repeats:repeats - queue:queue - block:block]; - return timer; -} - -- (instancetype)initWithInterval:(NSTimeInterval)interval - repeats:(BOOL)repeats - queue:(dispatch_queue_t)queue - block:(void (^)(void))block { - self = [super init]; - if (self) { - self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); - dispatch_source_set_timer(self.timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, 0); - dispatch_source_set_event_handler(self.timer, ^{ - if (!repeats) { - dispatch_source_cancel(self.timer); - } - block(); - }); - dispatch_resume(self.timer); - } - return self; -} - -- (void)dealloc { - [self invalidate]; -} - -- (void)invalidate { - if (self.timer) { - dispatch_source_cancel(self.timer); - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h deleted file mode 100644 index 78843d0..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// MQTTCFSocketDecoder.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import - -typedef NS_ENUM(NSInteger, MQTTCFSocketDecoderState) { - MQTTCFSocketDecoderStateInitializing, - MQTTCFSocketDecoderStateReady, - MQTTCFSocketDecoderStateError -}; - -@class MQTTCFSocketDecoder; - -@protocol MQTTCFSocketDecoderDelegate - -- (void)decoder:(MQTTCFSocketDecoder *)sender didReceiveMessage:(NSData *)data; -- (void)decoderDidOpen:(MQTTCFSocketDecoder *)sender; -- (void)decoder:(MQTTCFSocketDecoder *)sender didFailWithError:(NSError *)error; -- (void)decoderdidClose:(MQTTCFSocketDecoder *)sender; - -@end - -@interface MQTTCFSocketDecoder : NSObject - -@property (nonatomic) MQTTCFSocketDecoderState state; -@property (strong, nonatomic) NSError *error; -@property (strong, nonatomic) NSInputStream *stream; -@property (weak, nonatomic ) id delegate; - -- (void)open; -- (void)close; - -@end - - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m deleted file mode 100644 index e7a65e7..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m +++ /dev/null @@ -1,90 +0,0 @@ -// -// MQTTCFSocketDecoder.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import "MQTTCFSocketDecoder.h" - -#import "MQTTLog.h" - -@interface MQTTCFSocketDecoder() - -@end - -@implementation MQTTCFSocketDecoder - -- (instancetype)init { - self = [super init]; - self.state = MQTTCFSocketDecoderStateInitializing; - - self.stream = nil; - return self; -} - -- (void)open { - if (self.state == MQTTCFSocketDecoderStateInitializing) { - (self.stream).delegate = self; - [self.stream open]; - } -} - -- (void)dealloc { - [self close]; -} - -- (void)close { - [self.stream close]; - [self.stream setDelegate:nil]; -} - -- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { - if (eventCode & NSStreamEventOpenCompleted) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventOpenCompleted"); - self.state = MQTTCFSocketDecoderStateReady; - [self.delegate decoderDidOpen:self]; - } - - if (eventCode & NSStreamEventHasBytesAvailable) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); - if (self.state == MQTTCFSocketDecoderStateInitializing) { - self.state = MQTTCFSocketDecoderStateReady; - } - - if (self.state == MQTTCFSocketDecoderStateReady) { - NSInteger n; - UInt8 buffer[768]; - - n = [self.stream read:buffer maxLength:sizeof(buffer)]; - if (n == -1) { - self.state = MQTTCFSocketDecoderStateError; - [self.delegate decoder:self didFailWithError:nil]; - } else { - NSData *data = [NSData dataWithBytes:buffer length:n]; - DDLogVerbose(@"[MQTTCFSocketDecoder] received (%lu)=%@...", (unsigned long)data.length, - [data subdataWithRange:NSMakeRange(0, MIN(256, data.length))]); - [self.delegate decoder:self didReceiveMessage:data]; - } - } - } - if (eventCode & NSStreamEventHasSpaceAvailable) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasSpaceAvailable"); - } - - if (eventCode & NSStreamEventEndEncountered) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventEndEncountered"); - self.state = MQTTCFSocketDecoderStateInitializing; - self.error = nil; - [self.delegate decoderdidClose:self]; - } - - if (eventCode & NSStreamEventErrorOccurred) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventErrorOccurred"); - self.state = MQTTCFSocketDecoderStateError; - self.error = self.stream.streamError; - [self.delegate decoder:self didFailWithError:self.error]; - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h deleted file mode 100644 index eccdfee..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// MQTTCFSocketEncoder.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import - -typedef NS_ENUM(NSInteger, MQTTCFSocketEncoderState) { - MQTTCFSocketEncoderStateInitializing, - MQTTCFSocketEncoderStateReady, - MQTTCFSocketEncoderStateError -}; - -@class MQTTCFSocketEncoder; - -@protocol MQTTCFSocketEncoderDelegate - -- (void)encoderDidOpen:(MQTTCFSocketEncoder *)sender; -- (void)encoder:(MQTTCFSocketEncoder *)sender didFailWithError:(NSError *)error; -- (void)encoderdidClose:(MQTTCFSocketEncoder *)sender; - -@end - -@interface MQTTCFSocketEncoder : NSObject - -@property (nonatomic) MQTTCFSocketEncoderState state; -@property (strong, nonatomic) NSError *error; -@property (strong, nonatomic) NSOutputStream *stream; -@property (weak, nonatomic ) id delegate; - -- (void)open; -- (void)close; -- (BOOL)send:(NSData *)data; - -@end - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m deleted file mode 100644 index bd715ad..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m +++ /dev/null @@ -1,115 +0,0 @@ -// -// MQTTCFSocketEncoder.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import "MQTTCFSocketEncoder.h" - -#import "MQTTLog.h" - -@interface MQTTCFSocketEncoder() - -@property (strong, nonatomic) NSMutableData *buffer; - -@end - -@implementation MQTTCFSocketEncoder - -- (instancetype)init { - self = [super init]; - self.state = MQTTCFSocketEncoderStateInitializing; - self.buffer = [[NSMutableData alloc] init]; - self.stream = nil; - return self; -} - -- (void)dealloc { - [self close]; -} - -- (void)open { - (self.stream).delegate = self; - [self.stream open]; -} - -- (void)close { - [self.stream close]; - [self.stream setDelegate:nil]; -} - -- (void)setState:(MQTTCFSocketEncoderState)state { - DDLogVerbose(@"[MQTTCFSocketEncoder] setState %ld/%ld", (long)_state, (long)state); - _state = state; -} - -- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { - if (eventCode & NSStreamEventOpenCompleted) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventOpenCompleted"); - } - if (eventCode & NSStreamEventHasBytesAvailable) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasBytesAvailable"); - } - if (eventCode & NSStreamEventHasSpaceAvailable) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasSpaceAvailable"); - if (self.state == MQTTCFSocketEncoderStateInitializing) { - self.state = MQTTCFSocketEncoderStateReady; - [self.delegate encoderDidOpen:self]; - } - - if (self.state == MQTTCFSocketEncoderStateReady) { - if (self.buffer.length) { - [self send:nil]; - } - } - } - if (eventCode & NSStreamEventEndEncountered) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventEndEncountered"); - self.state = MQTTCFSocketEncoderStateInitializing; - self.error = nil; - [self.delegate encoderdidClose:self]; - } - if (eventCode & NSStreamEventErrorOccurred) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventErrorOccurred"); - self.state = MQTTCFSocketEncoderStateError; - self.error = self.stream.streamError; - [self.delegate encoder:self didFailWithError:self.error]; - } -} - -- (BOOL)send:(NSData *)data { - @synchronized(self) { - if (self.state != MQTTCFSocketEncoderStateReady) { - DDLogInfo(@"[MQTTCFSocketEncoder] not MQTTCFSocketEncoderStateReady"); - return NO; - } - - if (data) { - [self.buffer appendData:data]; - } - - if (self.buffer.length) { - DDLogVerbose(@"[MQTTCFSocketEncoder] buffer to write (%lu)=%@...", - (unsigned long)self.buffer.length, - [self.buffer subdataWithRange:NSMakeRange(0, MIN(256, self.buffer.length))]); - - NSInteger n = [self.stream write:self.buffer.bytes maxLength:self.buffer.length]; - - if (n == -1) { - DDLogVerbose(@"[MQTTCFSocketEncoder] streamError: %@", self.error); - self.state = MQTTCFSocketEncoderStateError; - self.error = self.stream.streamError; - return NO; - } else { - if (n < self.buffer.length) { - DDLogVerbose(@"[MQTTCFSocketEncoder] buffer partially written: %ld", (long)n); - } - [self.buffer replaceBytesInRange:NSMakeRange(0, n) withBytes:NULL length:0]; - } - } - return YES; - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h deleted file mode 100644 index 6b73904..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h +++ /dev/null @@ -1,79 +0,0 @@ -// -// MQTTCFSocketTransport.h -// MQTTClient -// -// Created by Christoph Krey on 06.12.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTTransport.h" -#import "MQTTCFSocketDecoder.h" -#import "MQTTCFSocketEncoder.h" - -/** MQTTCFSocketTransport - * implements an MQTTTransport on top of CFNetwork - */ -@interface MQTTCFSocketTransport : MQTTTransport - -/** streamSSLLevel an NSString containing the security level for read and write streams - * For list of possible values see: - * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants - * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list - * and cannot be used as constant, but you can use it as a string value - * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL - */ -@property (strong, nonatomic) NSString *streamSSLLevel; - -/** host an NSString containing the hostName or IP address of the host to connect to - * defaults to @"localhost" - */ -@property (strong, nonatomic) NSString *host; - -/** port an unsigned 32 bit integer containing the IP port number to connect to - * defaults to 1883 - */ -@property (nonatomic) UInt32 port; - -/** tls a boolean indicating whether the transport should be using security - * defaults to NO - */ -@property (nonatomic) BOOL tls; - -/** Require for VoIP background service - * defaults to NO - */ -@property (nonatomic) BOOL voip; - -/** certificates An identity certificate used to reply to a server requiring client certificates according - * to the description given for SSLSetCertificate(). You may build the certificates array yourself or use the - * sundry method clientCertFromP12. - */ -@property (strong, nonatomic) NSArray *certificates; - -/** reads the content of a PKCS12 file and converts it to an certificates array for initWith... - @param path the path to a PKCS12 file - @param passphrase the passphrase to unlock the PKCS12 file - @returns a certificates array or nil if an error occured - - @code - NSString *path = [[NSBundle bundleForClass:[MQTTClientTests class]] pathForResource:@"filename" - ofType:@"p12"]; - - NSArray *myCerts = [MQTTCFSocketTransport clientCertsFromP12:path passphrase:@"passphrase"]; - if (myCerts) { - - self.session = [[MQTTSession alloc] init]; - ... - self.session.certificates = myCerts; - - [self.session connect]; - ... - } - - @endcode - - */ - -+ (NSArray *)clientCertsFromP12:(NSString *)path passphrase:(NSString *)passphrase; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m deleted file mode 100644 index 63a86b0..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m +++ /dev/null @@ -1,237 +0,0 @@ -// -// MQTTCFSocketTransport.m -// MQTTClient -// -// Created by Christoph Krey on 06.12.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTCFSocketTransport.h" - -#import "MQTTLog.h" - -@interface MQTTCFSocketTransport() { - void *QueueIdentityKey; -} - -@property (strong, nonatomic) MQTTCFSocketEncoder *encoder; -@property (strong, nonatomic) MQTTCFSocketDecoder *decoder; - -@end - -@implementation MQTTCFSocketTransport - -@synthesize state; -@synthesize delegate; -@synthesize queue = _queue; -@synthesize streamSSLLevel; -@synthesize host; -@synthesize port; - -- (instancetype)init { - self = [super init]; - self.host = @"localhost"; - self.port = 1883; - self.tls = false; - self.voip = false; - self.certificates = nil; - self.queue = dispatch_get_main_queue(); - self.streamSSLLevel = (NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL; - return self; -} - -- (void)dealloc { - [self close]; -} - -- (void)setQueue:(dispatch_queue_t)queue { - _queue = queue; - - // We're going to use dispatch_queue_set_specific() to "mark" our queue. - // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. - // Later we can use dispatch_get_specific() to determine if we're executing on our queue. - // From the documentation: - // - // > Keys are only compared as pointers and are never dereferenced. - // > Thus, you can use a pointer to a static variable for a specific subsystem or - // > any other value that allows you to identify the value uniquely. - // - // So we're just going to use the memory address of an ivar. - - dispatch_queue_set_specific(_queue, &QueueIdentityKey, (__bridge void *)_queue, NULL); -} - -- (void)open { - DDLogVerbose(@"[MQTTCFSocketTransport] open"); - self.state = MQTTTransportOpening; - - NSError* connectError; - - CFReadStreamRef readStream; - CFWriteStreamRef writeStream; - - CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.host, self.port, &readStream, &writeStream); - - CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); - CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); - - if (self.tls) { - NSMutableDictionary *sslOptions = [[NSMutableDictionary alloc] init]; - - sslOptions[(NSString *)kCFStreamSSLLevel] = self.streamSSLLevel; - - if (self.certificates) { - sslOptions[(NSString *)kCFStreamSSLCertificates] = self.certificates; - } - - if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))) { - connectError = [NSError errorWithDomain:@"MQTT" - code:errSSLInternal - userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl input stream!"}]; - } - if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))) { - connectError = [NSError errorWithDomain:@"MQTT" - code:errSSLInternal - userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl output stream!"}]; - } - } - - if (!connectError) { - self.encoder.delegate = nil; - self.encoder = [[MQTTCFSocketEncoder alloc] init]; - CFWriteStreamSetDispatchQueue(writeStream, self.queue); - self.encoder.stream = CFBridgingRelease(writeStream); - self.encoder.delegate = self; - if (self.voip) { - [self.encoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; - } - [self.encoder open]; - - self.decoder.delegate = nil; - self.decoder = [[MQTTCFSocketDecoder alloc] init]; - CFReadStreamSetDispatchQueue(readStream, self.queue); - self.decoder.stream = CFBridgingRelease(readStream); - self.decoder.delegate = self; - if (self.voip) { - [self.decoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; - } - [self.decoder open]; - } else { - [self close]; - } -} - -- (void)close { - // https://github.com/novastone-media/MQTT-Client-Framework/issues/325 - // We need to make sure that we are closing streams on their queue - // Otherwise, we end up with race condition where delegate is deallocated - // but still used by run loop event - if (self.queue != dispatch_get_specific(&QueueIdentityKey)) { - dispatch_sync(self.queue, ^{ - [self internalClose]; - }); - } else { - [self internalClose]; - } -} - -- (void)internalClose { - DDLogVerbose(@"[MQTTCFSocketTransport] close"); - self.state = MQTTTransportClosing; - - if (self.encoder) { - [self.encoder close]; - self.encoder.delegate = nil; - } - - if (self.decoder) { - [self.decoder close]; - self.decoder.delegate = nil; - } -} - -- (BOOL)send:(nonnull NSData *)data { - return [self.encoder send:data]; -} - -- (void)decoder:(MQTTCFSocketDecoder *)sender didReceiveMessage:(nonnull NSData *)data { - [self.delegate mqttTransport:self didReceiveMessage:data]; -} - -- (void)decoder:(MQTTCFSocketDecoder *)sender didFailWithError:(NSError *)error { - //self.state = MQTTTransportClosing; - //[self.delegate mqttTransport:self didFailWithError:error]; -} -- (void)encoder:(MQTTCFSocketEncoder *)sender didFailWithError:(NSError *)error { - self.state = MQTTTransportClosing; - [self.delegate mqttTransport:self didFailWithError:error]; -} - -- (void)decoderdidClose:(MQTTCFSocketDecoder *)sender { - self.state = MQTTTransportClosed; - [self.delegate mqttTransportDidClose:self]; -} -- (void)encoderdidClose:(MQTTCFSocketEncoder *)sender { - //self.state = MQTTTransportClosed; - //[self.delegate mqttTransportDidClose:self]; -} - -- (void)decoderDidOpen:(MQTTCFSocketDecoder *)sender { - //self.state = MQTTTransportOpen; - //[self.delegate mqttTransportDidOpen:self]; -} -- (void)encoderDidOpen:(MQTTCFSocketEncoder *)sender { - self.state = MQTTTransportOpen; - [self.delegate mqttTransportDidOpen:self]; -} - -+ (NSArray *)clientCertsFromP12:(NSString *)path passphrase:(NSString *)passphrase { - if (!path) { - DDLogWarn(@"[MQTTCFSocketTransport] no p12 path given"); - return nil; - } - - NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:path]; - if (!pkcs12data) { - DDLogWarn(@"[MQTTCFSocketTransport] reading p12 failed"); - return nil; - } - - if (!passphrase) { - DDLogWarn(@"[MQTTCFSocketTransport] no passphrase given"); - return nil; - } - CFArrayRef keyref = NULL; - OSStatus importStatus = SecPKCS12Import((__bridge CFDataRef)pkcs12data, - (__bridge CFDictionaryRef)@{(__bridge id)kSecImportExportPassphrase: passphrase}, - &keyref); - if (importStatus != noErr) { - DDLogWarn(@"[MQTTCFSocketTransport] Error while importing pkcs12 [%d]", (int)importStatus); - return nil; - } - - CFDictionaryRef identityDict = CFArrayGetValueAtIndex(keyref, 0); - if (!identityDict) { - DDLogWarn(@"[MQTTCFSocketTransport] could not CFArrayGetValueAtIndex"); - return nil; - } - - SecIdentityRef identityRef = (SecIdentityRef)CFDictionaryGetValue(identityDict, - kSecImportItemIdentity); - if (!identityRef) { - DDLogWarn(@"[MQTTCFSocketTransport] could not CFDictionaryGetValue"); - return nil; - }; - - SecCertificateRef cert = NULL; - OSStatus status = SecIdentityCopyCertificate(identityRef, &cert); - if (status != noErr) { - DDLogWarn(@"[MQTTCFSocketTransport] SecIdentityCopyCertificate failed [%d]", (int)status); - return nil; - } - - NSArray *clientCerts = @[(__bridge id)identityRef, (__bridge id)cert]; - return clientCerts; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h deleted file mode 100644 index 1eb28dc..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// MQTTClient.h -// MQTTClient -// -// Created by Christoph Krey on 13.01.14. -// Copyright © 2013-2017 Christoph Krey. All rights reserved. -// - -/** - Include this file to use MQTTClient classes in your application - - @author Christoph Krey c@ckrey.de - @see http://mqtt.org - */ - -#import - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#if __has_include() -#import -#endif - -//! Project version number for MQTTClient. -FOUNDATION_EXPORT double MQTTClientVersionNumber; - -//! Project version string for MQTTClient<. -FOUNDATION_EXPORT const unsigned char MQTTClientVersionString[]; - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h deleted file mode 100644 index 9a35271..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// MQTTCoreDataPersistence.h -// MQTTClient -// -// Created by Christoph Krey on 22.03.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import -#import -#import "MQTTPersistence.h" - -@interface MQTTCoreDataPersistence : NSObject - -@end - -@interface MQTTFlow : NSManagedObject -@end - -@interface MQTTCoreDataFlow : NSObject -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m deleted file mode 100755 index 93354f9..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m +++ /dev/null @@ -1,513 +0,0 @@ -// -// MQTTCoreDataPersistence.m -// MQTTClient -// -// Created by Christoph Krey on 22.03.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTCoreDataPersistence.h" -#import "MQTTLog.h" - -@implementation MQTTFlow -@dynamic clientId; -@dynamic incomingFlag; -@dynamic retainedFlag; -@dynamic commandType; -@dynamic qosLevel; -@dynamic messageId; -@dynamic topic; -@dynamic data; -@dynamic deadline; - -@end - -@interface MQTTCoreDataFlow () - -- (MQTTCoreDataFlow *)initWithContext:(NSManagedObjectContext *)context andObject:(id)object; -@property NSManagedObjectContext *context; -@property id object; - -@end - -@implementation MQTTCoreDataFlow - -@synthesize context; -@synthesize object; - -- (MQTTCoreDataFlow *)initWithContext:(NSManagedObjectContext *)c andObject:(id)o { - self = [super init]; - self.context = c; - self.object = o; - return self; -} - -- (NSString *)clientId { - __block NSString *_clientId; - [context performBlockAndWait:^{ - _clientId = self.object.clientId; - }]; - return _clientId; -} - -- (void)setClientId:(NSString *)clientId { - [context performBlockAndWait:^{ - self.object.clientId = clientId; - }]; -} - -- (NSNumber *)incomingFlag { - __block NSNumber *_incomingFlag; - [context performBlockAndWait:^{ - _incomingFlag = self.object.incomingFlag; - }]; - return _incomingFlag; -} - -- (void)setIncomingFlag:(NSNumber *)incomingFlag { - [context performBlockAndWait:^{ - self.object.incomingFlag = incomingFlag; - }]; -} - - -- (NSNumber *)retainedFlag { - __block NSNumber *_retainedFlag; - [context performBlockAndWait:^{ - _retainedFlag = self.object.retainedFlag; - }]; - return _retainedFlag; -} - -- (void)setRetainedFlag:(NSNumber *)retainedFlag { - [context performBlockAndWait:^{ - self.object.retainedFlag = retainedFlag; - }]; -} - -- (NSNumber *)commandType { - __block NSNumber *_commandType; - [context performBlockAndWait:^{ - _commandType = self.object.commandType; - }]; - return _commandType; -} - -- (void)setCommandType:(NSNumber *)commandType { - [context performBlockAndWait:^{ - self.object.commandType = commandType; - }]; -} - -- (NSNumber *)qosLevel { - __block NSNumber *_qosLevel; - [context performBlockAndWait:^{ - _qosLevel = self.object.qosLevel; - }]; - return _qosLevel; -} - -- (void)setQosLevel:(NSNumber *)qosLevel { - [context performBlockAndWait:^{ - self.object.qosLevel = qosLevel; - }]; -} - -- (NSNumber *)messageId { - __block NSNumber *_messageId; - [context performBlockAndWait:^{ - _messageId = self.object.messageId; - }]; - return _messageId; -} - -- (void)setMessageId:(NSNumber *)messageId { - [context performBlockAndWait:^{ - self.object.messageId = messageId; - }]; -} - -- (NSString *)topic { - __block NSString *_topic; - [context performBlockAndWait:^{ - _topic = self.object.topic; - }]; - return _topic; -} - -- (void)setTopic:(NSString *)topic { - [context performBlockAndWait:^{ - self.object.topic = topic; - }]; -} - -- (NSData *)data { - __block NSData *_data; - [context performBlockAndWait:^{ - _data = self.object.data; - }]; - return _data; -} - -- (void)setData:(NSData *)data { - [context performBlockAndWait:^{ - self.object.data = data; - }]; -} - -- (NSDate *)deadline { - __block NSDate *_deadline; - [context performBlockAndWait:^{ - _deadline = self.object.deadline; - }]; - return _deadline; -} - -- (void)setDeadline:(NSDate *)deadline { - [context performBlockAndWait:^{ - self.object.deadline = deadline; - }]; -} - -@end - -@interface MQTTCoreDataPersistence () - -@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; -@property (assign, nonatomic) unsigned long long fileSize; -@property (assign, nonatomic) unsigned long long fileSystemFreeSize; - -@end - -@implementation MQTTCoreDataPersistence -@synthesize persistent; -@synthesize maxSize; -@synthesize maxMessages; -@synthesize maxWindowSize; - -- (MQTTCoreDataPersistence *)init { - self = [super init]; - self.persistent = MQTT_PERSISTENT; - self.maxSize = MQTT_MAX_SIZE; - self.maxMessages = MQTT_MAX_MESSAGES; - self.maxWindowSize = MQTT_MAX_WINDOW_SIZE; - - return self; -} - -- (NSManagedObjectContext *)managedObjectContext { - if (!_managedObjectContext) { - NSPersistentStoreCoordinator *coordinator = [self createPersistentStoreCoordinator]; - _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; - _managedObjectContext.persistentStoreCoordinator = coordinator; - } - return _managedObjectContext; -} - -- (NSUInteger)windowSize:(NSString *)clientId { - NSUInteger windowSize = 0; - NSArray *flows = [self allFlowsforClientId:clientId - incomingFlag:NO]; - for (MQTTCoreDataFlow *flow in flows) { - if ((flow.commandType).unsignedIntegerValue != MQTT_None) { - windowSize++; - } - } - return windowSize; -} - -- (MQTTCoreDataFlow *)storeMessageForClientId:(NSString *)clientId - topic:(NSString *)topic - data:(NSData *)data - retainFlag:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - msgId:(UInt16)msgId - incomingFlag:(BOOL)incomingFlag - commandType:(UInt8)commandType - deadline:(NSDate *)deadline { - if (([self allFlowsforClientId:clientId incomingFlag:incomingFlag].count <= self.maxMessages) && - (self.fileSize <= self.maxSize)) { - MQTTCoreDataFlow *flow = [self createFlowforClientId:clientId - incomingFlag:incomingFlag - messageId:msgId]; - flow.topic = topic; - flow.data = data; - flow.retainedFlag = @(retainFlag); - flow.qosLevel = @(qos); - flow.commandType = [NSNumber numberWithUnsignedInteger:commandType]; - flow.deadline = deadline; - return flow; - } else { - return nil; - } -} - -- (void)deleteFlow:(MQTTCoreDataFlow *)flow { - [self.managedObjectContext performBlockAndWait:^{ - [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; - }]; - [self sync]; -} - -- (void)deleteAllFlowsForClientId:(NSString *)clientId { - DDLogInfo(@"[MQTTCoreDataPersistence] deleteAllFlowsForClientId %@", clientId); - - [self.managedObjectContext performBlockAndWait:^{ - for (MQTTCoreDataFlow *flow in [self allFlowsforClientId:clientId incomingFlag:TRUE]) { - [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; - } - for (MQTTCoreDataFlow *flow in [self allFlowsforClientId:clientId incomingFlag:FALSE]) { - [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; - } - }]; - [self sync]; -} - -- (void)sync { - [self.managedObjectContext performBlockAndWait:^{ - [self internalSync]; - }]; -} - -- (void)internalSync { - if (self.managedObjectContext.hasChanges) { - DDLogVerbose(@"[MQTTPersistence] pre-sync: i%lu u%lu d%lu", - (unsigned long)self.managedObjectContext.insertedObjects.count, - (unsigned long)self.managedObjectContext.updatedObjects.count, - (unsigned long)self.managedObjectContext.deletedObjects.count - ); - NSError *error = nil; - if (![self.managedObjectContext save:&error]) { - DDLogError(@"[MQTTPersistence] sync error %@", error); - } - if (self.managedObjectContext.hasChanges) { - DDLogError(@"[MQTTPersistence] sync not complete"); - } - DDLogVerbose(@"[MQTTPersistence] postsync: i%lu u%lu d%lu", - (unsigned long)self.managedObjectContext.insertedObjects.count, - (unsigned long)self.managedObjectContext.updatedObjects.count, - (unsigned long)self.managedObjectContext.deletedObjects.count - ); - [self sizes]; - } -} - -- (NSArray *)allFlowsforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag { - NSMutableArray *flows = [NSMutableArray array]; - __block NSArray *rows; - [self.managedObjectContext performBlockAndWait:^{ - - NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MQTTFlow"]; - fetchRequest.predicate = [NSPredicate predicateWithFormat: - @"clientId = %@ and incomingFlag = %@", - clientId, - @(incomingFlag) - ]; - fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"deadline" ascending:YES]]; - NSError *error = nil; - rows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; - if (!rows) { - DDLogError(@"[MQTTPersistence] allFlowsforClientId %@", error); - } - }]; - for (idrow in rows) { - [flows addObject:[[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:row]]; - } - return flows; -} - -- (MQTTCoreDataFlow *)flowforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId { - __block MQTTCoreDataFlow *flow = nil; - - DDLogVerbose(@"flowforClientId requestingPerform"); - [self.managedObjectContext performBlockAndWait:^{ - flow = [self internalFlowForClientId:clientId - incomingFlag:incomingFlag - messageId:messageId]; - }]; - DDLogVerbose(@"flowforClientId performed"); - return flow; -} - -- (MQTTCoreDataFlow *)internalFlowForClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId { - MQTTCoreDataFlow *flow = nil; - - DDLogVerbose(@"flowforClientId performing"); - - NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MQTTFlow"]; - fetchRequest.predicate = [NSPredicate predicateWithFormat: - @"clientId = %@ and incomingFlag = %@ and messageId = %@", - clientId, - @(incomingFlag), - @(messageId) - ]; - NSArray *rows; - NSError *error = nil; - rows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; - if (!rows) { - DDLogError(@"[MQTTPersistence] flowForClientId %@", error); - } else { - if (rows.count) { - flow = [[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:rows.lastObject]; - } - } - return flow; -} - -- (MQTTCoreDataFlow *)createFlowforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId { - MQTTCoreDataFlow *flow = (MQTTCoreDataFlow *)[self flowforClientId:clientId - incomingFlag:incomingFlag - messageId:messageId]; - if (!flow) { - __block id row; - [self.managedObjectContext performBlockAndWait:^{ - row = [NSEntityDescription insertNewObjectForEntityForName:@"MQTTFlow" - inManagedObjectContext:self.managedObjectContext]; - - row.clientId = clientId; - row.incomingFlag = @(incomingFlag); - row.messageId = @(messageId); - }]; - flow = [[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:row]; - } - - return flow; -} - -#pragma mark - Core Data stack - -- (NSManagedObjectModel *)createManagedObjectModel { - NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] init]; - NSMutableArray *entities = [[NSMutableArray alloc] init]; - NSMutableArray *properties = [[NSMutableArray alloc] init]; - - NSAttributeDescription *attributeDescription; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"clientId"; - attributeDescription.attributeType = NSStringAttributeType; - attributeDescription.attributeValueClassName = @"NSString"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"incomingFlag"; - attributeDescription.attributeType = NSBooleanAttributeType; - attributeDescription.attributeValueClassName = @"NSNumber"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"retainedFlag"; - attributeDescription.attributeType = NSBooleanAttributeType; - attributeDescription.attributeValueClassName = @"NSNumber"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"commandType"; - attributeDescription.attributeType = NSInteger16AttributeType; - attributeDescription.attributeValueClassName = @"NSNumber"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"qosLevel"; - attributeDescription.attributeType = NSInteger16AttributeType; - attributeDescription.attributeValueClassName = @"NSNumber"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"messageId"; - attributeDescription.attributeType = NSInteger32AttributeType; - attributeDescription.attributeValueClassName = @"NSNumber"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"topic"; - attributeDescription.attributeType = NSStringAttributeType; - attributeDescription.attributeValueClassName = @"NSString"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"data"; - attributeDescription.attributeType = NSBinaryDataAttributeType; - attributeDescription.attributeValueClassName = @"NSData"; - [properties addObject:attributeDescription]; - - attributeDescription = [[NSAttributeDescription alloc] init]; - attributeDescription.name = @"deadline"; - attributeDescription.attributeType = NSDateAttributeType; - attributeDescription.attributeValueClassName = @"NSDate"; - [properties addObject:attributeDescription]; - - NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init]; - entityDescription.name = @"MQTTFlow"; - entityDescription.managedObjectClassName = @"MQTTFlow"; - entityDescription.abstract = FALSE; - entityDescription.properties = properties; - - [entities addObject:entityDescription]; - managedObjectModel.entities = entities; - - return managedObjectModel; -} - -- (NSPersistentStoreCoordinator *)createPersistentStoreCoordinator { - NSURL *persistentStoreURL = [[self applicationDocumentsDirectory] - URLByAppendingPathComponent:@"MQTTClient"]; - DDLogInfo(@"[MQTTPersistence] Persistent store: %@", persistentStoreURL.path); - - - NSError *error = nil; - NSManagedObjectModel *model = [self createManagedObjectModel]; - NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] - initWithManagedObjectModel:model]; - NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @YES, - NSInferMappingModelAutomaticallyOption: @YES, - NSSQLiteAnalyzeOption: @YES, - NSSQLiteManualVacuumOption: @YES - }; - - if (![persistentStoreCoordinator addPersistentStoreWithType:self.persistent ? NSSQLiteStoreType : NSInMemoryStoreType - configuration:nil - URL:self.persistent ? persistentStoreURL : nil - options:options - error:&error]) { - DDLogError(@"[MQTTPersistence] managedObjectContext save: %@", error); - persistentStoreCoordinator = nil; - } - return persistentStoreCoordinator; -} - -#pragma mark - Application's Documents directory - -- (NSURL *)applicationDocumentsDirectory -{ - return [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; -} - -- (void)sizes { - if (self.persistent) { - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = paths[0]; - NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"MQTTClient"]; - - NSError *error = nil; - NSDictionary *fileAttributes = [[NSFileManager defaultManager] - attributesOfItemAtPath:persistentStorePath error:&error]; - NSDictionary *fileSystemAttributes = [[NSFileManager defaultManager] - attributesOfFileSystemForPath:persistentStorePath - error:&error]; - self.fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue]; - self.fileSystemFreeSize = [fileSystemAttributes[NSFileSystemFreeSize] unsignedLongLongValue]; - } else { - self.fileSize = 0; - self.fileSystemFreeSize = 0; - } - DDLogVerbose(@"[MQTTPersistence] sizes %llu/%llu", self.fileSize, self.fileSystemFreeSize); -} -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h deleted file mode 100644 index d943450..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h +++ /dev/null @@ -1,66 +0,0 @@ -// -// MQTTDecoder.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// -// based on -// -// Copyright (c) 2011, 2013, 2lemetry LLC -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// Contributors: -// Kyle Roche - initial API and implementation and/or initial documentation -// - -#import -#import "MQTTMessage.h" - -typedef NS_ENUM(unsigned int, MQTTDecoderEvent) { - MQTTDecoderEventProtocolError, - MQTTDecoderEventConnectionClosed, - MQTTDecoderEventConnectionError -}; - -typedef NS_ENUM(unsigned int, MQTTDecoderState) { - MQTTDecoderStateInitializing, - MQTTDecoderStateDecodingHeader, - MQTTDecoderStateDecodingLength, - MQTTDecoderStateDecodingData, - MQTTDecoderStateConnectionClosed, - MQTTDecoderStateConnectionError, - MQTTDecoderStateProtocolError -}; - -@class MQTTDecoder; - -@protocol MQTTDecoderDelegate - -- (void)decoder:(MQTTDecoder *)sender didReceiveMessage:(NSData *)data; -- (void)decoder:(MQTTDecoder *)sender handleEvent:(MQTTDecoderEvent)eventCode error:(NSError *)error; - -@end - - -@interface MQTTDecoder: NSObject - -@property (nonatomic) MQTTDecoderState state; -@property (strong, nonatomic) dispatch_queue_t queue; -@property (nonatomic) UInt32 length; -@property (nonatomic) UInt32 lengthMultiplier; -@property (nonatomic) int offset; -@property (strong, nonatomic) NSMutableData *dataBuffer; - -@property (weak, nonatomic) id delegate; - -- (void)open; -- (void)close; -- (void)decodeMessage:(NSData *)data; - -@end - - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m deleted file mode 100644 index 224cd65..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m +++ /dev/null @@ -1,215 +0,0 @@ -// -// MQTTDecoder.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import "MQTTDecoder.h" - -#import "MQTTLog.h" - -@interface MQTTDecoder() { - void *QueueIdentityKey; -} - -@property (nonatomic) NSMutableArray *streams; - -@end - -@implementation MQTTDecoder - -- (instancetype)init { - self = [super init]; - self.state = MQTTDecoderStateInitializing; - self.streams = [NSMutableArray arrayWithCapacity:5]; - self.queue = dispatch_get_main_queue(); - return self; -} - -- (void)dealloc { - [self close]; -} - -- (void)setQueue:(dispatch_queue_t)queue { - _queue = queue; - - // We're going to use dispatch_queue_set_specific() to "mark" our queue. - // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. - // Later we can use dispatch_get_specific() to determine if we're executing on our queue. - // From the documentation: - // - // > Keys are only compared as pointers and are never dereferenced. - // > Thus, you can use a pointer to a static variable for a specific subsystem or - // > any other value that allows you to identify the value uniquely. - // - // So we're just going to use the memory address of an ivar. - - dispatch_queue_set_specific(_queue, &QueueIdentityKey, (__bridge void *)_queue, NULL); -} - -- (void)decodeMessage:(NSData *)data { - NSInputStream *stream = [NSInputStream inputStreamWithData:data]; - CFReadStreamRef readStream = (__bridge CFReadStreamRef)stream; - CFReadStreamSetDispatchQueue(readStream, self.queue); - [self openStream:stream]; -} - -- (void)openStream:(NSInputStream *)stream { - [self.streams addObject:stream]; - stream.delegate = self; - DDLogVerbose(@"[MQTTDecoder] #streams=%lu", (unsigned long)self.streams.count); - if (self.streams.count == 1) { - [stream open]; - } -} - -- (void)open { - self.state = MQTTDecoderStateDecodingHeader; -} - -- (void)internalClose { - if (self.streams) { - for (NSInputStream *stream in self.streams) { - [stream close]; - [stream setDelegate:nil]; - } - [self.streams removeAllObjects]; - } -} - -- (void)close { - // https://github.com/novastone-media/MQTT-Client-Framework/issues/325 - // We need to make sure that we are closing streams on their queue - // Otherwise, we end up with race condition where delegate is deallocated - // but still used by run loop event - if (self.queue != dispatch_get_specific(&QueueIdentityKey)) { - dispatch_sync(self.queue, ^{ - [self internalClose]; - }); - } else { - [self internalClose]; - } -} - -- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { - // We contact our delegate, MQTTSession at some point in this method - // This call can cause MQTTSession to dealloc and thus, MQTTDecoder to dealloc - // So we end up with invalid object in the middle of the method - // To prevent this we retain self for duration of this method call - MQTTDecoder *strongDecoder = self; - (void)strongDecoder; - - NSInputStream *stream = (NSInputStream *)sender; - - if (eventCode & NSStreamEventOpenCompleted) { - DDLogVerbose(@"[MQTTDecoder] NSStreamEventOpenCompleted"); - } - - if (eventCode & NSStreamEventHasBytesAvailable) { - DDLogVerbose(@"[MQTTDecoder] NSStreamEventHasBytesAvailable"); - - if (self.state == MQTTDecoderStateDecodingHeader) { - UInt8 buffer; - NSInteger n = [stream read:&buffer maxLength:1]; - if (n == -1) { - self.state = MQTTDecoderStateConnectionError; - [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; - } else if (n == 1) { - self.length = 0; - self.lengthMultiplier = 1; - self.state = MQTTDecoderStateDecodingLength; - self.dataBuffer = [[NSMutableData alloc] init]; - [self.dataBuffer appendBytes:&buffer length:1]; - self.offset = 1; - DDLogVerbose(@"[MQTTDecoder] fixedHeader=0x%02x", buffer); - } - } - while (self.state == MQTTDecoderStateDecodingLength) { - // TODO: check max packet length(prevent evil server response) - UInt8 digit; - NSInteger n = [stream read:&digit maxLength:1]; - if (n == -1) { - self.state = MQTTDecoderStateConnectionError; - [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; - break; - } else if (n == 0) { - break; - } - DDLogVerbose(@"[MQTTDecoder] digit=0x%02x 0x%02x %d %d", digit, digit & 0x7f, (unsigned int)self.length, (unsigned int)self.lengthMultiplier); - [self.dataBuffer appendBytes:&digit length:1]; - self.offset++; - self.length += ((digit & 0x7f) * self.lengthMultiplier); - if ((digit & 0x80) == 0x00) { - self.state = MQTTDecoderStateDecodingData; - } else { - self.lengthMultiplier *= 128; - } - } - DDLogVerbose(@"[MQTTDecoder] remainingLength=%d", (unsigned int)self.length); - - if (self.state == MQTTDecoderStateDecodingData) { - if (self.length > 0) { - NSInteger n, toRead; - UInt8 buffer[768]; - toRead = self.length + self.offset - self.dataBuffer.length; - if (toRead > sizeof buffer) { - toRead = sizeof buffer; - } - n = [stream read:buffer maxLength:toRead]; - if (n == -1) { - self.state = MQTTDecoderStateConnectionError; - [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; - } else { - DDLogVerbose(@"[MQTTDecoder] read %ld %ld", (long)toRead, (long)n); - [self.dataBuffer appendBytes:buffer length:n]; - } - } - if (self.dataBuffer.length == self.length + self.offset) { - DDLogVerbose(@"[MQTTDecoder] received (%lu)=%@...", (unsigned long)self.dataBuffer.length, - [self.dataBuffer subdataWithRange:NSMakeRange(0, MIN(256, self.dataBuffer.length))]); - [self.delegate decoder:self didReceiveMessage:self.dataBuffer]; - self.dataBuffer = nil; - self.state = MQTTDecoderStateDecodingHeader; - } else { - DDLogWarn(@"[MQTTDecoder] oops received (%lu)=%@...", (unsigned long)self.dataBuffer.length, - [self.dataBuffer subdataWithRange:NSMakeRange(0, MIN(256, self.dataBuffer.length))]); - } - } - } - - if (eventCode & NSStreamEventHasSpaceAvailable) { - DDLogVerbose(@"[MQTTDecoder] NSStreamEventHasSpaceAvailable"); - } - - if (eventCode & NSStreamEventEndEncountered) { - DDLogVerbose(@"[MQTTDecoder] NSStreamEventEndEncountered"); - - if (self.streams) { - [stream setDelegate:nil]; - [stream close]; - [self.streams removeObject:stream]; - if (self.streams.count) { - NSInputStream *stream = (self.streams)[0]; - [stream open]; - } - } - } - - if (eventCode & NSStreamEventErrorOccurred) { - DDLogVerbose(@"[MQTTDecoder] NSStreamEventErrorOccurred"); - - self.state = MQTTDecoderStateConnectionError; - NSError *error = stream.streamError; - if (self.streams) { - [self.streams removeObject:stream]; - if (self.streams.count) { - NSInputStream *stream = (self.streams)[0]; - [stream open]; - } - } - [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:error]; - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h deleted file mode 100644 index c1374a7..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// MQTTInMemoryPersistence.h -// MQTTClient -// -// Created by Christoph Krey on 22.03.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import -#import "MQTTPersistence.h" - -@interface MQTTInMemoryPersistence : NSObject -@end - -@interface MQTTInMemoryFlow : NSObject -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m deleted file mode 100755 index ec95f1e..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m +++ /dev/null @@ -1,180 +0,0 @@ -// -// MQTTInMemoryPersistence.m -// MQTTClient -// -// Created by Christoph Krey on 22.03.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTInMemoryPersistence.h" - -#import "MQTTLog.h" - -@implementation MQTTInMemoryFlow -@synthesize clientId; -@synthesize incomingFlag; -@synthesize retainedFlag; -@synthesize commandType; -@synthesize qosLevel; -@synthesize messageId; -@synthesize topic; -@synthesize data; -@synthesize deadline; - -@end - -@interface MQTTInMemoryPersistence() -@end - -static NSMutableDictionary *clientIds; - -@implementation MQTTInMemoryPersistence -@synthesize maxSize; -@synthesize persistent; -@synthesize maxMessages; -@synthesize maxWindowSize; - -- (MQTTInMemoryPersistence *)init { - self = [super init]; - self.maxMessages = MQTT_MAX_MESSAGES; - self.maxWindowSize = MQTT_MAX_WINDOW_SIZE; - @synchronized(clientIds) { - if (!clientIds) { - clientIds = [[NSMutableDictionary alloc] init]; - } - } - return self; -} - -- (NSUInteger)windowSize:(NSString *)clientId { - NSUInteger windowSize = 0; - NSArray *flows = [self allFlowsforClientId:clientId - incomingFlag:NO]; - for (MQTTInMemoryFlow *flow in flows) { - if ((flow.commandType).intValue != MQTT_None) { - windowSize++; - } - } - return windowSize; -} - -- (MQTTInMemoryFlow *)storeMessageForClientId:(NSString *)clientId - topic:(NSString *)topic - data:(NSData *)data - retainFlag:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - msgId:(UInt16)msgId - incomingFlag:(BOOL)incomingFlag - commandType:(UInt8)commandType - deadline:(NSDate *)deadline { - @synchronized(clientIds) { - - if (([self allFlowsforClientId:clientId incomingFlag:incomingFlag].count <= self.maxMessages)) { - MQTTInMemoryFlow *flow = (MQTTInMemoryFlow *)[self createFlowforClientId:clientId - incomingFlag:incomingFlag - messageId:msgId]; - flow.topic = topic; - flow.data = data; - flow.retainedFlag = @(retainFlag); - flow.qosLevel = @(qos); - flow.commandType = [NSNumber numberWithUnsignedInteger:commandType]; - flow.deadline = deadline; - return flow; - } else { - return nil; - } - } -} - -- (void)deleteFlow:(MQTTInMemoryFlow *)flow { - @synchronized(clientIds) { - - NSMutableDictionary *clientIdFlows = clientIds[flow.clientId]; - if (clientIdFlows) { - NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[flow.incomingFlag]; - if (clientIdDirectedFlow) { - [clientIdDirectedFlow removeObjectForKey:flow.messageId]; - } - } - } -} - -- (void)deleteAllFlowsForClientId:(NSString *)clientId { - @synchronized(clientIds) { - - DDLogInfo(@"[MQTTInMemoryPersistence] deleteAllFlowsForClientId %@", clientId); - [clientIds removeObjectForKey:clientId]; - } -} - -- (void)sync { - // -} - -- (NSArray *)allFlowsforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag { - @synchronized(clientIds) { - - NSMutableArray *flows = nil; - NSMutableDictionary *clientIdFlows = clientIds[clientId]; - if (clientIdFlows) { - NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; - if (clientIdDirectedFlow) { - flows = [NSMutableArray array]; - NSArray *keys = [clientIdDirectedFlow.allKeys sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]]; - for (id key in keys) { - [flows addObject:clientIdDirectedFlow[key]]; - } - } - } - return flows; - } -} - -- (MQTTInMemoryFlow *)flowforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId { - @synchronized(clientIds) { - - MQTTInMemoryFlow *flow = nil; - - NSMutableDictionary *clientIdFlows = clientIds[clientId]; - if (clientIdFlows) { - NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; - if (clientIdDirectedFlow) { - flow = clientIdDirectedFlow[[NSNumber numberWithUnsignedInteger:messageId]]; - } - } - - return flow; - } -} - -- (MQTTInMemoryFlow *)createFlowforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId { - @synchronized(clientIds) { - NSMutableDictionary *clientIdFlows = clientIds[clientId]; - if (!clientIdFlows) { - clientIdFlows = [[NSMutableDictionary alloc] init]; - clientIds[clientId] = clientIdFlows; - } - - NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; - if (!clientIdDirectedFlow) { - clientIdDirectedFlow = [[NSMutableDictionary alloc] init]; - clientIdFlows[@(incomingFlag)] = clientIdDirectedFlow; - } - - MQTTInMemoryFlow *flow = [[MQTTInMemoryFlow alloc] init]; - flow.clientId = clientId; - flow.incomingFlag = @(incomingFlag); - flow.messageId = [NSNumber numberWithUnsignedInteger:messageId]; - - clientIdDirectedFlow[[NSNumber numberWithUnsignedInteger:messageId]] = flow; - - return flow; - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h deleted file mode 100644 index 0f6f042..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h +++ /dev/null @@ -1,123 +0,0 @@ -// -// MQTTLog.h -// MQTTClient -// -// Created by Christoph Krey on 10.02.16. -// Copyright © 2016-2017 Christoph Krey. All rights reserved. -// - -@import Foundation; - -#ifdef LUMBERJACK - -#define LOG_LEVEL_DEF ddLogLevel -#import - -#else /* LUMBERJACK */ - -typedef NS_OPTIONS(NSUInteger, DDLogFlag){ - /** - * 0...00001 DDLogFlagError - */ - DDLogFlagError = (1 << 0), - - /** - * 0...00010 DDLogFlagWarning - */ - DDLogFlagWarning = (1 << 1), - - /** - * 0...00100 DDLogFlagInfo - */ - DDLogFlagInfo = (1 << 2), - - /** - * 0...01000 DDLogFlagDebug - */ - DDLogFlagDebug = (1 << 3), - - /** - * 0...10000 DDLogFlagVerbose - */ - DDLogFlagVerbose = (1 << 4) -}; - - -typedef NS_ENUM(NSUInteger, DDLogLevel){ -DDLogLevelOff = 0, - -/** - * Error logs only - */ -DDLogLevelError = (DDLogFlagError), - -/** - * Error and warning logs - */ -DDLogLevelWarning = (DDLogLevelError | DDLogFlagWarning), - -/** - * Error, warning and info logs - */ -DDLogLevelInfo = (DDLogLevelWarning | DDLogFlagInfo), - -/** - * Error, warning, info and debug logs - */ -DDLogLevelDebug = (DDLogLevelInfo | DDLogFlagDebug), - -/** - * Error, warning, info, debug and verbose logs - */ -DDLogLevelVerbose = (DDLogLevelDebug | DDLogFlagVerbose), - -/** - * All logs (1...11111) - */ -DDLogLevelAll = NSUIntegerMax -}; - -#ifdef DEBUG - -#define DDLogVerbose if (ddLogLevel & DDLogFlagVerbose) NSLog -#define DDLogDebug if (ddLogLevel & DDLogFlagDebug) NSLog -#define DDLogWarn if (ddLogLevel & DDLogFlagWarning) NSLog -#define DDLogInfo if (ddLogLevel & DDLogFlagInfo) NSLog -#define DDLogError if (ddLogLevel & DDLogFlagError) NSLog - -#else - -#define DDLogVerbose(...) -#define DDLogDebug(...) -#define DDLogWarn(...) -#define DDLogInfo(...) -#define DDLogError(...) - -#endif /* DEBUG */ -#endif /* LUMBERJACK */ - -extern DDLogLevel ddLogLevel; - -/** MQTTLog lets you define the log level for MQTTClient - * independently of using CocoaLumberjack - */ -@interface MQTTLog: NSObject - -/** setLogLevel controls the log level for MQTTClient - * @param logLevel as follows: - * - * default for DEBUG builds is DDLogLevelVerbose - * default for RELEASE builds is DDLogLevelWarning - * - * Available log levels: - * DDLogLevelAll - * DDLogLevelVerbose - * DDLogLevelDebug - * DDLogLevelInfo - * DDLogLevelWarning - * DDLogLevelError - * DDLogLevelOff - */ -+ (void)setLogLevel:(DDLogLevel)logLevel; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m deleted file mode 100644 index cc1c878..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// MQTTLog.m -// MQTTClient -// -// Created by Josip Cavar on 06/07/2017. -// -// - -#import "MQTTLog.h" - -@implementation MQTTLog - -#ifdef DEBUG - -DDLogLevel ddLogLevel = DDLogLevelVerbose; - -#else - -DDLogLevel ddLogLevel = DDLogLevelWarning; - -#endif - -+ (void)setLogLevel:(DDLogLevel)logLevel { - ddLogLevel = logLevel; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h deleted file mode 100644 index e065355..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h +++ /dev/null @@ -1,233 +0,0 @@ -// -// MQTTMessage.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// -// based on -// -// Copyright (c) 2011, 2013, 2lemetry LLC -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// Contributors: -// Kyle Roche - initial API and implementation and/or initial documentation -// - -#import -@class MQTTProperties; - -/** - Enumeration of MQTT Quality of Service levels - */ -typedef NS_ENUM(UInt8, MQTTQosLevel) { - MQTTQosLevelAtMostOnce = 0, - MQTTQosLevelAtLeastOnce = 1, - MQTTQosLevelExactlyOnce = 2 -}; - -/** - Enumeration of MQTT protocol version - */ -typedef NS_ENUM(UInt8, MQTTProtocolVersion) { - MQTTProtocolVersion0 = 0, - MQTTProtocolVersion31 = 3, - MQTTProtocolVersion311 = 4, - MQTTProtocolVersion50 = 5 -}; - -typedef NS_ENUM(UInt8, MQTTCommandType) { - MQTT_None = 0, - MQTTConnect = 1, - MQTTConnack = 2, - MQTTPublish = 3, - MQTTPuback = 4, - MQTTPubrec = 5, - MQTTPubrel = 6, - MQTTPubcomp = 7, - MQTTSubscribe = 8, - MQTTSuback = 9, - MQTTUnsubscribe = 10, - MQTTUnsuback = 11, - MQTTPingreq = 12, - MQTTPingresp = 13, - MQTTDisconnect = 14, - MQTTAuth = 15 -}; - -@interface MQTTMessage : NSObject - -@property (nonatomic) MQTTCommandType type; -@property (nonatomic) MQTTQosLevel qos; -@property (nonatomic) BOOL retainFlag; -@property (nonatomic) BOOL dupFlag; -@property (nonatomic) UInt16 mid; -@property (strong, nonatomic) NSData *data; -@property (strong, nonatomic) NSNumber *returnCode; -@property (strong, nonatomic) NSNumber *connectAcknowledgeFlags; -@property (strong, nonatomic) MQTTProperties *properties; - -/** - Enumeration of MQTT return codes - */ - -typedef NS_ENUM(NSUInteger, MQTTReturnCode) { - MQTTAccepted = 0, - MQTTRefusedUnacceptableProtocolVersion = 1, - MQTTRefusedIdentiferRejected = 2, - MQTTRefusedServerUnavailable = 3, - MQTTRefusedBadUserNameOrPassword = 4, - MQTTRefusedNotAuthorized = 5, - - MQTTSuccess = 0, - MQTTDisconnectWithWillMessage = 4, - MQTTNoSubscriptionExisted = 17, - MQTTContinueAuthentication = 24, - MQTTReAuthenticate = 25, - MQTTUnspecifiedError = 128, - MQTTMalformedPacket = 129, - MQTTProtocolError = 130, - MQTTImplementationSpecificError = 131, - MQTTUnsupportedProtocolVersion = 132, - MQTTClientIdentifierNotValid = 133, - MQTTBadUserNameOrPassword = 134, - MQTTNotAuthorized = 135, - MQTTServerUnavailable = 136, - MQTTServerBusy = 137, - MQTTBanned = 138, - MQTTServerShuttingDown = 139, - MQTTBadAuthenticationMethod = 140, - MQTTKeepAliveTimeout = 141, - MQTTSessionTakenOver = 142, - MQTTTopicFilterInvalid = 143, - MQTTTopicNameInvalid = 144, - MQTTPacketIdentifierInUse = 145, - MQTTPacketIdentifierNotFound = 146, - MQTTReceiveMaximumExceeded = 147, - MQTTPacketTooLarge = 149, - MQTTMessageRateTooHigh = 150, - MQTTQuotaExceeded = 151, - MQTTAdministrativeAction = 152, - MQTTPayloadFormatInvalid = 153, - MQTTRetainNotSupported = 154, - MQTTQoSNotSupported = 155, - MQTTUseAnotherServer = 156, - MQTTServerMoved = 157, - MQTTSharedSubscriptionNotSupported = 158, - MQTTConnectionRateExceeded = 159, - MQTTSubscriptionIdentifiersNotSupported = 161, - MQTTWildcardSubscriptionNotSupported = 162 -}; - -// factory methods -+ (MQTTMessage *)connectMessageWithClientId:(NSString*)clientId - userName:(NSString*)userName - password:(NSString*)password - keepAlive:(NSInteger)keeplive - cleanSession:(BOOL)cleanSessionFlag - will:(BOOL)will - willTopic:(NSString*)willTopic - willMsg:(NSData*)willData - willQoS:(MQTTQosLevel)willQoS - willRetain:(BOOL)willRetainFlag - protocolLevel:(MQTTProtocolVersion)protocolLevel - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - authMethod:(NSString *)authMethod - authData:(NSData *)authData - requestProblemInformation:(NSNumber *)requestProblemInformation - willDelayInterval:(NSNumber *)willDelayInterval - requestResponseInformation:(NSNumber *)requestResponseInformation - receiveMaximum:(NSNumber *)receiveMaximum - topicAliasMaximum:(NSNumber *)topicAliasMaximum - userProperty:(NSDictionary *)userProperty - maximumPacketSize:(NSNumber *)maximumPacketSize -; - -+ (MQTTMessage *)pingreqMessage; - -+ (MQTTMessage *)disconnectMessage:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - -+ (MQTTMessage *)subscribeMessageWithMessageId:(UInt16)msgId - topics:(NSDictionary *)topics - protocolLevel:(MQTTProtocolVersion)protocolLevel - subscriptionIdentifier:(NSNumber *)subscriptionIdentifier; - -+ (MQTTMessage *)unsubscribeMessageWithMessageId:(UInt16)msgId - topics:(NSArray *)topics - protocolLevel:(MQTTProtocolVersion)protocolLevel; - -+ (MQTTMessage *)publishMessageWithData:(NSData*)payload - onTopic:(NSString*)topic - qos:(MQTTQosLevel)qosLevel - msgId:(UInt16)msgId - retainFlag:(BOOL)retain - dupFlag:(BOOL)dup - protocolLevel:(MQTTProtocolVersion)protocolLevel - payloadFormatIndicator:(NSNumber *)payloadFormatIndicator - publicationExpiryInterval:(NSNumber *)publicationExpiryInterval - topicAlias:(NSNumber *)topicAlias - responseTopic:(NSString *)responseTopic - correlationData:(NSData *)correlationData - userProperty:(NSDictionary *)userProperty - contentType:(NSString *)contentType; - -+ (MQTTMessage *)pubackMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - -+ (MQTTMessage *)pubrecMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - -+ (MQTTMessage *)pubrelMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - -+ (MQTTMessage *)pubcompMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - -+ (MQTTMessage *)messageFromData:(NSData *)data protocolLevel:(MQTTProtocolVersion)protocolLevel; - -// instance methods -- (instancetype)initWithType:(MQTTCommandType)type; -- (instancetype)initWithType:(MQTTCommandType)type - data:(NSData *)data; -- (instancetype)initWithType:(MQTTCommandType)type - qos:(MQTTQosLevel)qos - data:(NSData *)data; -- (instancetype)initWithType:(MQTTCommandType)type - qos:(MQTTQosLevel)qos - retainFlag:(BOOL)retainFlag - dupFlag:(BOOL)dupFlag - data:(NSData *)data; - -@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSData *wireFormat; - - -@end - -@interface NSMutableData (MQTT) -- (void)appendByte:(UInt8)byte; -- (void)appendUInt16BigEndian:(UInt16)val; -- (void)appendUInt32BigEndian:(UInt32)val; -- (void)appendVariableLength:(unsigned long)length; -- (void)appendMQTTString:(NSString *)string; -- (void)appendBinaryData:(NSData *)data; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m deleted file mode 100644 index a1c321f..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m +++ /dev/null @@ -1,762 +0,0 @@ -// -// MQTTMessage.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// -// based on -// -// Copyright (c) 2011, 2013, 2lemetry LLC -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// Contributors: -// Kyle Roche - initial API and implementation and/or initial documentation -// - -#import "MQTTMessage.h" -#import "MQTTProperties.h" - -#import "MQTTLog.h" - -@implementation MQTTMessage - -+ (MQTTMessage *)connectMessageWithClientId:(NSString *)clientId - userName:(NSString *)userName - password:(NSString *)password - keepAlive:(NSInteger)keepAlive - cleanSession:(BOOL)cleanSessionFlag - will:(BOOL)will - willTopic:(NSString *)willTopic - willMsg:(NSData *)willMsg - willQoS:(MQTTQosLevel)willQoS - willRetain:(BOOL)willRetainFlag - protocolLevel:(MQTTProtocolVersion)protocolLevel - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - authMethod:(NSString *)authMethod - authData:(NSData *)authData - requestProblemInformation:(NSNumber *)requestProblemInformation - willDelayInterval:(NSNumber *)willDelayInterval - requestResponseInformation:(NSNumber *)requestResponseInformation - receiveMaximum:(NSNumber *)receiveMaximum - topicAliasMaximum:(NSNumber *)topicAliasMaximum - userProperty:(NSDictionary *)userProperty - maximumPacketSize:(NSNumber *)maximumPacketSize { - /* - * setup flags w/o basic plausibility checks - * - */ - UInt8 flags = 0x00; - - if (cleanSessionFlag) { - flags |= 0x02; - } - - if (userName) { - flags |= 0x80; - } - if (password) { - flags |= 0x40; - } - - if (will) { - flags |= 0x04; - } - - flags |= ((willQoS & 0x03) << 3); - - if (willRetainFlag) { - flags |= 0x20; - } - - NSMutableData* data = [NSMutableData data]; - - switch (protocolLevel) { - case MQTTProtocolVersion50: - [data appendMQTTString:@"MQTT"]; - [data appendByte:MQTTProtocolVersion50]; - break; - - case MQTTProtocolVersion311: - [data appendMQTTString:@"MQTT"]; - [data appendByte:MQTTProtocolVersion311]; - break; - - case MQTTProtocolVersion31: - [data appendMQTTString:@"MQIsdp"]; - [data appendByte:MQTTProtocolVersion31]; - break; - - case MQTTProtocolVersion0: - [data appendMQTTString:@""]; - [data appendByte:protocolLevel]; - break; - - default: - [data appendMQTTString:@"MQTT"]; - [data appendByte:protocolLevel]; - break; - } - [data appendByte:flags]; - [data appendUInt16BigEndian:keepAlive]; - - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (sessionExpiryInterval) { - [properties appendByte:MQTTSessionExpiryInterval]; - [properties appendUInt32BigEndian:sessionExpiryInterval.unsignedIntValue]; - } - if (authMethod) { - [properties appendByte:MQTTAuthMethod]; - [properties appendMQTTString:authMethod]; - } - if (authData) { - [properties appendByte:MQTTAuthData]; - [properties appendBinaryData:authData]; - } - if (requestProblemInformation) { - [properties appendByte:MQTTRequestProblemInformation]; - [properties appendByte:requestProblemInformation.unsignedIntValue]; - } - if (willDelayInterval) { - [properties appendByte:MQTTWillDelayInterval]; - [properties appendUInt32BigEndian:willDelayInterval.unsignedIntValue]; - } - if (requestResponseInformation) { - [properties appendByte:MQTTRequestResponseInformation]; - [properties appendByte:requestResponseInformation.unsignedIntValue]; - } - if (receiveMaximum) { - [properties appendByte:MQTTReceiveMaximum]; - [properties appendUInt16BigEndian:receiveMaximum.unsignedIntValue]; - } - if (topicAliasMaximum) { - [properties appendByte:MQTTTopicAliasMaximum]; - [properties appendUInt16BigEndian:topicAliasMaximum.unsignedIntValue]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - if (maximumPacketSize) { - [properties appendByte:MQTTMaximumPacketSize]; - [properties appendUInt32BigEndian:maximumPacketSize.unsignedIntValue]; - } - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - - [data appendMQTTString:clientId]; - if (willTopic) { - [data appendMQTTString:willTopic]; - } - if (willMsg) { - [data appendUInt16BigEndian:willMsg.length]; - [data appendData:willMsg]; - } - if (userName) { - [data appendMQTTString:userName]; - } - if (password) { - [data appendMQTTString:password]; - } - - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTConnect - data:data]; - return msg; -} - -+ (MQTTMessage *)pingreqMessage { - return [[MQTTMessage alloc] initWithType:MQTTPingreq]; -} - -+ (MQTTMessage *)disconnectMessage:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - NSMutableData* data = [NSMutableData data]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (sessionExpiryInterval) { - [properties appendByte:MQTTSessionExpiryInterval]; - [properties appendUInt32BigEndian:sessionExpiryInterval.unsignedIntValue]; - } - if (reasonString) { - [properties appendByte:MQTTReasonString]; - [properties appendMQTTString:reasonString]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - if (returnCode != MQTTSuccess || properties.length > 0) { - [data appendByte:returnCode]; - } - if (properties.length > 0) { - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - } - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTDisconnect - data:data]; - return msg; -} - -+ (MQTTMessage *)subscribeMessageWithMessageId:(UInt16)msgId - topics:(NSDictionary *)topics - protocolLevel:(MQTTProtocolVersion)protocolLevel - subscriptionIdentifier:(NSNumber *)subscriptionIdentifier { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (subscriptionIdentifier) { - [properties appendByte:MQTTSubscriptionIdentifier]; - [properties appendVariableLength:subscriptionIdentifier.unsignedLongValue]; - } - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - - for (NSString *topic in topics.allKeys) { - [data appendMQTTString:topic]; - [data appendByte:[topics[topic] intValue]]; - } - MQTTMessage* msg = [[MQTTMessage alloc] initWithType:MQTTSubscribe - qos:1 - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)unsubscribeMessageWithMessageId:(UInt16)msgId - topics:(NSArray *)topics - protocolLevel:(MQTTProtocolVersion)protocolLevel { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - for (NSString *topic in topics) { - [data appendMQTTString:topic]; - } - MQTTMessage* msg = [[MQTTMessage alloc] initWithType:MQTTUnsubscribe - qos:1 - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)publishMessageWithData:(NSData *)payload - onTopic:(NSString *)topic - qos:(MQTTQosLevel)qosLevel - msgId:(UInt16)msgId - retainFlag:(BOOL)retain - dupFlag:(BOOL)dup - protocolLevel:(MQTTProtocolVersion)protocolLevel - payloadFormatIndicator:(NSNumber *)payloadFormatIndicator - publicationExpiryInterval:(NSNumber *)publicationExpiryInterval - topicAlias:(NSNumber *)topicAlias - responseTopic:(NSString *)responseTopic - correlationData:(NSData *)correlationData - userProperty:(NSDictionary *)userProperty - contentType:(NSString *)contentType { - NSMutableData *data = [[NSMutableData alloc] init]; - [data appendMQTTString:topic]; - if (msgId) [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (payloadFormatIndicator) { - [properties appendByte:MQTTPayloadFormatIndicator]; - [properties appendByte:payloadFormatIndicator.unsignedIntValue]; - } - if (publicationExpiryInterval) { - [properties appendByte:MQTTPublicationExpiryInterval]; - [properties appendUInt32BigEndian:publicationExpiryInterval.unsignedIntValue]; - } - if (topicAlias) { - [properties appendByte:MQTTTopicAlias]; - [properties appendUInt16BigEndian:topicAlias.unsignedIntValue]; - } - if (responseTopic) { - [properties appendByte:MQTTResponseTopic]; - [properties appendMQTTString:responseTopic]; - } - if (correlationData) { - [properties appendByte:MQTTCorrelationData]; - [properties appendBinaryData:correlationData]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - if (contentType) { - [properties appendByte:MQTTContentType]; - [properties appendMQTTString:contentType]; - } - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - [data appendData:payload]; - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPublish - qos:qosLevel - retainFlag:retain - dupFlag:dup - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)pubackMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (reasonString) { - [properties appendByte:MQTTReasonString]; - [properties appendMQTTString:reasonString]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - [data appendByte:returnCode]; - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPuback - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)pubrecMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (reasonString) { - [properties appendByte:MQTTReasonString]; - [properties appendMQTTString:reasonString]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - [data appendByte:returnCode]; - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubrec - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)pubrelMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (reasonString) { - [properties appendByte:MQTTReasonString]; - [properties appendMQTTString:reasonString]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - [data appendByte:returnCode]; - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubrel - qos:1 - data:data]; - msg.mid = msgId; - return msg; -} - -+ (MQTTMessage *)pubcompMessageWithMessageId:(UInt16)msgId - protocolLevel:(MQTTProtocolVersion)protocolLevel - returnCode:(MQTTReturnCode)returnCode - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - NSMutableData* data = [NSMutableData data]; - [data appendUInt16BigEndian:msgId]; - if (protocolLevel == MQTTProtocolVersion50) { - NSMutableData *properties = [[NSMutableData alloc] init]; - if (reasonString) { - [properties appendByte:MQTTReasonString]; - [properties appendMQTTString:reasonString]; - } - if (userProperty) { - for (NSString *key in userProperty.allKeys) { - [properties appendByte:MQTTUserProperty]; - [properties appendMQTTString:key]; - [properties appendMQTTString:userProperty[key]]; - } - } - [data appendByte:returnCode]; - [data appendVariableLength:properties.length]; - [data appendData:properties]; - } - MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubcomp - data:data]; - msg.mid = msgId; - return msg; -} - -- (instancetype)init { - self = [super init]; - self.type = 0; - self.qos = MQTTQosLevelAtMostOnce; - self.retainFlag = false; - self.mid = 0; - self.data = nil; - return self; -} - -- (instancetype)initWithType:(MQTTCommandType)type { - self = [self init]; - self.type = type; - return self; -} - -- (instancetype)initWithType:(MQTTCommandType)type - data:(NSData *)data { - self = [self init]; - self.type = type; - self.data = data; - return self; -} - -- (instancetype)initWithType:(MQTTCommandType)type - qos:(MQTTQosLevel)qos - data:(NSData *)data { - self = [self init]; - self.type = type; - self.qos = qos; - self.data = data; - return self; -} - -- (instancetype)initWithType:(MQTTCommandType)type - qos:(MQTTQosLevel)qos - retainFlag:(BOOL)retainFlag - dupFlag:(BOOL)dupFlag - data:(NSData *)data { - self = [self init]; - self.type = type; - self.qos = qos; - self.retainFlag = retainFlag; - self.dupFlag = dupFlag; - self.data = data; - return self; -} - -- (NSData *)wireFormat { - NSMutableData *buffer = [[NSMutableData alloc] init]; - - // encode fixed header - UInt8 header; - header = (self.type & 0x0f) << 4; - if (self.dupFlag) { - header |= 0x08; - } - header |= (self.qos & 0x03) << 1; - if (self.retainFlag) { - header |= 0x01; - } - [buffer appendBytes:&header length:1]; - [buffer appendVariableLength:self.data.length]; - - // encode message data - if (self.data != nil) { - [buffer appendData:self.data]; - } - - DDLogVerbose(@"[MQTTMessage] wireFormat(%lu)=%@...", - (unsigned long)buffer.length, - [buffer subdataWithRange:NSMakeRange(0, MIN(256, buffer.length))]); - - return buffer; -} - -+ (MQTTMessage *)messageFromData:(NSData *)data protocolLevel:(MQTTProtocolVersion)protocolLevel { - MQTTMessage *message = nil; - if (data.length >= 2) { - UInt8 header; - [data getBytes:&header length:sizeof(header)]; - UInt8 type = (header >> 4) & 0x0f; - UInt8 dupFlag = (header >> 3) & 0x01; - UInt8 qos = (header >> 1) & 0x03; - UInt8 retainFlag = header & 0x01; - UInt32 remainingLength = 0; - UInt32 multiplier = 1; - UInt8 offset = 1; - UInt8 digit; - do { - if (data.length < offset) { - DDLogWarn(@"[MQTTMessage] message data incomplete remaining length"); - offset = -1; - break; - } - [data getBytes:&digit range:NSMakeRange(offset, 1)]; - offset++; - remainingLength += (digit & 0x7f) * multiplier; - multiplier *= 128; - if (multiplier > 128*128*128) { - DDLogWarn(@"[MQTTMessage] message data too long remaining length"); - multiplier = -1; - break; - } - } while ((digit & 0x80) != 0); - - if (type >= MQTTConnect && - type <= MQTTDisconnect) { - if (offset > 0 && - multiplier > 0 && - data.length == remainingLength + offset) { - if ((type == MQTTPublish && (qos >= MQTTQosLevelAtMostOnce && qos <= MQTTQosLevelExactlyOnce)) || - (type == MQTTConnect && qos == 0) || - (type == MQTTConnack && qos == 0) || - (type == MQTTPuback && qos == 0) || - (type == MQTTPubrec && qos == 0) || - (type == MQTTPubrel && qos == 1) || - (type == MQTTPubcomp && qos == 0) || - (type == MQTTSubscribe && qos == 1) || - (type == MQTTSuback && qos == 0) || - (type == MQTTUnsubscribe && qos == 1) || - (type == MQTTUnsuback && qos == 0) || - (type == MQTTPingreq && qos == 0) || - (type == MQTTPingresp && qos == 0) || - (type == MQTTDisconnect && qos == 0)) { - message = [[MQTTMessage alloc] init]; - message.type = type; - message.dupFlag = dupFlag == 1; - message.retainFlag = retainFlag == 1; - message.qos = qos; - message.data = [data subdataWithRange:NSMakeRange(offset, remainingLength)]; - if ((type == MQTTPublish && - (qos == MQTTQosLevelAtLeastOnce || - qos == MQTTQosLevelExactlyOnce) - ) || - type == MQTTPuback || - type == MQTTPubrec || - type == MQTTPubrel || - type == MQTTPubcomp || - type == MQTTSubscribe || - type == MQTTSuback || - type == MQTTUnsubscribe || - type == MQTTUnsuback) { - if (message.data.length >= 2) { - [message.data getBytes:&digit range:NSMakeRange(0, 1)]; - message.mid = digit * 256; - [message.data getBytes:&digit range:NSMakeRange(1, 1)]; - message.mid += digit; - } else { - DDLogWarn(@"[MQTTMessage] missing packet identifier"); - message = nil; - } - } - if (type == MQTTPuback || - type == MQTTPubrec || - type == MQTTPubrel || - type == MQTTPubcomp) { - if (protocolLevel != MQTTProtocolVersion50) { - if (message.data.length > 2) { - DDLogWarn(@"[MQTTMessage] unexpected payload after packet identifier"); - message = nil; - } - } else { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] no returncode"); - message = nil; - } else { - const UInt8 *bytes = message.data.bytes; - message.returnCode = [NSNumber numberWithInt:bytes[2]]; - if (message.data.length >= 3) { - message.properties = [[MQTTProperties alloc] initFromData: - [message.data subdataWithRange:NSMakeRange(3, message.data.length - 3)]]; - } - } - - } - } - if (type == MQTTUnsuback ) { - if (message.data.length > 2) { - DDLogWarn(@"[MQTTMessage] unexpected payload after packet identifier"); - message = nil; - } - } - if (type == MQTTPingreq || - type == MQTTPingresp) { - if (message.data.length > 0) { - DDLogWarn(@"[MQTTMessage] unexpected payload"); - message = nil; - } - } - if (type == MQTTDisconnect) { - if (protocolLevel == MQTTProtocolVersion50) { - if (message.data.length == 0) { - message.properties = nil; - message.returnCode = @(MQTTSuccess); - } else if (message.data.length == 1) { - message.properties = nil; - const UInt8 *bytes = message.data.bytes; - message.returnCode = [NSNumber numberWithUnsignedInt:bytes[0]]; - } else if (message.data.length > 1) { - const UInt8 *bytes = message.data.bytes; - message.returnCode = [NSNumber numberWithUnsignedInt:bytes[0]]; - message.properties = [[MQTTProperties alloc] initFromData: - [message.data subdataWithRange:NSMakeRange(1, message.data.length - 1)]]; - } - } else { - if (message.data.length != 2) { - DDLogWarn(@"[MQTTMessage] unexpected payload"); - message = nil; - } - } - } - if (type == MQTTConnect) { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] missing connect variable header"); - message = nil; - } - } - if (type == MQTTConnack) { - if (protocolLevel == MQTTProtocolVersion50) { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] missing connack variable header"); - message = nil; - } - } else { - if (message.data.length != 2) { - DDLogWarn(@"[MQTTMessage] missing connack variable header"); - message = nil; - } - } - if (message) { - const UInt8 *bytes = message.data.bytes; - message.connectAcknowledgeFlags = [NSNumber numberWithUnsignedInt:bytes[0]]; - message.returnCode = [NSNumber numberWithUnsignedInt:bytes[1]]; - if (protocolLevel == MQTTProtocolVersion50) { - message.properties = [[MQTTProperties alloc] initFromData: - [message.data subdataWithRange:NSMakeRange(2, message.data.length - 2)]]; - } - } - } - if (type == MQTTSubscribe) { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] missing subscribe variable header"); - message = nil; - } - } - if (type == MQTTSuback) { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] missing suback variable header"); - message = nil; - } - } - if (type == MQTTUnsubscribe) { - if (message.data.length < 3) { - DDLogWarn(@"[MQTTMessage] missing unsubscribe variable header"); - message = nil; - } - } - } else { - DDLogWarn(@"[MQTTMessage] illegal header flags"); - } - } else { - DDLogWarn(@"[MQTTMessage] remaining data wrong length"); - } - } else { - DDLogWarn(@"[MQTTMessage] illegal message type"); - } - } else { - DDLogWarn(@"[MQTTMessage] message data length < 2"); - } - return message; -} - -@end - -@implementation NSMutableData (MQTT) - -- (void)appendByte:(UInt8)byte { - [self appendBytes:&byte length:1]; -} - -- (void)appendUInt16BigEndian:(UInt16)val { - [self appendByte:val / 256]; - [self appendByte:val % 256]; -} - -- (void)appendUInt32BigEndian:(UInt32)val { - [self appendByte:(val / (256 * 256 * 256))]; - [self appendByte:(val / (256 * 256)) & 0xff]; - [self appendByte:(val / 256) & 0xff]; - [self appendByte:val % 256]; -} - -- (void)appendVariableLength:(unsigned long)length { - do { - UInt8 digit = length % 128; - length /= 128; - if (length > 0) { - digit |= 0x80; - } - [self appendBytes:&digit length:1]; - } - while (length > 0); -} - -- (void)appendMQTTString:(NSString *)string { - if (string) { - NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; - [self appendUInt16BigEndian:data.length]; - [self appendData:data]; - } -} - -- (void)appendBinaryData:(NSData *)data { - if (data) { - [self appendUInt16BigEndian:data.length]; - [self appendData:data]; - } -} - -@end - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h deleted file mode 100644 index 30e5073..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h +++ /dev/null @@ -1,124 +0,0 @@ -// -// MQTTPersistence.h -// MQTTClient -// -// Created by Christoph Krey on 22.03.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import -#import "MQTTMessage.h" - -static BOOL const MQTT_PERSISTENT = NO; -static NSInteger const MQTT_MAX_SIZE = 64 * 1024 * 1024; -static NSInteger const MQTT_MAX_WINDOW_SIZE = 16; -static NSInteger const MQTT_MAX_MESSAGES = 1024; - -/** MQTTFlow is an abstraction of the entity to be stored for persistence */ - -@protocol MQTTFlow -/** The clientID of the flow element */ -@property (strong, nonatomic) NSString *clientId; - -/** The flag indicating incoming or outgoing flow element */ -@property (strong, nonatomic) NSNumber *incomingFlag; - -/** The flag indicating if the flow element is retained*/ -@property (strong, nonatomic) NSNumber *retainedFlag; - -/** The MQTTCommandType of the flow element, might be MQTT_None for offline queueing */ -@property (strong, nonatomic) NSNumber *commandType; - -/** The MQTTQosLevel of the flow element */ -@property (strong, nonatomic) NSNumber *qosLevel; - -/** The messageId of the flow element */ -@property (strong, nonatomic) NSNumber *messageId; - -/** The topic of the flow element */ -@property (strong, nonatomic) NSString *topic; - -/** The data of the flow element */ -@property (strong, nonatomic) NSData *data; - -/** The deadline of the flow elelment before (re)trying transmission */ -@property (strong, nonatomic) NSDate *deadline; - -@end - -/** The MQTTPersistence protocol is an abstraction of persistence classes for MQTTSession */ - -@protocol MQTTPersistence - -/** The maximum Window Size for outgoing inflight messages per clientID. Defaults to 16 */ -@property (nonatomic) NSUInteger maxWindowSize; - -/** The maximum number of messages kept per clientID and direction. Defaults to 1024 */ -@property (nonatomic) NSUInteger maxMessages; - -/** Indicates if the persistence implementation should make the information permannent. Defaults to NO */ -@property (nonatomic) BOOL persistent; - -/** The maximum size of the storage used for persistence in total in bytes. Defaults to 1024*1024 bytes */ -@property (nonatomic) NSUInteger maxSize; - -/** The current Window Size for outgoing inflight messages per clientID. - * @param clientId identifying the session - * @return the current size of the outgoing inflight window - */ -- (NSUInteger)windowSize:(NSString *)clientId; - -/** Stores one new message - * @param clientId identifying the session - * @param topic the topic of the message - * @param data the message's data - * @param retainFlag the retain flag of the message - * @param qos the quality of service of the message - * @param msgId the id of the message or zero for qos zero - * @param incomingFlag the direction of the message - * @param commandType the command of the message - * @param deadline the deadline of the message for repetitions - * @return the created MQTTFlow element or nil if the maxWindowSize has been exceeded - */ -- (id)storeMessageForClientId:(NSString *)clientId - topic:(NSString *)topic - data:(NSData *)data - retainFlag:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - msgId:(UInt16)msgId - incomingFlag:(BOOL)incomingFlag - commandType:(UInt8)commandType - deadline:(NSDate *)deadline; - -/** Deletes an MQTTFlow element - * @param flow the MQTTFlow to delete - */ -- (void)deleteFlow:(id)flow; - -/** Deletes all MQTTFlow elements of a clientId - * @param clientId the client Id identifying all MQTTFlows to be deleted - */ -- (void)deleteAllFlowsForClientId:(NSString *)clientId; - -/** Retrieves all MQTTFlow elements of a clientId and direction - * @param clientId whos MQTTFlows should be retrieved - * @param incomingFlag specifies the wether incoming or outgoing flows should be retrieved - * @return an NSArray of the retrieved MQTTFlow elements - */ -- (NSArray *)allFlowsforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag; - -/** Retrieves an MQTTFlow element - * @param clientId to which the MQTTFlow belongs to - * @param incomingFlag specifies the direction of the flow - * @param messageId specifies the message Id of the flow - * @return the retrieved MQTTFlow element or nil if the elememt was not found - */ -- (id)flowforClientId:(NSString *)clientId - incomingFlag:(BOOL)incomingFlag - messageId:(UInt16)messageId; - -/** sync is called to allow the MQTTPersistence implemetation to save data permanently */ -- (void)sync; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h deleted file mode 100644 index cd45531..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h +++ /dev/null @@ -1,76 +0,0 @@ -// -// MQTTProperties.h -// MQTTClient -// -// Created by Christoph Krey on 04.04.17. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import - -typedef NS_ENUM(UInt8, MQTTPropertyIdentifier) { - MQTTPayloadFormatIndicator = 1, - MQTTPublicationExpiryInterval = 2, - MQTTContentType = 3, - MQTTResponseTopic = 8, - MQTTCorrelationData = 9, - MQTTSubscriptionIdentifier = 11, - MQTTSessionExpiryInterval = 17, - MQTTAssignedClientIdentifier = 18, - MQTTServerKeepAlive = 19, - MQTTAuthMethod = 21, - MQTTAuthData = 22, - MQTTRequestProblemInformation = 23, - MQTTWillDelayInterval = 24, - MQTTRequestResponseInformation = 25, - MQTTResponseInformation = 26, - MQTTServerReference = 28, - MQTTReasonString = 31, - MQTTReceiveMaximum = 33, - MQTTTopicAliasMaximum = 34, - MQTTTopicAlias = 35, - MQTTMaximumQoS = 36, - MQTTRetainAvailable = 37, - MQTTUserProperty = 38, - MQTTMaximumPacketSize = 39, - MQTTWildcardSubscriptionAvailable = 40, - MQTTSubscriptionIdentifiersAvailable = 41, - MQTTSharedSubscriptionAvailable = 42 -}; - - -@interface MQTTProperties : NSObject - -@property (strong, nonatomic) NSNumber *payloadFormatIndicator; -@property (strong, nonatomic) NSNumber *publicationExpiryInterval; -@property (strong, nonatomic) NSString *contentType; -@property (strong, nonatomic) NSString *responseTopic; -@property (strong, nonatomic) NSData *correlationData; -@property (strong, nonatomic) NSNumber *subscriptionIdentifier; -@property (strong, nonatomic) NSNumber *sessionExpiryInterval; -@property (strong, nonatomic) NSString *assignedClientIdentifier; -@property (strong, nonatomic) NSNumber *serverKeepAlive; -@property (strong, nonatomic) NSString *authMethod; -@property (strong, nonatomic) NSData *authData; -@property (strong, nonatomic) NSNumber *requestProblemInformation; -@property (strong, nonatomic) NSNumber *willDelayInterval; -@property (strong, nonatomic) NSNumber *requestResponseInformation; -@property (strong, nonatomic) NSString *responseInformation; -@property (strong, nonatomic) NSString *serverReference; -@property (strong, nonatomic) NSString *reasonString; -@property (strong, nonatomic) NSNumber *receiveMaximum; -@property (strong, nonatomic) NSNumber *topicAliasMaximum; -@property (strong, nonatomic) NSNumber *topicAlias; -@property (strong, nonatomic) NSNumber *maximumQoS; -@property (strong, nonatomic) NSNumber *retainAvailable; -@property (strong, nonatomic) NSMutableDictionary *userProperty; -@property (strong, nonatomic) NSNumber *maximumPacketSize; -@property (strong, nonatomic) NSNumber *wildcardSubscriptionAvailable; -@property (strong, nonatomic) NSNumber *subscriptionIdentifiersAvailable; -@property (strong, nonatomic) NSNumber *sharedSubscriptionAvailable; - -- (instancetype)initFromData:(NSData *)data NS_DESIGNATED_INITIALIZER; -+ (int)getVariableLength:(NSData *)data; -+ (int)variableIntLength:(int)length; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m deleted file mode 100644 index c27ae66..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m +++ /dev/null @@ -1,336 +0,0 @@ -// -// MQTTProperties.m -// MQTTClient -// -// Created by Christoph Krey on 04.04.17. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import "MQTTProperties.h" - -@implementation MQTTProperties - -- (instancetype)init { - return [self initFromData:[[NSData alloc] init]]; -} -- (instancetype)initFromData:(NSData *)data { - self = [super init]; - - int propertyLength = [MQTTProperties getVariableLength:data]; - int offset = [MQTTProperties variableIntLength:propertyLength]; - NSData *remainingData = [data subdataWithRange:NSMakeRange(offset, data.length - offset)]; - offset = 0; - if (remainingData.length >= propertyLength) { - while (propertyLength - offset > 0) { - const UInt8 *bytes = remainingData.bytes; - UInt8 propertyType = bytes[offset]; - switch (propertyType) { - case MQTTPayloadFormatIndicator: - if (propertyLength - offset > 1) { - self.payloadFormatIndicator = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - case MQTTPublicationExpiryInterval: - if (propertyLength - offset > 4) { - self.publicationExpiryInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 5; - } - break; - case MQTTContentType: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.contentType = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - case MQTTResponseTopic: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.responseTopic = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - case MQTTCorrelationData: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.correlationData = [MQTTProperties getBinaryData:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - case MQTTSubscriptionIdentifier: - if (propertyLength - offset > 1) { - int subscriptionIdentifier = [MQTTProperties getVariableLength:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - int l = [MQTTProperties variableIntLength:subscriptionIdentifier]; - self.subscriptionIdentifier = @(subscriptionIdentifier); - offset += 1 + l; - - } - break; - - case MQTTSessionExpiryInterval: - if (propertyLength - offset > 4) { - self.sessionExpiryInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 5; - } - break; - case MQTTAssignedClientIdentifier: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.assignedClientIdentifier = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTServerKeepAlive: - if (propertyLength - offset > 2) { - self.serverKeepAlive = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 3; - } - break; - - case MQTTAuthMethod: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.authMethod = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTAuthData: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.authData = [MQTTProperties getBinaryData:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTRequestProblemInformation: - if (propertyLength - offset > 1) { - self.requestProblemInformation = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTWillDelayInterval: - if (propertyLength - offset > 4) { - self.willDelayInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 5; - } - break; - - case MQTTRequestResponseInformation: - if (propertyLength - offset > 1) { - self.requestResponseInformation = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTResponseInformation: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.responseInformation = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTServerReference: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.serverReference = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTReasonString: - if (propertyLength - offset > 2) { - int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - self.reasonString = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - offset += 1 + 2 + l; - } - break; - - - case MQTTReceiveMaximum: - if (propertyLength - offset > 2) { - self.receiveMaximum = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 3; - } - break; - - case MQTTTopicAliasMaximum: - if (propertyLength - offset > 2) { - self.topicAliasMaximum = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 3; - } - break; - - case MQTTTopicAlias: - if (propertyLength - offset > 2) { - self.topicAlias = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 3; - } - break; - - case MQTTMaximumQoS: - if (propertyLength - offset > 1) { - self.maximumQoS = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTRetainAvailable: - if (propertyLength - offset > 1) { - self.retainAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTUserProperty: - if (propertyLength - offset > 4) { - int keyL = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - NSString *key = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; - - int valueL = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1 + 2 + keyL, remainingData.length - (offset + 1))]]; - - NSString *value = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1 + 2 + keyL, remainingData.length - (offset + 1))]]; - - if (!self.userProperty) { - self.userProperty = [[NSMutableDictionary alloc] init]; - } - self.userProperty[key] = value; - offset += 1 + 2 + keyL + 2 + valueL; - } - break; - - case MQTTMaximumPacketSize: - if (propertyLength - offset > 4) { - self.maximumPacketSize = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); - offset += 5; - } - break; - - case MQTTWildcardSubscriptionAvailable: - if (propertyLength - offset > 1) { - self.wildcardSubscriptionAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTSubscriptionIdentifiersAvailable: - if (propertyLength - offset > 1) { - self.subscriptionIdentifiersAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - case MQTTSharedSubscriptionAvailable: - if (propertyLength - offset > 1) { - self.sharedSubscriptionAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; - offset += 2; - } - break; - - default: - return self; - } - } - } - return self; -} - -+ (int)getVariableLength:(NSData *)data { - int length = 0; - int offset = 0; - int multiplier = 1; - UInt8 digit; - - do { - if (data.length < offset) { - return -1; - } - [data getBytes:&digit range:NSMakeRange(offset, 1)]; - offset++; - length += (digit & 0x7f) * multiplier; - multiplier *= 128; - if (multiplier > 128 * 128 * 128) { - return -2; - } - } while ((digit & 0x80) != 0); - return length; -} - -+ (int)getTwoByteInt:(NSData *)data { - int i = 0; - if (data.length >= 2) { - const UInt8 *bytes = data.bytes; - i = bytes[0] * 256 + - bytes[1]; - } - return i; -} - -+ (int)getFourByteInt:(NSData *)data { - int i = 0; - if (data.length >= 4) { - const UInt8 *bytes = data.bytes; - i = bytes[0] * 256 * 256 * 256 + - bytes[1] * 256 * 256 + - bytes[2] * 256 + - bytes[3]; - } - return i; -} - -+ (NSString *)getUtf8String:(NSData *)data { - NSString *s; - int l = [MQTTProperties getTwoByteInt:data]; - if (data.length >= l + 2) { - s = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(2, l)] encoding:NSUTF8StringEncoding]; - } - return s; -} - -+ (NSData *)getBinaryData:(NSData *)data { - NSData *d; - int l = [MQTTProperties getTwoByteInt:data]; - if (data.length >= l + 2) { - d = [data subdataWithRange:NSMakeRange(2, l)]; - } - return d; -} - -+ (int)variableIntLength:(int)length { - int l = 0; - if (length <= 127) { - l = 1; - } else if (length <= 16383) { - l = 2; - } else if (length <= 2097151) { - l = 3; - } else if (length <= 268435455) { - l = 4; - } - return l; -} -@end - - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h deleted file mode 100644 index a12475c..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h +++ /dev/null @@ -1,158 +0,0 @@ -// -// MQTTSSLSecurityPolicy.h -// MQTTClient.framework -// -// Created by @bobwenx on 15/6/1. -// -// based on -// -// Copyright (c) 2011–2015 AFNetwork (http://alamofire.org/) -// -// Permission 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: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE 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. - -#import -#import - -/** -## SSL Pinning Modes - -The following constants are provided by `MQTTSSLPinningModeNone` as possible SSL pinning modes. - -enum { -MQTTSSLPinningModeNone, -MQTTSSLPinningModePublicKey, -MQTTSSLPinningModeCertificate, -} - -`MQTTSSLPinningModeNone` -Do not used pinned certificates to validate servers. - -`MQTTSSLPinningModePublicKey` -Validate host certificates against public keys of pinned certificates. - -`MQTTSSLPinningModeCertificate` -Validate host certificates against pinned certificates. -*/ -typedef NS_ENUM(NSUInteger, MQTTSSLPinningMode) { - // Do not used pinned certificates to validate servers. - MQTTSSLPinningModeNone, - // Validate host certificates against public keys of pinned certificates. - MQTTSSLPinningModePublicKey, - // Validate host certificates against pinned certificates. - MQTTSSLPinningModeCertificate, -}; - -/** -`MQTTSSLSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. - -If your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks -and other vulnerabilities. you need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). - -NOTE: about self-signed server certificates: -if your server using Self-signed certificates to establish SSL/TLS connection, you need to set property: -MQTTSSLSecurityPolicy.allowInvalidCertificates=YES. - -If SSL is enabled, by default it only evaluate server's certificates using CA infrastructure, and for most case, this type of check is enough. -However, if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks -and other vulnerabilities. you may need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). - -NOTE: about self-signed server certificates: -In CA infrastructure, you may establish a SSL/TLS connection with server which using self-signed certificates -by install the certificates into OS keychain(either programmatically or manually). however, this method has some disadvantages: -1. every socket you app created will trust certificates you added. -2. if user choice to remove certificates from keychain, you app need to handling certificates re-adding. - -If you only want to verify the cert for the socket you are creating and for no other sockets in your app, you need to use -MQTTSSLSecurityPolicy. -And if you use self-signed server certificates, your need to set property: MQTTSSLSecurityPolicy.allowInvalidCertificates=YES - -Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. -Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication -over an SSL/TLS connection with SSL pinning configured and enabled. -*/ -@interface MQTTSSLSecurityPolicy : NSObject -/** -The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `MQTTSSLPinningMode`. -*/ -@property (readonly, nonatomic, assign) MQTTSSLPinningMode SSLPinningMode; - -/** -Whether to evaluate an entire SSL certificate chain, or just the leaf certificate. Defaults to `YES`. -*/ -@property (nonatomic, assign) BOOL validatesCertificateChain; - -/** -The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. -Note: Array item type: NSData - Bytes of X.509 certificate file in der format. -Note that if you create an array with duplicate certificates, the duplicate certificates will be removed. -*/ -@property (nonatomic, strong) NSArray *pinnedCertificates; - -/** -Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. -Note: If your server-certificates are self signed, your should set this property to 'YES'. -*/ -@property (nonatomic, assign) BOOL allowInvalidCertificates; - -/** -Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES`. -*/ -@property (nonatomic, assign) BOOL validatesDomainName; - -///----------------------------------------- -/// @name Getting Specific Security Policies -///----------------------------------------- - -/** -Returns the shared default security policy, which does not allow invalid certificates, validates domain name, and does not validate against pinned certificates or public keys. - -@return The default security policy. -*/ -+ (instancetype)defaultPolicy; - -///--------------------- -/// @name Initialization -///--------------------- - -/** -Creates and returns a security policy with the specified pinning mode. - -@param pinningMode The SSL pinning mode. - -@return A new security policy. -*/ -+ (instancetype)policyWithPinningMode:(MQTTSSLPinningMode)pinningMode; - -///------------------------------ -/// @name Evaluating Server Trust -///------------------------------ - -/** -Whether or not the specified server trust should be accepted, based on the security policy. - -This method should be used when responding to an authentication challenge from a server. - -@param serverTrust The X.509 certificate trust of the server. -@param domain The domain of serverTrust. If `nil`, the domain will not be validated. - -@return Whether or not to trust the server. -*/ -- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust - forDomain:(NSString *)domain; -@end \ No newline at end of file diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m deleted file mode 100644 index e62156e..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m +++ /dev/null @@ -1,297 +0,0 @@ -// -// MQTTSSLSecurityPolicy.m -// MQTTClient.framework -// -// Created by @bobwenx on 15/6/1. -// -// based on -// -// Copyright (c) 2011–2015 AFNetwork (http://alamofire.org/) -// -// Permission 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: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE 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. - -#import "MQTTSSLSecurityPolicy.h" -#import - -#import "MQTTLog.h" - -static BOOL SSLSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { - return [(__bridge id) key1 isEqual:(__bridge id) key2]; -} - -static id SSLPublicKeyForCertificate(NSData *certificate) { - id allowedPublicKey = nil; - SecCertificateRef allowedCertificate; - SecCertificateRef allowedCertificates[1]; - CFArrayRef tempCertificates = nil; - SecPolicyRef policy = nil; - SecTrustRef allowedTrust = nil; - SecTrustResultType result; - - allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); - __Require_Quiet(allowedCertificate != NULL, _out); - - allowedCertificates[0] = allowedCertificate; - tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); - - policy = SecPolicyCreateBasicX509(); - __Require_noErr_Quiet(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); - __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); - - allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); - - _out: - if (allowedTrust) { - CFRelease(allowedTrust); - } - - if (policy) { - CFRelease(policy); - } - - if (tempCertificates) { - CFRelease(tempCertificates); - } - - if (allowedCertificate) { - CFRelease(allowedCertificate); - } - - return allowedPublicKey; -} - -static BOOL SSLServerTrustIsValid(SecTrustRef serverTrust) { - BOOL isValid = NO; - SecTrustResultType result; - __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); - - isValid = (result == kSecTrustResultUnspecified // The OS trusts this certificate implicitly. - || result == kSecTrustResultProceed); // The user explicitly told the OS to trust it. - - // else? It's somebody else's key. Fall immediately. - - _out: - return isValid; -} - -static NSArray * SSLCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { - CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); - NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; - - for (CFIndex i = 0; i < certificateCount; i++) { - SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); - [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; - } - - return [NSArray arrayWithArray:trustChain]; -} - -static NSArray * SSLPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { - SecPolicyRef policy = SecPolicyCreateBasicX509(); - CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); - NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; - for (CFIndex i = 0; i < certificateCount; i++) { - SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); - - SecCertificateRef someCertificates[] = {certificate}; - CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); - - SecTrustRef trust; - __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); - - SecTrustResultType result; - __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); - - [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; - - _out: - if (trust) { - CFRelease(trust); - } - - if (certificates) { - CFRelease(certificates); - } - - continue; - } - CFRelease(policy); - - return [NSArray arrayWithArray:trustChain]; -} - -@interface MQTTSSLSecurityPolicy() -@property (readwrite, nonatomic, assign) MQTTSSLPinningMode SSLPinningMode; -@property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; -@end - -@implementation MQTTSSLSecurityPolicy - -#pragma mark - SSL Security Policy - -+ (NSArray *)defaultPinnedCertificates { - static NSArray *_defaultPinnedCertificates = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSBundle *bundle = [NSBundle bundleForClass:[self class]]; - NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; - - NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:paths.count]; - for (NSString *path in paths) { - NSData *certificateData = [NSData dataWithContentsOfFile:path]; - [certificates addObject:certificateData]; - } - - _defaultPinnedCertificates = [[NSArray alloc] initWithArray:certificates]; - }); - - return _defaultPinnedCertificates; -} - -+ (instancetype)defaultPolicy { - MQTTSSLSecurityPolicy *securityPolicy = [[self alloc] init]; - securityPolicy.SSLPinningMode = MQTTSSLPinningModeNone; - - return securityPolicy; -} - -+ (instancetype)policyWithPinningMode:(MQTTSSLPinningMode)pinningMode { - MQTTSSLSecurityPolicy *securityPolicy = [[self alloc] init]; - securityPolicy.SSLPinningMode = pinningMode; - - securityPolicy.pinnedCertificates = [self defaultPinnedCertificates]; - - return securityPolicy; -} - -- (instancetype)init { - self = [super init]; - if (!self) { - return nil; - } - - self.validatesCertificateChain = YES; - self.validatesDomainName = YES; - - return self; -} - -- (void)setPinnedCertificates:(NSArray *)pinnedCertificates { - _pinnedCertificates = [NSOrderedSet orderedSetWithArray:pinnedCertificates].array; - - if (self.pinnedCertificates) { - NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:(self.pinnedCertificates).count]; - for (NSData *certificate in self.pinnedCertificates) { - id publicKey = SSLPublicKeyForCertificate(certificate); - if (!publicKey) { - continue; - } - [mutablePinnedPublicKeys addObject:publicKey]; - } - self.pinnedPublicKeys = [NSArray arrayWithArray:mutablePinnedPublicKeys]; - } else { - self.pinnedPublicKeys = nil; - } -} - -- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust - forDomain:(NSString *)domain -{ - NSMutableArray *policies = [NSMutableArray array]; - if (self.validatesDomainName) { - [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; - } else { - [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; - } - - SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); - - if (self.SSLPinningMode == MQTTSSLPinningModeNone) { - return self.allowInvalidCertificates || SSLServerTrustIsValid(serverTrust); - } - // if client didn't allow invalid certs, it must pass CA infrastructure - // TODO: Can we change order here? - else if (!SSLServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { - return NO; - } - - NSArray *serverCertificates = SSLCertificateTrustChainForServerTrust(serverTrust); - switch (self.SSLPinningMode) { - case MQTTSSLPinningModeNone: - default: - return NO; - case MQTTSSLPinningModeCertificate: { - NSMutableArray *pinnedCertificates = [NSMutableArray array]; - for (NSData *certificateData in self.pinnedCertificates) { - @try { - [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; - } @catch (NSException *exception) { - //fix issue #151, if the pinnedCertification is not a valid DER-encoded X.509 certificate, for example it is the PEM format, SecCertificateCreateWithData will return nil, and application will crash - if ([exception.name isEqual:NSInvalidArgumentException]) { - return NO; - } - } - } - SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); - - if (!SSLServerTrustIsValid(serverTrust)) { - return NO; - } - - if (!self.validatesCertificateChain) { - return YES; - } - - NSUInteger trustedCertificateCount = 0; - for (NSData *trustChainCertificate in serverCertificates) { - if ([self.pinnedCertificates containsObject:trustChainCertificate]) { - trustedCertificateCount++; - } - } - - return trustedCertificateCount == serverCertificates.count; - } - case MQTTSSLPinningModePublicKey: { - NSUInteger trustedPublicKeyCount = 0; - NSArray *publicKeys = SSLPublicKeyTrustChainForServerTrust(serverTrust); - if (!self.validatesCertificateChain && publicKeys.count > 0) { - publicKeys = @[publicKeys.firstObject]; - } - - for (id trustChainPublicKey in publicKeys) { - for (id pinnedPublicKey in self.pinnedPublicKeys) { - if (SSLSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { - trustedPublicKeyCount += 1; - } - } - } - - return trustedPublicKeyCount > 0 && ((self.validatesCertificateChain && trustedPublicKeyCount == serverCertificates.count) || (!self.validatesCertificateChain && trustedPublicKeyCount >= 1)); - } - } - - return NO; -} - -#pragma mark - NSKeyValueObserving - -+ (NSSet *)keyPathsForValuesAffectingPinnedPublicKeys { - return [NSSet setWithObject:@"pinnedCertificates"]; -} -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h deleted file mode 100644 index f14be3e..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// MQTTSSLSecurityPolicyDecoder.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import -#import "MQTTSSLSecurityPolicy.h" -#import "MQTTCFSocketDecoder.h" - -@interface MQTTSSLSecurityPolicyDecoder : MQTTCFSocketDecoder - -@property(strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; -@property(strong, nonatomic) NSString *securityDomain; - -@end - - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m deleted file mode 100644 index a45e25b..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m +++ /dev/null @@ -1,60 +0,0 @@ -// -// MQTTSSLSecurityPolicyDecoder.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import "MQTTSSLSecurityPolicyDecoder.h" - -#import "MQTTLog.h" - -@interface MQTTSSLSecurityPolicyDecoder() -@property (nonatomic) BOOL securityPolicyApplied; - -@end - -@implementation MQTTSSLSecurityPolicyDecoder - -- (instancetype)init { - self = [super init]; - self.securityPolicy = nil; - self.securityDomain = nil; - - return self; -} - -- (BOOL)applySSLSecurityPolicy:(NSStream *)readStream withEvent:(NSStreamEvent)eventCode{ - if (!self.securityPolicy) { - return YES; - } - - if (self.securityPolicyApplied) { - return YES; - } - - SecTrustRef serverTrust = (__bridge SecTrustRef) [readStream propertyForKey: (__bridge NSString *)kCFStreamPropertySSLPeerTrust]; - if (!serverTrust) { - return NO; - } - - self.securityPolicyApplied = [self.securityPolicy evaluateServerTrust:serverTrust forDomain:self.securityDomain]; - return self.securityPolicyApplied; -} - -- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { - if (eventCode & NSStreamEventHasBytesAvailable) { - DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); - if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){ - self.state = MQTTCFSocketDecoderStateError; - self.error = [NSError errorWithDomain:@"MQTT" - code:errSSLXCertChainInvalid - userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}]; - [self.delegate decoder:self didFailWithError:self.error]; - return; - } - } - [super stream:sender handleEvent:eventCode]; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h deleted file mode 100644 index 341e39d..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// MQTTSSLSecurityPolicyEncoder.h -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import -#import "MQTTSSLSecurityPolicy.h" -#import "MQTTCFSocketEncoder.h" - -@interface MQTTSSLSecurityPolicyEncoder : MQTTCFSocketEncoder - -@property(strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; -@property(strong, nonatomic) NSString *securityDomain; - -@end - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m deleted file mode 100644 index dd0470e..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m +++ /dev/null @@ -1,60 +0,0 @@ -// -// MQTTSSLSecurityPolicyEncoder.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -#import "MQTTSSLSecurityPolicyEncoder.h" - -#import "MQTTLog.h" - -@interface MQTTSSLSecurityPolicyEncoder() -@property (nonatomic) BOOL securityPolicyApplied; - -@end - -@implementation MQTTSSLSecurityPolicyEncoder - -- (instancetype)init { - self = [super init]; - self.securityPolicy = nil; - self.securityDomain = nil; - - return self; -} - -- (BOOL)applySSLSecurityPolicy:(NSStream *)writeStream withEvent:(NSStreamEvent)eventCode { - if (!self.securityPolicy) { - return YES; - } - - if (self.securityPolicyApplied) { - return YES; - } - - SecTrustRef serverTrust = (__bridge SecTrustRef)[writeStream propertyForKey:(__bridge NSString *)kCFStreamPropertySSLPeerTrust]; - if (!serverTrust) { - return NO; - } - - self.securityPolicyApplied = [self.securityPolicy evaluateServerTrust:serverTrust forDomain:self.securityDomain]; - return self.securityPolicyApplied; -} - -- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { - if (eventCode & NSStreamEventHasSpaceAvailable) { - DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasSpaceAvailable"); - if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){ - self.state = MQTTCFSocketEncoderStateError; - self.error = [NSError errorWithDomain:@"MQTT" - code:errSSLXCertChainInvalid - userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}]; - [self.delegate encoder:self didFailWithError:self.error]; - return; - } - } - [super stream:sender handleEvent:eventCode]; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h deleted file mode 100644 index 9e9b9ae..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// MQTTSSLSecurityPolicyTransport.h -// MQTTClient -// -// Created by Christoph Krey on 06.12.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTTransport.h" -#import "MQTTSSLSecurityPolicy.h" -#import "MQTTCFSocketTransport.h" - -/** MQTTSSLSecurityPolicyTransport - * implements an extension of the MQTTCFSocketTransport by replacing the OS's certificate chain evaluation - */ -@interface MQTTSSLSecurityPolicyTransport : MQTTCFSocketTransport - -/** - * The security policy used to evaluate server trust for secure connections. - * - * if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks - * and other vulnerabilities. you need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). - * - * NOTE: about self-signed server certificates: - * if your server using Self-signed certificates to establish SSL/TLS connection, you need to set property: - * MQTTSSLSecurityPolicy.allowInvalidCertificates=YES. - */ -@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m deleted file mode 100644 index 6698efb..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m +++ /dev/null @@ -1,98 +0,0 @@ -// -// MQTTSSLSecurityPolicyTransport.m -// MQTTClient -// -// Created by Christoph Krey on 06.12.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTSSLSecurityPolicyTransport.h" -#import "MQTTSSLSecurityPolicyEncoder.h" -#import "MQTTSSLSecurityPolicyDecoder.h" - -#import "MQTTLog.h" - -@interface MQTTSSLSecurityPolicyTransport() -@property (strong, nonatomic) MQTTSSLSecurityPolicyEncoder *encoder; -@property (strong, nonatomic) MQTTSSLSecurityPolicyDecoder *decoder; - -@end - -@implementation MQTTSSLSecurityPolicyTransport -@synthesize state; -@synthesize delegate; - -- (instancetype)init { - self = [super init]; - self.securityPolicy = nil; - return self; -} - -- (void)open { - DDLogVerbose(@"[MQTTSSLSecurityPolicyTransport] open"); - self.state = MQTTTransportOpening; - - NSError* connectError; - - CFReadStreamRef readStream; - CFWriteStreamRef writeStream; - - CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.host, self.port, &readStream, &writeStream); - - CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); - CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); - - if (self.tls) { - NSMutableDictionary *sslOptions = [[NSMutableDictionary alloc] init]; - - // Delegate certificates verify operation to our secure policy. - // by disabling chain validation, it becomes our responsibility to verify that the host at the other end can be trusted. - // the server's certificates will be verified during MQTT encoder/decoder processing. - sslOptions[(NSString *)kCFStreamSSLValidatesCertificateChain] = @NO; - sslOptions[(NSString *)kCFStreamSSLLevel] = self.streamSSLLevel; - - if (self.certificates) { - sslOptions[(NSString *)kCFStreamSSLCertificates] = self.certificates; - } - - if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))){ - connectError = [NSError errorWithDomain:@"MQTT" - code:errSSLInternal - userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl input stream!"}]; - } - if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))){ - connectError = [NSError errorWithDomain:@"MQTT" - code:errSSLInternal - userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl output stream!"}]; - } - } - - if (!connectError) { - self.encoder = [[MQTTSSLSecurityPolicyEncoder alloc] init]; - CFWriteStreamSetDispatchQueue(writeStream, self.queue); - self.encoder.stream = CFBridgingRelease(writeStream); - self.encoder.securityPolicy = self.tls ? self.securityPolicy : nil; - self.encoder.securityDomain = self.tls ? self.host : nil; - self.encoder.delegate = self; - if (self.voip) { - [self.encoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; - } - [self.encoder open]; - - self.decoder = [[MQTTSSLSecurityPolicyDecoder alloc] init]; - CFReadStreamSetDispatchQueue(readStream, self.queue); - self.decoder.stream = CFBridgingRelease(readStream); - self.decoder.securityPolicy = self.tls ? self.securityPolicy : nil; - self.decoder.securityDomain = self.tls ? self.host : nil; - self.decoder.delegate = self; - if (self.voip) { - [self.decoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; - } - [self.decoder open]; - - } else { - [self close]; - } -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h deleted file mode 100644 index 61b627a..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h +++ /dev/null @@ -1,886 +0,0 @@ -// -// MQTTSession.h -// MQTTClient.framework -// - -/** - Using MQTT in your Objective-C application - - @author Christoph Krey c@ckrey.de - @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. - - based on Copyright (c) 2011, 2013, 2lemetry LLC - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html - - @see http://mqtt.org - */ - - -#import - -#import "MQTTMessage.h" -#import "MQTTPersistence.h" -#import "MQTTTransport.h" - -@class MQTTSession; -@class MQTTSSLSecurityPolicy; - -/** - Enumeration of MQTTSession states - */ -typedef NS_ENUM(NSInteger, MQTTSessionStatus) { - MQTTSessionStatusCreated, - MQTTSessionStatusConnecting, - MQTTSessionStatusConnected, - MQTTSessionStatusDisconnecting, - MQTTSessionStatusClosed, - MQTTSessionStatusError -}; - -/** - Enumeration of MQTTSession events - */ -typedef NS_ENUM(NSInteger, MQTTSessionEvent) { - MQTTSessionEventConnected, - MQTTSessionEventConnectionRefused, - MQTTSessionEventConnectionClosed, - MQTTSessionEventConnectionError, - MQTTSessionEventProtocolError, - MQTTSessionEventConnectionClosedByBroker -}; - -/** - The error domain used for all errors created by MQTTSession - */ -extern NSString * const MQTTSessionErrorDomain; - -/** - The error codes used for all errors created by MQTTSession - */ -typedef NS_ENUM(NSInteger, MQTTSessionError) { - MQTTSessionErrorConnectionRefused = -8, // Sent if the server closes the connection without sending an appropriate error CONNACK - MQTTSessionErrorIllegalMessageReceived = -7, - MQTTSessionErrorDroppingOutgoingMessage = -6, // For some reason the value is the same as for MQTTSessionErrorNoResponse - MQTTSessionErrorNoResponse = -6, // For some reason the value is the same as for MQTTSessionErrorDroppingOutgoingMessage - MQTTSessionErrorEncoderNotReady = -5, - MQTTSessionErrorInvalidConnackReceived = -2, // Sent if the message received from server was an invalid connack message - MQTTSessionErrorNoConnackReceived = -1, // Sent if first message received from server was no connack message - - MQTTSessionErrorConnackUnacceptableProtocolVersion = 1, // Value as defined by MQTT Protocol - MQTTSessionErrorConnackIdentifierRejected = 2, // Value as defined by MQTT Protocol - MQTTSessionErrorConnackServeUnavailable = 3, // Value as defined by MQTT Protocol - MQTTSessionErrorConnackBadUsernameOrPassword = 4, // Value as defined by MQTT Protocol - MQTTSessionErrorConnackNotAuthorized = 5, // Value as defined by MQTT Protocol - MQTTSessionErrorConnackReserved = 6, // Should be value 6-255, as defined by MQTT Protocol -}; - -/** Session delegate gives your application control over the MQTTSession - @note all callback methods are optional - */ - -@protocol MQTTSessionDelegate - -@optional - -/** gets called when a new message was received - @param session the MQTTSession reporting the new message - @param data the data received, might be zero length - @param topic the topic the data was published to - @param qos the qos of the message - @param retained indicates if the data retransmitted from server storage - @param mid the Message Identifier of the message if qos = 1 or 2, zero otherwise - */ -- (void)newMessage:(MQTTSession *)session - data:(NSData *)data - onTopic:(NSString *)topic - qos:(MQTTQosLevel)qos - retained:(BOOL)retained - mid:(unsigned int)mid; - -/** gets called when a new message was received - @param session the MQTTSession reporting the new message - @param data the data received, might be zero length - @param topic the topic the data was published to - @param qos the qos of the message - @param retained indicates if the data retransmitted from server storage - @param mid the Message Identifier of the message if qos = 1 or 2, zero otherwise - @return true if the message was or will be processed, false if the message shall not be ack-ed - */ -- (BOOL)newMessageWithFeedback:(MQTTSession *)session - data:(NSData *)data - onTopic:(NSString *)topic - qos:(MQTTQosLevel)qos - retained:(BOOL)retained - mid:(unsigned int)mid; - -/** for mqttio-OBJC backward compatibility - @param session see newMessage for description - @param data see newMessage for description - @param topic see newMessage for description - */ -- (void)session:(MQTTSession*)session newMessage:(NSData*)data onTopic:(NSString*)topic; - -/** gets called when a connection is established, closed or a problem occurred - @param session the MQTTSession reporting the event - @param eventCode the code of the event - @param error an optional additional error object with additional information - */ -- (void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error; - -/** for mqttio-OBJC backward compatibility - @param session the MQTTSession reporting the event - @param eventCode the code of the event - */ -- (void)session:(MQTTSession*)session handleEvent:(MQTTSessionEvent)eventCode; - -/** gets called when a connection has been successfully established - @param session the MQTTSession reporting the connect - - */ -- (void)connected:(MQTTSession *)session; - -/** gets called when a connection has been successfully established - @param session the MQTTSession reporting the connect - @param sessionPresent represents the Session Present flag sent by the broker - - */ -- (void)connected:(MQTTSession *)session sessionPresent:(BOOL)sessionPresent; - -/** gets called when a connection has been refused - @param session the MQTTSession reporting the refusal - @param error an optional additional error object with additional information - */ -- (void)connectionRefused:(MQTTSession *)session error:(NSError *)error; - -/** gets called when a connection has been closed - @param session the MQTTSession reporting the close - - */ -- (void)connectionClosed:(MQTTSession *)session; - -/** gets called when a connection error happened - @param session the MQTTSession reporting the connect error - @param error an optional additional error object with additional information - */ -- (void)connectionError:(MQTTSession *)session error:(NSError *)error; - -/** gets called when an MQTT protocol error happened - @param session the MQTTSession reporting the protocol error - @param error an optional additional error object with additional information - */ -- (void)protocolError:(MQTTSession *)session error:(NSError *)error; - -/** gets called when a published message was actually delivered - @param session the MQTTSession reporting the delivery - @param msgID the Message Identifier of the delivered message - @note this method is called after a publish with qos 1 or 2 only - */ -- (void)messageDelivered:(MQTTSession *)session msgID:(UInt16)msgID; - -/** gets called when a published message was actually delivered - @param session the MQTTSession reporting the delivery - @param msgID the Message Identifier of the delivered message - @param topic the topic of the delivered message - @param data the data Identifier of the delivered message - @param qos the QoS level of the delivered message - @param retainFlag the retain Flag of the delivered message - @note this method is called after a publish with qos 1 or 2 only - */ -- (void)messageDelivered:(MQTTSession *)session - msgID:(UInt16)msgID - topic:(NSString *)topic - data:(NSData *)data - qos:(MQTTQosLevel)qos - retainFlag:(BOOL)retainFlag; - -/** gets called when a subscription is acknowledged by the MQTT broker - @param session the MQTTSession reporting the acknowledge - @param msgID the Message Identifier of the SUBSCRIBE message - @param qoss an array containing the granted QoS(s) related to the SUBSCRIBE message - (see subscribeTopic, subscribeTopics) - */ -- (void)subAckReceived:(MQTTSession *)session msgID:(UInt16)msgID grantedQoss:(NSArray *)qoss; - -/** gets called when an unsubscribe is acknowledged by the MQTT broker - @param session the MQTTSession reporting the acknowledge - @param msgID the Message Identifier of the UNSUBSCRIBE message - */ -- (void)unsubAckReceived:(MQTTSession *)session msgID:(UInt16)msgID; - -/** gets called when a command is sent to the MQTT broker - use this for low level monitoring of the MQTT connection - @param session the MQTTSession reporting the sent command - @param type the MQTT command type - @param qos the Quality of Service of the command - @param retained the retained status of the command - @param duped the duplication status of the command - @param mid the Message Identifier of the command - @param data the payload data of the command if any, might be zero length - */ -- (void)sending:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; - -/** gets called when a command is received from the MQTT broker - use this for low level monitoring of the MQTT connection - @param session the MQTTSession reporting the received command - @param type the MQTT command type - @param qos the Quality of Service of the command - @param retained the retained status of the command - @param duped the duplication status of the command - @param mid the Message Identifier of the command - @param data the payload data of the command if any, might be zero length - */ -- (void)received:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; - -/** gets called when a command is received from the MQTT broker - use this for low level control of the MQTT connection - @param session the MQTTSession reporting the received command - @param type the MQTT command type - @param qos the Quality of Service of the command - @param retained the retained status of the command - @param duped the duplication status of the command - @param mid the Message Identifier of the command - @param data the payload data of the command if any, might be zero length - @return true if the sessionmanager should ignore the received message - */ -- (BOOL)ignoreReceived:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; - -/** gets called when the content of MQTTClients internal buffers change - use for monitoring the completion of transmitted and received messages - @param session the MQTTSession reporting the change - @param queued for backward compatibility only: MQTTClient does not queue messages anymore except during QoS protocol - @param flowingIn the number of incoming messages not acknowledged by the MQTTClient yet - @param flowingOut the number of outgoing messages not yet acknowledged by the MQTT broker - */ -- (void)buffered:(MQTTSession *)session - queued:(NSUInteger)queued - flowingIn:(NSUInteger)flowingIn - flowingOut:(NSUInteger)flowingOut; - -/** gets called when the content of MQTTClients internal buffers change - use for monitoring the completion of transmitted and received messages - @param session the MQTTSession reporting the change - @param flowingIn the number of incoming messages not acknowledged by the MQTTClient yet - @param flowingOut the number of outgoing messages not yet acknowledged by the MQTT broker - */ -- (void)buffered:(MQTTSession *)session - flowingIn:(NSUInteger)flowingIn - flowingOut:(NSUInteger)flowingOut; - -@end - -typedef void (^MQTTConnectHandler)(NSError *error); -typedef void (^MQTTDisconnectHandler)(NSError *error); -typedef void (^MQTTSubscribeHandler)(NSError *error, NSArray *gQoss); -typedef void (^MQTTUnsubscribeHandler)(NSError *error); -typedef void (^MQTTPublishHandler)(NSError *error); - -/** Session implements the MQTT protocol for your application - * - */ - -@interface MQTTSession : NSObject - -/** set this member variable to receive delegate messages - @code - #import "MQTTClient.h" - - @interface MyClass : NSObject - ... - @end - - ... - MQTTSession *session = [[MQTTSession alloc] init]; - session.delegate = self; - ... - - (void)handleEvent:(MQTTSession *)session - event:(MQTTSessionEvent)eventCode - error:(NSError *)error { - ... - } - - (void)newMessage:(MQTTSession *)session - data:(NSData *)data - onTopic:(NSString *)topic - qos:(MQTTQosLevel)qos - retained:(BOOL)retained - mid:(unsigned int)mid { - ... - } - @endcode - - */ -@property (weak, nonatomic) id delegate; - -/** Control MQTT persistence by setting the properties of persistence before connecting to an MQTT broker. - The settings are specific to a clientId. - - persistence.persistent = YES or NO (default) to establish file or in memory persistence. IMPORTANT: set immediately after creating the MQTTSession before calling any other method. Otherwise the default value (NO) will be used - for this session. - - persistence.maxWindowSize (a positive number, default is 16) to control the number of messages sent before waiting for acknowledgement in Qos 1 or 2. Additional messages are - stored and transmitted later. - - persistence.maxSize (a positive number of bytes, default is 64 MB) to limit the size of the persistence file. Messages published after the limit is reached are dropped. - - persistence.maxMessages (a positive number, default is 1024) to limit the number of messages stored. Additional messages published are dropped. - - Messages are deleted after they have been acknowledged. -*/ -@property (strong, nonatomic) id persistence; - -/** block called once when connection is established - */ -@property (copy, nonatomic) MQTTConnectHandler connectHandler; - -/** block called when connection is established - */ -@property (strong) void (^connectionHandler)(MQTTSessionEvent event); - -/** block called when message is received - */ -@property (strong) void (^messageHandler)(NSData* message, NSString* topic); - -/** Session status - */ -@property (nonatomic, readonly) MQTTSessionStatus status; - -/** Indicates if the broker found a persistent session when connecting with cleanSession:FALSE - */ -@property (nonatomic, readonly) BOOL sessionPresent; - -/** streamSSLLevel an NSString containing the security level for read and write streams - * For list of possible values see: - * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants - * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list - * and cannot be used as constant, but you can use it as a string value - * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL - */ -@property (strong, nonatomic) NSString *streamSSLLevel; - -/** host an NSString containing the hostName or IP address of the Server - */ -@property (readonly) NSString *host; - -/** port an unsigned 32 bit integer containing the IP port number of the Server - */ -@property (readonly) UInt32 port; - -/** The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. - */ -@property (strong, nonatomic) NSString *clientId; - -/** see userName an NSString object containing the user's name (or ID) for authentication. May be nil. */ -@property (strong, nonatomic) NSString *userName; - -/** see password an NSString object containing the user's password. If userName is nil, password must be nil as well.*/ -@property (strong, nonatomic) NSString *password; - -/** see keepAliveInterval The Keep Alive is a time interval measured in seconds. - * The MQTTClient ensures that the interval between Control Packets being sent does not exceed - * the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. - */ -@property (nonatomic) UInt16 keepAliveInterval; - -/** The serverKeepAlive is a time interval measured in seconds. - * This value may be set by the broker and overrides keepAliveInterval if present - * Zero means the broker does not perform any keep alive checks - */ -@property (readonly, strong, nonatomic) NSNumber *serverKeepAlive; - -/** effectiveKeepAlive is a time interval measured in seconds - * It indicates the effective keep alive interval after a successfull connect - * where keepAliveInterval might have been overridden by the broker. - */ -@property (readonly, nonatomic) UInt16 effectiveKeepAlive; - - -/** - * dupTimeout If PUBACK or PUBREC not received, message will be resent after this interval - */ -@property (nonatomic) double dupTimeout; - -/** leanSessionFlag specifies if the server should discard previous session information. */ -@property (nonatomic) BOOL cleanSessionFlag; - -/** willFlag If the Will Flag is set to YES this indicates that - * a Will Message MUST be published by the Server when the Server detects - * that the Client is disconnected for any reason other than the Client flowing a DISCONNECT Packet. - */ -@property (nonatomic) BOOL willFlag; - -/** willTopic If the Will Flag is set to YES, the Will Topic is a string, nil otherwise. */ -@property (strong, nonatomic) NSString *willTopic; - -/** willMsg If the Will Flag is set to YES the Will Message must be specified, nil otherwise. */ -@property (strong, nonatomic) NSData *willMsg; - -/** willQoS specifies the QoS level to be used when publishing the Will Message. - * If the Will Flag is set to NO, then the Will QoS MUST be set to 0. - * If the Will Flag is set to YES, the Will QoS MUST be a valid MQTTQosLevel. - */ -@property (nonatomic) MQTTQosLevel willQoS; - -/** willRetainFlag indicates if the server should publish the Will Messages with retainFlag. - * If the Will Flag is set to NO, then the Will Retain Flag MUST be set to NO . - * If the Will Flag is set to YES: If Will Retain is set to NO, the Serve - * MUST publish the Will Message as a non-retained publication [MQTT-3.1.2-14]. - * If Will Retain is set to YES, the Server MUST publish the Will Message as a retained publication [MQTT-3.1.2-15]. - */ -@property (nonatomic) BOOL willRetainFlag; - -/** protocolLevel specifies the protocol to be used */ -@property (nonatomic) MQTTProtocolVersion protocolLevel; - -/** sessionExpiryInterval specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *sessionExpiryInterval; - -/** authMethod specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSString *authMethod; - -/** authData specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSData *authData; - -/** requestProblemInformation specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *requestProblemInformation; - -/** willDelayInterval specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *willDelayInterval; - -/** requestResponseInformation specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *requestResponseInformation; - -/** receiveMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *receiveMaximum; - -/** topicAliasMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *topicAliasMaximum; - -/** topicAliasMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSDictionary *userProperty; - -/** maximumPacketSize specifies the number of seconds after which a session should expire MQTT v5.0*/ -@property (strong, nonatomic) NSNumber *maximumPacketSize; - -/** queue The queue where the streams are scheduled. */ -@property (strong, nonatomic) dispatch_queue_t queue; - - -/** for mqttio-OBJC backward compatibility - the connect message used is stored here - */ -@property (strong, nonatomic) MQTTMessage *connectMessage; - -/** the transport provider for MQTTClient - * - * assign an in instance of a class implementing the MQTTTransport protocol e.g. - * MQTTCFSocketTransport before connecting. - */ -@property (strong, nonatomic) id transport; - -/** certificates an NSArray holding client certificates or nil */ -@property (strong, nonatomic) NSArray *certificates; - -/** Require for VoIP background service - * defaults to NO - */ -@property (nonatomic) BOOL voip; - -/** connect to the given host through the given transport with the given - * MQTT session parameters asynchronously - * - */ - - -- (void)connect; - -/** connects to the specified MQTT server - - @param connectHandler identifies a block which is executed on successfull or unsuccessfull connect. Might be nil - error is nil in the case of a successful connect - sessionPresent indicates in MQTT 3.1.1 if persistent session data was present at the server - returns nothing and returns immediately. To check the connect results, register as an MQTTSessionDelegate and - - watch for events - - watch for connect or connectionRefused messages - - watch for error messages - or use the connectHandler block - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connectWithConnectHandler:^(NSError *error, BOOL sessionPresent) { - if (error) { - NSLog(@"Error Connect %@", error.localizedDescription); - } else { - NSLog(@"Connected sessionPresent:%d", sessionPresent); - } - }]; - @endcode - - */ - -- (void)connectWithConnectHandler:(MQTTConnectHandler)connectHandler; - - -/** disconnect gracefully - * - */ -- (void)disconnect; - -/** disconnect V5 - * @param returnCode the returncode send to the broker - * @param sessionExpiryInterval the time in seconds before the session can be deleted - * @param reasonString a string explaining the reason - * @param userProperty additional dictionary of user key/value combinations - */ -- (void)disconnectWithReturnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty; - - -/** initialises the MQTT session with default values - @return the initialised MQTTSession object - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - @endcode - */ -- (MQTTSession *)init; - - - -/** subscribes to a topic at a specific QoS level - - @param topic see subscribeToTopic:atLevel:subscribeHandler: for description - @param qosLevel see subscribeToTopic:atLevel:subscribeHandler: for description - @return the Message Identifier of the SUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - ... - [session subscribeToTopic:@"example/#" atLevel:2]; - - @endcode - - */ - -- (UInt16)subscribeToTopic:(NSString *)topic - atLevel:(MQTTQosLevel)qosLevel; -/** subscribes to a topic at a specific QoS level - - @param topic the Topic Filter to subscribe to. - - @param qosLevel specifies the QoS Level of the subscription. - qosLevel can be 0, 1, or 2. - @param subscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. - Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an - array of grantes Qos - - - @return the Message Identifier of the SUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - ... - [session subscribeToTopic:@"example/#" atLevel:2 subscribeHandler:^(NSError *error, NSArray *gQoss){ - if (error) { - NSLog(@"Subscription failed %@", error.localizedDescription); - } else { - NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); - } - }]; - - @endcode - - */ - -- (UInt16)subscribeToTopic:(NSString *)topic - atLevel:(MQTTQosLevel)qosLevel - subscribeHandler:(MQTTSubscribeHandler)subscribeHandler; - -/** subscribes a number of topics - - @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and - the corresponding QoS as NSNumber values - - @return the Message Identifier of the SUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session subscribeToTopics:@{ - @"example/#": @(0), - @"example/status": @(2), - @"other/#": @(1) - }]; - - @endcode - */ - - -- (UInt16)subscribeToTopics:(NSDictionary *)topics; - -/** subscribes a number of topics - - @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and - the corresponding QoS as NSNumber values - @param subscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. - Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an - array of grantes Qos - - @return the Message Identifier of the SUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session subscribeToTopics:@{ - @"example/#": @(0), - @"example/status": @(2), - @"other/#": @(1) - } subscribeHandler:^(NSError *error, NSArray *gQoss){ - if (error) { - NSLog(@"Subscription failed %@", error.localizedDescription); - } else { - NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); - } - }]; - - - @endcode - */ - - -- (UInt16)subscribeToTopics:(NSDictionary *)topics - subscribeHandler:(MQTTSubscribeHandler)subscribeHandler; - -/** unsubscribes from a topic - - @param topic the Topic Filter to unsubscribe from. - - @return the Message Identifier of the UNSUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session unsubscribeTopic:@"example/#"]; - - @endcode - */ - -- (UInt16)unsubscribeTopic:(NSString *)topic; - -/** unsubscribes from a topic - - @param topic the Topic Filter to unsubscribe from. - @param unsubscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. - Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an - array of grantes Qos - - @return the Message Identifier of the UNSUBSCRIBE message. - - @note returns immediately. - - */ - - -- (UInt16)unsubscribeTopic:(NSString *)topic - unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler; - -/** unsubscribes from a number of topics - - @param topics an NSArray of topics to unsubscribe from - - @return the Message Identifier of the UNSUBSCRIBE message. - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session unsubscribeTopics:@[ - @"example/#", - @"example/status", - @"other/#" - ]]; - - @endcode - - */ - -- (UInt16)unsubscribeTopics:(NSArray *)topics; - -/** unsubscribes from a number of topics - - @param topics an NSArray of topics to unsubscribe from - - @param unsubscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. - Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an - array of grantes Qos - - @return the Message Identifier of the UNSUBSCRIBE message. - - @note returns immediately. - - */ -- (UInt16)unsubscribeTopics:(NSArray *)topics - unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler; - -/** publishes data on a given topic at a specified QoS level and retain flag - - @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. - @param topic the Topic to identify the data - @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES - @param qos specifies the Quality of Service for the publish - qos can be 0, 1, or 2. - @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session publishData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] - topic:@"example/data" - retain:YES - qos:1]; - @endcode - - */ - -- (UInt16)publishData:(NSData *)data - onTopic:(NSString *)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos; - -/** publishes data on a given topic at a specified QoS level and retain flag - - @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. - @param topic the Topic to identify the data - @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES - @param qos specifies the Quality of Service for the publish - qos can be 0, 1, or 2. - - - @param publishHandler identifies a block which is executed on successfull or unsuccessfull publsh. Might be nil - error is nil in the case of a successful connect - sessionPresent indicates in MQTT 3.1.1 if persistent session data was present at the server - - - @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped - - @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - [session publishData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] - topic:@"example/data" - retain:YES - qos:1 - publishHandler:^(NSError *error){ - if (error) { - DDLogVerbose(@"error: %@ %@", error.localizedDescription, payload); - } else { - DDLogVerbose(@"delivered:%@", payload); - delivered++; - } - }]; - @endcode - - */ - -- (UInt16)publishData:(NSData *)data - onTopic:(NSString *)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - publishHandler:(MQTTPublishHandler)publishHandler; - -/** closes an MQTTSession gracefully - - If the connection was successfully established before, a DISCONNECT is sent. - - @param disconnectHandler identifies a block which is executed on successfull or unsuccessfull disconnect. Might be nil. error is nil in the case of a successful disconnect - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - ... - [session connect]; - - ... - - [session closeWithDisconnectHandler^(NSError *error) { - if (error) { - NSLog(@"Error Disconnect %@", error.localizedDescription); - } - NSLog(@"Session closed"); - }]; - - - @endcode - - */ -- (void)closeWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler; - -/** close V5 - * @param returnCode the returncode send to the broker - * @param sessionExpiryInterval the time in seconds before the session can be deleted - * @param reasonString a string explaining the reason - * @param userProperty additional dictionary of user key/value combinations - * @param disconnectHandler will be called when the disconnect finished - */ -- (void)closeWithReturnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty - disconnectHandler:(MQTTDisconnectHandler)disconnectHandler; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m deleted file mode 100644 index 87828a7..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m +++ /dev/null @@ -1,1641 +0,0 @@ -// -// MQTTSession.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - - -#import "MQTTSession.h" -#import "MQTTDecoder.h" -#import "MQTTStrict.h" -#import "MQTTProperties.h" -#import "MQTTMessage.h" -#import "MQTTCoreDataPersistence.h" -#import "GCDTimer.h" - -@class MQTTSSLSecurityPolicy; - -#import "MQTTLog.h" - -NSString * const MQTTSessionErrorDomain = @"MQTT"; - -@interface MQTTSession() - -@property (nonatomic, readwrite) MQTTSessionStatus status; -@property (nonatomic, readwrite) BOOL sessionPresent; - -@property (strong, nonatomic) GCDTimer *keepAliveTimer; -@property (strong, nonatomic) NSNumber *serverKeepAlive; -@property (nonatomic) UInt16 effectiveKeepAlive; -@property (strong, nonatomic) GCDTimer *checkDupTimer; - -@property (strong, nonatomic) MQTTDecoder *decoder; - -@property (copy, nonatomic) MQTTDisconnectHandler disconnectHandler; -@property (nonatomic, strong) NSMutableDictionary *subscribeHandlers; -@property (nonatomic, strong) NSMutableDictionary *unsubscribeHandlers; -@property (nonatomic, strong) NSMutableDictionary *publishHandlers; - -@property (nonatomic) UInt16 txMsgId; - -@property (nonatomic) BOOL synchronPub; -@property (nonatomic) UInt16 synchronPubMid; -@property (nonatomic) BOOL synchronUnsub; -@property (nonatomic) UInt16 synchronUnsubMid; -@property (nonatomic) BOOL synchronSub; -@property (nonatomic) UInt16 synchronSubMid; -@property (nonatomic) BOOL synchronConnect; -@property (nonatomic) BOOL synchronDisconnect; - -@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; - -@end - -#define DUPLOOP 1.0 - -@implementation MQTTSession -@synthesize certificates; - -- (void)setCertificates:(NSArray *)newCertificates { - certificates = newCertificates; - if (self.transport) { - if ([self.transport respondsToSelector:@selector(setCertificates:)]) { - [self.transport performSelector:@selector(setCertificates:) withObject:certificates]; - } - } -} - -- (instancetype)init { - DDLogVerbose(@"[MQTTSession] init"); - self = [super init]; - self.txMsgId = 1; - self.persistence = [[MQTTCoreDataPersistence alloc] init]; - self.subscribeHandlers = [[NSMutableDictionary alloc] init]; - self.unsubscribeHandlers = [[NSMutableDictionary alloc] init]; - self.publishHandlers = [[NSMutableDictionary alloc] init]; - - self.clientId = nil; - self.userName = nil; - self.password = nil; - self.keepAliveInterval = 60; - self.dupTimeout = 20.0; - self.cleanSessionFlag = true; - self.willFlag = false; - self.willTopic = nil; - self.willMsg = nil; - self.willQoS = MQTTQosLevelAtMostOnce; - self.willRetainFlag = false; - self.protocolLevel = MQTTProtocolVersion311; - self.queue = dispatch_get_main_queue(); - self.status = MQTTSessionStatusCreated; - self.streamSSLLevel = (NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL; - return self; -} - -- (void)dealloc { - [self.keepAliveTimer invalidate]; - [self.checkDupTimer invalidate]; -} - -- (NSString *)host { - return _transport.host; -} - -- (UInt32)port { - return _transport.port; -} - -- (void)setClientId:(NSString *)clientId { - if (!clientId) { - clientId = [NSString stringWithFormat:@"MQTTClient%.0f",fmod([NSDate date].timeIntervalSince1970, 1.0) * 1000000.0]; - } - - _clientId = clientId; -} - -- (void)setStreamSSLLevel:(NSString *)streamSSLLevel { - _streamSSLLevel = streamSSLLevel; - self.transport.streamSSLLevel = self.streamSSLLevel; -} - -- (UInt16)subscribeToTopic:(NSString *)topic - atLevel:(MQTTQosLevel)qosLevel { - return [self subscribeToTopic:topic atLevel:qosLevel subscribeHandler:nil]; -} - -- (UInt16)subscribeToTopic:(NSString *)topic - atLevel:(MQTTQosLevel)qosLevel - subscribeHandler:(MQTTSubscribeHandler)subscribeHandler { - return [self subscribeToTopics:topic ? @{topic: @(qosLevel)} : @{} subscribeHandler:subscribeHandler]; -} - -- (UInt16)subscribeToTopics:(NSDictionary *)topics { - return [self subscribeToTopics:topics subscribeHandler:nil]; -} - -- (void)checkTopicFilters:(NSArray *)topicFilters { - if (MQTTStrict.strict && - topicFilters.count == 0) { - NSException* myException = [NSException - exceptionWithName:@"topicFilter array in SUBSCRIBE or UNSUBSRIBE must not be empty" - reason:[NSString stringWithFormat:@"%@", topicFilters] - userInfo:nil]; - @throw myException; - } - - for (NSString *topicFilter in topicFilters) { - if (MQTTStrict.strict && - topicFilter.length < 1) { - NSException* myException = [NSException - exceptionWithName:@"topicFilter must be at least 1 characters long" - reason:[NSString stringWithFormat:@"%@", topicFilter] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - [topicFilter dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { - NSException* myException = [NSException - exceptionWithName:@"topicFilter may not be longer than 65535 bytes in UTF8 representation" - reason:[NSString stringWithFormat:@"topicFilter length = %lu", - (unsigned long)[topicFilter dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - ![topicFilter dataUsingEncoding:NSUTF8StringEncoding]) { - NSException* myException = [NSException - exceptionWithName:@"topicFilter must not contain non-UTF8 characters" - reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict) { - NSArray *components = [topicFilter componentsSeparatedByString:@"/"]; - for (int level = 0; level < components.count; level++) { - if ([components[level] rangeOfString:@"+"].location != NSNotFound && - components[level].length > 1) { - NSException* myException = [NSException - exceptionWithName:@"singlelevel wildcard must be alone on a level of a topic filter" - reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] - userInfo:nil]; - @throw myException; - } - } - - for (int level = 0; level < components.count - 1; level++) { - if ([components[level] rangeOfString:@"#"].location != NSNotFound) { - NSException* myException = [NSException - exceptionWithName:@"multilevel wildcard must be on the last level of a topic filter" - reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] - userInfo:nil]; - @throw myException; - } - } - if ([components[components.count - 1] rangeOfString:@"#"].location != NSNotFound && - components[components.count - 1].length > 1) { - NSException* myException = [NSException - exceptionWithName:@"multilevel wildcard must be alone on a level of a topic filter" - reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] - userInfo:nil]; - @throw myException; - } - } - - if (MQTTStrict.strict && - [topicFilter rangeOfString:@"#"].location != NSNotFound && - [topicFilter rangeOfString:@"#"].location != topicFilter.length && - (topicFilter.length == 1 || [[topicFilter substringWithRange:NSMakeRange(topicFilter.length - 2, 1)] isEqualToString:@"/"]) - ) { - NSException* myException = [NSException - exceptionWithName:@"multilevel wildcard must alone on the last level of a topic filter" - reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] - userInfo:nil]; - @throw myException; - } - - } -} - -- (UInt16)subscribeToTopics:(NSDictionary *)topics subscribeHandler:(MQTTSubscribeHandler)subscribeHandler { - DDLogVerbose(@"[MQTTSession] subscribeToTopics:%@]", topics); - - [self checkTopicFilters:topics.allKeys]; - - for (NSNumber *qos in topics.allValues) { - if (MQTTStrict.strict && - qos.intValue != MQTTQosLevelAtMostOnce && - qos.intValue != MQTTQosLevelAtLeastOnce && - qos.intValue != MQTTQosLevelExactlyOnce) { - NSException* myException = [NSException - exceptionWithName:@"Illegal QoS level" - reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", qos.intValue] - userInfo:nil]; - @throw myException; - } - } - - UInt16 mid = [self nextMsgId]; - if (subscribeHandler) { - (self.subscribeHandlers)[@(mid)] = [subscribeHandler copy]; - } else { - [self.subscribeHandlers removeObjectForKey:@(mid)]; - } - (void)[self encode:[MQTTMessage subscribeMessageWithMessageId:mid - topics:topics - protocolLevel:self.protocolLevel - subscriptionIdentifier:nil]]; - - return mid; -} - -- (UInt16)unsubscribeTopic:(NSString*)topic { - return [self unsubscribeTopic:topic unsubscribeHandler:nil]; -} - -- (UInt16)unsubscribeTopic:(NSString *)topic unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler { - return [self unsubscribeTopics:topic ? @[topic] : @[] unsubscribeHandler:unsubscribeHandler]; -} - -- (UInt16)unsubscribeTopics:(NSArray *)topics { - return [self unsubscribeTopics:topics unsubscribeHandler:nil]; -} - -- (UInt16)unsubscribeTopics:(NSArray *)topics unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler { - DDLogVerbose(@"[MQTTSession] unsubscribeTopics:%@", topics); - - [self checkTopicFilters:topics]; - - UInt16 mid = [self nextMsgId]; - if (unsubscribeHandler) { - (self.unsubscribeHandlers)[@(mid)] = [unsubscribeHandler copy]; - } else { - [self.unsubscribeHandlers removeObjectForKey:@(mid)]; - } - (void)[self encode:[MQTTMessage unsubscribeMessageWithMessageId:mid - topics:topics - protocolLevel:self.protocolLevel]]; - return mid; -} - -- (UInt16)publishData:(NSData*)data - onTopic:(NSString*)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos { - return [self publishData:data onTopic:topic retain:retainFlag qos:qos publishHandler:nil]; -} - -- (UInt16)publishData:(NSData *)data - onTopic:(NSString *)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - publishHandler:(MQTTPublishHandler)publishHandler -{ - DDLogVerbose(@"[MQTTSession] publishData:%@... onTopic:%@ retain:%d qos:%ld publishHandler:%p", - [data subdataWithRange:NSMakeRange(0, MIN(256, data.length))], - [topic substringWithRange:NSMakeRange(0, MIN(256, topic.length))], - retainFlag, - (long)qos, - publishHandler); - - if (MQTTStrict.strict && - !topic) { - NSException* myException = [NSException - exceptionWithName:@"topic must not be nil" - reason:[NSString stringWithFormat:@"%@", topic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - topic && - topic.length < 1) { - NSException* myException = [NSException - exceptionWithName:@"topic must not at least 1 character long" - reason:[NSString stringWithFormat:@"%@", topic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - topic && - [topic dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { - NSException* myException = [NSException - exceptionWithName:@"topic may not be longer than 65535 bytes in UTF8 representation" - reason:[NSString stringWithFormat:@"topic length = %lu", - (unsigned long)[topic dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - topic && - ![topic dataUsingEncoding:NSUTF8StringEncoding]) { - NSException* myException = [NSException - exceptionWithName:@"topic must not contain non-UTF8 characters" - reason:[NSString stringWithFormat:@"topic = %@", topic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willTopic && - ([self.willTopic containsString:@"+"] || - [self.willTopic containsString:@"#"]) - ) { - NSException* myException = [NSException - exceptionWithName:@"willTopic must not contain wildcards" - reason:[NSString stringWithFormat:@"willTopic = %@", self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - qos != MQTTQosLevelAtMostOnce && - qos != MQTTQosLevelAtLeastOnce && - qos != MQTTQosLevelExactlyOnce) { - NSException* myException = [NSException - exceptionWithName:@"Illegal QoS level" - reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", qos] - userInfo:nil]; - @throw myException; - } - - UInt16 msgId = 0; - if (!qos) { - MQTTMessage *msg = [MQTTMessage publishMessageWithData:data - onTopic:topic - qos:qos - msgId:msgId - retainFlag:retainFlag - dupFlag:FALSE - protocolLevel:self.protocolLevel - payloadFormatIndicator:nil - publicationExpiryInterval:nil - topicAlias:nil - responseTopic:nil - correlationData:nil - userProperty:nil - contentType:nil]; - NSError *error = nil; - if (![self encode:msg]) { - error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorEncoderNotReady - userInfo:@{NSLocalizedDescriptionKey : @"Encoder not ready"}]; - } - if (publishHandler) { - [self onPublish:publishHandler error:error]; - } - } else { - msgId = [self nextMsgId]; - MQTTMessage *msg = nil; - - id flow; - if (self.status == MQTTSessionStatusConnected) { - NSArray *flows = [self.persistence allFlowsforClientId:self.clientId - incomingFlag:NO]; - - BOOL unprocessedMessageNotExists = TRUE; - NSUInteger windowSize = 0; - for (id flow in flows) { - if ((flow.commandType).intValue != MQTT_None) { - windowSize++; - } else { - unprocessedMessageNotExists = FALSE; - } - } - if (unprocessedMessageNotExists && windowSize <= self.persistence.maxWindowSize) { - msg = [MQTTMessage publishMessageWithData:data - onTopic:topic - qos:qos - msgId:msgId - retainFlag:retainFlag - dupFlag:FALSE - protocolLevel:self.protocolLevel - payloadFormatIndicator:nil - publicationExpiryInterval:nil - topicAlias:nil - responseTopic:nil - correlationData:nil - userProperty:nil - contentType:nil]; - flow = [self.persistence storeMessageForClientId:self.clientId - topic:topic - data:data - retainFlag:retainFlag - qos:qos - msgId:msgId - incomingFlag:NO - commandType:MQTTPublish - deadline:[NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]]; - } - } - if (!msg) { - flow = [self.persistence storeMessageForClientId:self.clientId - topic:topic - data:data - retainFlag:retainFlag - qos:qos - msgId:msgId - incomingFlag:NO - commandType:MQTT_None - deadline:[NSDate date]]; - } - if (!flow) { - DDLogWarn(@"[MQTTSession] dropping outgoing message %d", msgId); - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorDroppingOutgoingMessage - userInfo:@{NSLocalizedDescriptionKey : @"Dropping outgoing Message"}]; - if (publishHandler) { - [self onPublish:publishHandler error:error]; - } - msgId = 0; - } else { - [self.persistence sync]; - if (publishHandler) { - (self.publishHandlers)[@(msgId)] = [publishHandler copy]; - } else { - [self.publishHandlers removeObjectForKey:@(msgId)]; - } - - if ((flow.commandType).intValue == MQTTPublish) { - DDLogVerbose(@"[MQTTSession] PUBLISH %d", msgId); - if (![self encode:msg]) { - DDLogInfo(@"[MQTTSession] queueing message %d after unsuccessfull attempt", msgId); - flow.commandType = [NSNumber numberWithUnsignedInt:MQTT_None]; - flow.deadline = [NSDate date]; - [self.persistence sync]; - } - } else { - DDLogInfo(@"[MQTTSession] queueing message %d", msgId); - } - } - } - [self tell]; - return msgId; -} - -- (void)closeWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler { - [self closeWithReturnCode:MQTTSuccess - sessionExpiryInterval:nil - reasonString:nil - userProperty:nil - disconnectHandler:disconnectHandler]; -} - -- (void)closeWithReturnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty - disconnectHandler:(MQTTDisconnectHandler)disconnectHandler { - DDLogVerbose(@"[MQTTSession] closeWithDisconnectHandler:%p ", disconnectHandler); - self.disconnectHandler = disconnectHandler; - - if (self.status == MQTTSessionStatusConnected) { - [self disconnectWithReturnCode:returnCode - sessionExpiryInterval:sessionExpiryInterval - reasonString:reasonString - userProperty:userProperty]; - } else { - [self closeInternal]; - } -} - -- (void)disconnect { - [self disconnectWithReturnCode:MQTTSuccess - sessionExpiryInterval:nil - reasonString:nil - userProperty:nil]; -} - -- (void)disconnectWithReturnCode:(MQTTReturnCode)returnCode - sessionExpiryInterval:(NSNumber *)sessionExpiryInterval - reasonString:(NSString *)reasonString - userProperty:(NSDictionary *)userProperty { - DDLogVerbose(@"[MQTTSession] sending DISCONNECT"); - self.status = MQTTSessionStatusDisconnecting; - - [self encode:[MQTTMessage disconnectMessage:self.protocolLevel - returnCode:returnCode - sessionExpiryInterval:sessionExpiryInterval - reasonString:reasonString - userProperty:userProperty]]; - [self closeInternal]; -} - -- (void)closeInternal { - DDLogVerbose(@"[MQTTSession] closeInternal"); - - if (self.checkDupTimer) { - [self.checkDupTimer invalidate]; - self.checkDupTimer = nil; - } - - if (self.keepAliveTimer) { - [self.keepAliveTimer invalidate]; - self.keepAliveTimer = nil; - } - - if (self.transport) { - [self.transport close]; - self.transport.delegate = nil; - } - - if(self.decoder){ - [self.decoder close]; - self.decoder.delegate = nil; - } - - NSArray *flows = [self.persistence allFlowsforClientId:self.clientId - incomingFlag:NO]; - for (id flow in flows) { - switch ((flow.commandType).intValue) { - case MQTTPublish: - case MQTTPubrel: - flow.deadline = [flow.deadline dateByAddingTimeInterval:-self.dupTimeout]; - [self.persistence sync]; - break; - } - } - - self.status = MQTTSessionStatusClosed; - if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { - [self.delegate handleEvent:self event:MQTTSessionEventConnectionClosed error:nil]; - } - if ([self.delegate respondsToSelector:@selector(connectionClosed:)]) { - [self.delegate connectionClosed:self]; - } - - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorNoResponse - userInfo:@{NSLocalizedDescriptionKey : @"No response"}]; - - NSArray *allSubscribeHandlers = self.subscribeHandlers.allValues; - [self.subscribeHandlers removeAllObjects]; - for (MQTTSubscribeHandler subscribeHandler in allSubscribeHandlers) { - subscribeHandler(error, nil); - } - - NSArray *allUnsubscribeHandlers = self.unsubscribeHandlers.allValues; - [self.unsubscribeHandlers removeAllObjects]; - for (MQTTUnsubscribeHandler unsubscribeHandler in allUnsubscribeHandlers) { - unsubscribeHandler(error); - } - - MQTTDisconnectHandler disconnectHandler = self.disconnectHandler; - if (disconnectHandler) { - self.disconnectHandler = nil; - disconnectHandler(nil); - } - - [self tell]; - self.synchronPub = FALSE; - self.synchronPubMid = 0; - self.synchronSub = FALSE; - self.synchronSubMid = 0; - self.synchronUnsub = FALSE; - self.synchronUnsubMid = 0; -} - - -- (void)keepAlive { - DDLogVerbose(@"[MQTTSession] keepAlive %@ @%.0f", self.clientId, [[NSDate date] timeIntervalSince1970]); - (void)[self encode:[MQTTMessage pingreqMessage]]; -} - -- (void)checkDup { - DDLogVerbose(@"[MQTTSession] checkDup %@ @%.0f", self.clientId, [[NSDate date] timeIntervalSince1970]); - [self checkTxFlows]; -} - -- (void)checkTxFlows { - NSUInteger windowSize; - MQTTMessage *message; - if (self.status != MQTTSessionStatusConnected) { - return; - } - - NSArray *flows = [self.persistence allFlowsforClientId:self.clientId - incomingFlag:NO]; - windowSize = 0; - message = nil; - - for (id flow in flows) { - if ((flow.commandType).intValue != MQTT_None) { - windowSize++; - } - } - for (id flow in flows) { - DDLogVerbose(@"[MQTTSession] %@ flow %@ %@ %@", self.clientId, flow.deadline, flow.commandType, flow.messageId); - if ([flow.deadline compare:[NSDate date]] == NSOrderedAscending) { - switch ((flow.commandType).intValue) { - case 0: - if (windowSize <= self.persistence.maxWindowSize) { - DDLogVerbose(@"[MQTTSession] PUBLISH queued message %@", flow.messageId); - message = [MQTTMessage publishMessageWithData:flow.data - onTopic:flow.topic - qos:(flow.qosLevel).intValue - msgId:(flow.messageId).intValue - retainFlag:(flow.retainedFlag).boolValue - dupFlag:NO - protocolLevel:self.protocolLevel - payloadFormatIndicator:nil - publicationExpiryInterval:nil - topicAlias:nil - responseTopic:nil - correlationData:nil - userProperty:nil - contentType:nil]; - if ([self encode:message]) { - flow.commandType = @(MQTTPublish); - flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; - [self.persistence sync]; - windowSize++; - } - } - break; - case MQTTPublish: - DDLogInfo(@"[MQTTSession] resend PUBLISH %@", flow.messageId); - message = [MQTTMessage publishMessageWithData:flow.data - onTopic:flow.topic - qos:(flow.qosLevel).intValue - msgId:(flow.messageId).intValue - retainFlag:(flow.retainedFlag).boolValue - dupFlag:YES - protocolLevel:self.protocolLevel - payloadFormatIndicator:nil - publicationExpiryInterval:nil - topicAlias:nil - responseTopic:nil - correlationData:nil - userProperty:nil - contentType:nil]; - if ([self encode:message]) { - flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; - [self.persistence sync]; - } - break; - case MQTTPubrel: - DDLogInfo(@"[MQTTSession] resend PUBREL %@", flow.messageId); - message = [MQTTMessage pubrelMessageWithMessageId:(flow.messageId).intValue - protocolLevel:self.protocolLevel - returnCode:MQTTSuccess - reasonString:nil - userProperty:nil]; - if ([self encode:message]) { - flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; - [self.persistence sync]; - } - break; - default: - break; - } - } - } -} - -- (void)decoder:(MQTTDecoder *)sender handleEvent:(MQTTDecoderEvent)eventCode error:(NSError *)error { - __unused NSArray *events = @[ - @"MQTTDecoderEventProtocolError", - @"MQTTDecoderEventConnectionClosed", - @"MQTTDecoderEventConnectionError" - ]; - DDLogVerbose(@"[MQTTSession] decoder handleEvent: %@ (%d) %@", - events[eventCode % [events count]], - eventCode, - [error description]); - - switch (eventCode) { - case MQTTDecoderEventConnectionClosed: - [self error:MQTTSessionEventConnectionClosedByBroker error:error]; - break; - case MQTTDecoderEventConnectionError: - [self connectionError:error]; - break; - case MQTTDecoderEventProtocolError: - [self protocolError:error]; - break; - } - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } -} - -- (void)decoder:(MQTTDecoder *)sender didReceiveMessage:(NSData *)data { - MQTTMessage *message = [MQTTMessage messageFromData:data protocolLevel:self.protocolLevel]; - if (!message) { - DDLogError(@"[MQTTSession] MQTT illegal message received"); - NSError * error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorIllegalMessageReceived - userInfo:@{NSLocalizedDescriptionKey : @"MQTT illegal message received"}]; - [self protocolError:error]; - - return; - } - - @synchronized(sender) { - if ([self.delegate respondsToSelector:@selector(received:type:qos:retained:duped:mid:data:)]) { - [self.delegate received:self - type:message.type - qos:message.qos - retained:message.retainFlag - duped:message.dupFlag - mid:message.mid - data:message.data]; - } - if ([self.delegate respondsToSelector:@selector(ignoreReceived:type:qos:retained:duped:mid:data:)]) { - if ([self.delegate ignoreReceived:self - type:message.type - qos:message.qos - retained:message.retainFlag - duped:message.dupFlag - mid:message.mid - data:message.data]) { - return; - } - } - switch (self.status) { - case MQTTSessionStatusConnecting: - switch (message.type) { - case MQTTConnack: - if ((self.protocolLevel == MQTTProtocolVersion50 && message.data.length < 3) || - (self.protocolLevel != MQTTProtocolVersion50 && message.data.length != 2)) { - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorInvalidConnackReceived - userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol CONNACK expected"}]; - - [self protocolError:error]; - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } - } else { - if (message.returnCode && (message.returnCode).intValue == MQTTSuccess) { - self.status = MQTTSessionStatusConnected; - if (message.connectAcknowledgeFlags && - ((message.connectAcknowledgeFlags).unsignedIntValue & 0x01) == 0x01) { - self.sessionPresent = true; - } else { - self.sessionPresent = false; - } - __weak typeof(self) weakSelf = self; - self.checkDupTimer = [GCDTimer scheduledTimerWithTimeInterval:DUPLOOP - repeats:YES - queue:self.queue - block:^{ - [weakSelf checkDup]; - }]; - [self checkDup]; - - if (message.properties) { - self.serverKeepAlive = message.properties.serverKeepAlive; - } - if (self.serverKeepAlive) { - self.effectiveKeepAlive = (self.serverKeepAlive).unsignedShortValue; - } else { - self.effectiveKeepAlive = self.keepAliveInterval; - } - - if (self.effectiveKeepAlive > 0) { - self.keepAliveTimer = [GCDTimer scheduledTimerWithTimeInterval:self.effectiveKeepAlive - repeats:YES - queue: self.queue - block:^() { - [weakSelf keepAlive]; - }]; - } - - if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { - [self.delegate handleEvent:self event:MQTTSessionEventConnected error:nil]; - } - if ([self.delegate respondsToSelector:@selector(connected:)]) { - [self.delegate connected:self]; - } - if ([self.delegate respondsToSelector:@selector(connected:sessionPresent:)]) { - [self.delegate connected:self sessionPresent:self.sessionPresent]; - } - - if (self.connectionHandler) { - self.connectionHandler(MQTTSessionEventConnected); - } - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:nil]; - } - - } else { - NSString *errorDescription = @"unknown"; - NSInteger errorCode = 0; - if (message.returnCode) { - switch ((message.returnCode).intValue) { - case 1: - errorDescription = @"MQTT CONNACK: unacceptable protocol version"; - errorCode = MQTTSessionErrorConnackUnacceptableProtocolVersion; - break; - case 2: - errorDescription = @"MQTT CONNACK: identifier rejected"; - errorCode = MQTTSessionErrorConnackIdentifierRejected; - break; - case 3: - errorDescription = @"MQTT CONNACK: server unavailable"; - errorCode = MQTTSessionErrorConnackServeUnavailable; - break; - case 4: - errorDescription = @"MQTT CONNACK: bad user name or password"; - errorCode = MQTTSessionErrorConnackBadUsernameOrPassword; - break; - case 5: - errorDescription = @"MQTT CONNACK: not authorized"; - errorCode = MQTTSessionErrorConnackNotAuthorized; - break; - default: - errorDescription = @"MQTT CONNACK: reserved for future use"; - errorCode = MQTTSessionErrorConnackReserved; - break; - } - } - - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:errorCode - userInfo:@{NSLocalizedDescriptionKey : errorDescription}]; - [self error:MQTTSessionEventConnectionRefused error:error]; - if ([self.delegate respondsToSelector:@selector(connectionRefused:error:)]) { - [self.delegate connectionRefused:self error:error]; - } - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } - } - - self.synchronConnect = FALSE; - } - break; - case MQTTDisconnect: { - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:(message.returnCode).intValue - userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol DISCONNECT instead of CONNACK"}]; - - [self protocolError:error]; - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } - break; - } - default: { - NSError * error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorNoConnackReceived - userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol no CONNACK"}]; - [self protocolError:error]; - MQTTConnectHandler connectHandler = self.connectHandler; - if (connectHandler) { - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } - break; - } - } - break; - case MQTTSessionStatusConnected: - switch (message.type) { - case MQTTPublish: - [self handlePublish:message]; - break; - case MQTTPuback: - [self handlePuback:message]; - break; - case MQTTPubrec: - [self handlePubrec:message]; - break; - case MQTTPubrel: - [self handlePubrel:message]; - break; - case MQTTPubcomp: - [self handlePubcomp:message]; - break; - case MQTTSuback: - [self handleSuback:message]; - break; - case MQTTUnsuback: - [self handleUnsuback:message]; - break; - case MQTTDisconnect: { - NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:(message.returnCode).intValue - userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol DISCONNECT received"}]; - - [self protocolError:error]; - } - - default: - break; - } - break; - default: - DDLogError(@"[MQTTSession] other state"); - break; - } - } -} - -- (void)handlePublish:(MQTTMessage*)msg { - NSData *data = msg.data; - if (data.length < 2) { - return; - } - UInt8 const *bytes = data.bytes; - UInt16 topicLength = 256 * bytes[0] + bytes[1]; - if (data.length < 2 + topicLength) { - return; - } - NSData *topicData = [data subdataWithRange:NSMakeRange(2, topicLength)]; - NSString *topic = [[NSString alloc] initWithData:topicData - encoding:NSUTF8StringEncoding]; - if (!topic) { - topic = [[NSString alloc] initWithData:topicData - encoding:NSISOLatin1StringEncoding]; - DDLogError(@"non UTF8 topic %@", topic); - } - NSRange range = NSMakeRange(2 + topicLength, data.length - topicLength - 2); - data = [data subdataWithRange:range]; - - if (msg.qos == 0) { - if (self.protocolLevel == MQTTProtocolVersion50) { - int propertiesLength = [MQTTProperties getVariableLength:data]; - int variableLength = [MQTTProperties variableIntLength:propertiesLength]; - msg.properties = [[MQTTProperties alloc] initFromData:data]; - NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); - data = [data subdataWithRange:range]; - } - if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { - [self.delegate newMessage:self - data:data - onTopic:topic - qos:msg.qos - retained:msg.retainFlag - mid:0]; - } - if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { - [self.delegate newMessageWithFeedback:self - data:data - onTopic:topic - qos:msg.qos - retained:msg.retainFlag - mid:0]; - } - if (self.messageHandler) { - self.messageHandler(data, topic); - } - } else { - if (data.length >= 2) { - bytes = data.bytes; - UInt16 msgId = 256 * bytes[0] + bytes[1]; - msg.mid = msgId; - data = [data subdataWithRange:NSMakeRange(2, data.length - 2)]; - if (msg.qos == 1) { - if (self.protocolLevel == MQTTProtocolVersion50) { - int propertiesLength = [MQTTProperties getVariableLength:data]; - int variableLength = [MQTTProperties variableIntLength:propertiesLength]; - msg.properties = [[MQTTProperties alloc] initFromData:data]; - NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); - data = [data subdataWithRange:range]; - } - - BOOL processed = true; - if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { - [self.delegate newMessage:self - data:data - onTopic:topic - qos:msg.qos - retained:msg.retainFlag - mid:msgId]; - } - if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { - processed = [self.delegate newMessageWithFeedback:self - data:data - onTopic:topic - qos:msg.qos - retained:msg.retainFlag - mid:msgId]; - } - if (self.messageHandler) { - self.messageHandler(data, topic); - } - if (processed) { - (void)[self encode:[MQTTMessage pubackMessageWithMessageId:msgId - protocolLevel:self.protocolLevel - returnCode:MQTTSuccess - reasonString:nil - userProperty:nil]]; - } - return; - } else { - if (![self.persistence storeMessageForClientId:self.clientId - topic:topic - data:data - retainFlag:msg.retainFlag - qos:msg.qos - msgId:msgId - incomingFlag:YES - commandType:MQTTPubrec - deadline:[NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]]) { - DDLogWarn(@"[MQTTSession] dropping incoming messages"); - } else { - [self.persistence sync]; - [self tell]; - (void)[self encode:[MQTTMessage pubrecMessageWithMessageId:msgId - protocolLevel:self.protocolLevel - returnCode:MQTTSuccess - reasonString:nil - userProperty:nil]]; - } - } - } - } -} - -- (void)handlePuback:(MQTTMessage*)msg { - id flow = [self.persistence flowforClientId:self.clientId - incomingFlag:NO - messageId:msg.mid]; - if (flow) { - if ((flow.commandType).intValue == MQTTPublish && (flow.qosLevel).intValue == MQTTQosLevelAtLeastOnce) { - if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:)]) { - [self.delegate messageDelivered:self msgID:msg.mid]; - } - if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:topic:data:qos:retainFlag:)]) { - [self.delegate messageDelivered:self - msgID:msg.mid - topic:flow.topic - data:flow.data - qos:(flow.qosLevel).intValue - retainFlag:(flow.retainedFlag).boolValue]; - } - if (self.synchronPub && self.synchronPubMid == msg.mid) { - self.synchronPub = FALSE; - } - MQTTPublishHandler publishHandler = (self.publishHandlers)[@(msg.mid)]; - if (publishHandler) { - [self.publishHandlers removeObjectForKey:@(msg.mid)]; - [self onPublish:publishHandler error:nil]; - } - [self.persistence deleteFlow:flow]; - [self.persistence sync]; - [self tell]; - } - } -} - -- (void)handleSuback:(MQTTMessage*)msg -{ - if (msg.data.length >= 3) { - UInt8 const *bytes = msg.data.bytes; - UInt16 messageId = (256 * bytes[0] + bytes[1]); - msg.mid = messageId; - NSMutableArray *qoss = [[NSMutableArray alloc] init]; - for (int i = 2; i < msg.data.length; i++) { - [qoss addObject:@(bytes[i])]; - } - if ([self.delegate respondsToSelector:@selector(subAckReceived:msgID:grantedQoss:)]) { - [self.delegate subAckReceived:self msgID:msg.mid grantedQoss:qoss]; - } - if (self.synchronSub && self.synchronSubMid == msg.mid) { - self.synchronSub = FALSE; - } - MQTTSubscribeHandler subscribeHandler = (self.subscribeHandlers)[@(msg.mid)]; - if (subscribeHandler) { - [self.subscribeHandlers removeObjectForKey:@(msg.mid)]; - [self onSubscribe:subscribeHandler error:nil gQoss:qoss]; - } - } -} - -- (void)handleUnsuback:(MQTTMessage *)message { - if ([self.delegate respondsToSelector:@selector(unsubAckReceived:msgID:)]) { - [self.delegate unsubAckReceived:self msgID:message.mid]; - } - if (self.synchronUnsub && self.synchronUnsubMid == message.mid) { - self.synchronUnsub = FALSE; - } - MQTTUnsubscribeHandler unsubscribeHandler = (self.unsubscribeHandlers)[@(message.mid)]; - if (unsubscribeHandler) { - [self.unsubscribeHandlers removeObjectForKey:@(message.mid)]; - [self onUnsubscribe:unsubscribeHandler error:nil]; - } -} - -- (void)handlePubrec:(MQTTMessage *)message { - MQTTMessage *pubrelmessage = [MQTTMessage pubrelMessageWithMessageId:message.mid - protocolLevel:self.protocolLevel - returnCode:MQTTSuccess - reasonString:nil - userProperty:nil]; - id flow = [self.persistence flowforClientId:self.clientId - incomingFlag:NO - messageId:message.mid]; - if (flow) { - if ((flow.commandType).intValue == MQTTPublish && (flow.qosLevel).intValue == MQTTQosLevelExactlyOnce) { - flow.commandType = @(MQTTPubrel); - flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; - [self.persistence sync]; - } - } - (void)[self encode:pubrelmessage]; -} - -- (void)handlePubrel:(MQTTMessage *)message { - id flow = [self.persistence flowforClientId:self.clientId - incomingFlag:YES - messageId:message.mid]; - if (flow) { - BOOL processed = true; - NSData *data = flow.data; - if (self.protocolLevel == MQTTProtocolVersion50) { - int propertiesLength = [MQTTProperties getVariableLength:data]; - int variableLength = [MQTTProperties variableIntLength:propertiesLength]; - NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); - data = [data subdataWithRange:range]; - } - - - if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { - [self.delegate newMessage:self - data:data - onTopic:flow.topic - qos:(flow.qosLevel).intValue - retained:(flow.retainedFlag).boolValue - mid:(flow.messageId).intValue - ]; - } - if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { - processed = [self.delegate newMessageWithFeedback:self - data:data - onTopic:flow.topic - qos:(flow.qosLevel).intValue - retained:(flow.retainedFlag).boolValue - mid:(flow.messageId).intValue - ]; - } - if(self.messageHandler){ - self.messageHandler(flow.data, flow.topic); - } - if (processed) { - [self.persistence deleteFlow:flow]; - [self.persistence sync]; - [self tell]; - (void)[self encode:[MQTTMessage pubcompMessageWithMessageId:message.mid - protocolLevel:self.protocolLevel - returnCode:MQTTSuccess - reasonString:nil - userProperty:nil]]; - } - } -} - -- (void)handlePubcomp:(MQTTMessage *)message { - id flow = [self.persistence flowforClientId:self.clientId - incomingFlag:NO - messageId:message.mid]; - if (flow && (flow.commandType).intValue == MQTTPubrel) { - if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:)]) { - [self.delegate messageDelivered:self msgID:message.mid]; - } - if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:topic:data:qos:retainFlag:)]) { - [self.delegate messageDelivered:self - msgID:message.mid - topic:flow.topic - data:flow.data - qos:(flow.qosLevel).intValue - retainFlag:(flow.retainedFlag).boolValue]; - } - - if (self.synchronPub && self.synchronPubMid == message.mid) { - self.synchronPub = FALSE; - } - MQTTPublishHandler publishHandler = (self.publishHandlers)[@(message.mid)]; - if (publishHandler) { - [self.publishHandlers removeObjectForKey:@(message.mid)]; - [self onPublish:publishHandler error:nil]; - } - [self.persistence deleteFlow:flow]; - [self.persistence sync]; - [self tell]; - } -} - -- (void)connectionError:(NSError *)error { - [self error:MQTTSessionEventConnectionError error:error]; - if ([self.delegate respondsToSelector:@selector(connectionError:error:)]) { - [self.delegate connectionError:self error:error]; - } - if (self.connectHandler) { - MQTTConnectHandler connectHandler = self.connectHandler; - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } -} - -- (void)protocolError:(NSError *)error { - [self error:MQTTSessionEventProtocolError error:error]; - if ([self.delegate respondsToSelector:@selector(protocolError:error:)]) { - [self.delegate protocolError:self error:error]; - } -} - -- (void)error:(MQTTSessionEvent)eventCode error:(NSError *)error { - self.status = MQTTSessionStatusError; - if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { - [self.delegate handleEvent:self event:eventCode error:error]; - } - [self closeInternal]; - - if(self.connectionHandler){ - self.connectionHandler(eventCode); - } - - if (eventCode == MQTTSessionEventConnectionClosedByBroker && self.connectHandler) { - error = [NSError errorWithDomain:MQTTSessionErrorDomain - code:MQTTSessionErrorConnectionRefused - userInfo:@{NSLocalizedDescriptionKey : @"Server has closed connection without connack."}]; - - MQTTConnectHandler connectHandler = self.connectHandler; - self.connectHandler = nil; - [self onConnect:connectHandler error:error]; - } - - self.synchronPub = FALSE; - self.synchronPubMid = 0; - self.synchronSub = FALSE; - self.synchronSubMid = 0; - self.synchronUnsub = FALSE; - self.synchronUnsubMid = 0; - self.synchronConnect = FALSE; - self.synchronDisconnect = FALSE; -} - -- (UInt16)nextMsgId { - DDLogVerbose(@"nextMsgId synchronizing"); - @synchronized(self) { - DDLogVerbose(@"nextMsgId synchronized"); - self.txMsgId++; - while (self.txMsgId == 0 || [self.persistence flowforClientId:self.clientId - incomingFlag:NO - messageId:self.txMsgId] != nil) { - self.txMsgId++; - } - DDLogVerbose(@"nextMsgId synchronized done"); - return self.txMsgId; - } -} - -- (void)tell { - NSUInteger incoming = [self.persistence allFlowsforClientId:self.clientId - incomingFlag:YES].count; - NSUInteger outflowing = [self.persistence allFlowsforClientId:self.clientId - incomingFlag:NO].count; - if ([self.delegate respondsToSelector:@selector(buffered:flowingIn:flowingOut:)]) { - [self.delegate buffered:self - flowingIn:incoming - flowingOut:outflowing]; - } - if ([self.delegate respondsToSelector:@selector(buffered:queued:flowingIn:flowingOut:)]) { - [self.delegate buffered:self - queued:0 - flowingIn:incoming - flowingOut:outflowing]; - } -} - -- (void)onConnect:(MQTTConnectHandler)connectHandler error:(NSError *)error { - connectHandler(error); -} - -- (void)onDisconnect:(MQTTDisconnectHandler)disconnectHandler error:(NSError *)error { - disconnectHandler(error); -} - -- (void)onSubscribe:(MQTTSubscribeHandler)subscribeHandler error:(NSError *)error gQoss:(NSArray *)gqoss { - subscribeHandler(error, gqoss); -} - -- (void)onUnsubscribe:(MQTTUnsubscribeHandler)unsubscribeHandler error:(NSError *)error { - unsubscribeHandler(error); -} - -- (void)onPublish:(MQTTPublishHandler)publishHandler error:(NSError *)error { - publishHandler(error); -} - -#pragma mark - MQTTTransport interface - -- (void)connect { - - if (MQTTStrict.strict && - self.clientId && self.clientId.length < 1 && - !self.cleanSessionFlag) { - NSException* myException = [NSException - exceptionWithName:@"clientId must be at least 1 character long if cleanSessionFlag is off" - reason:[NSString stringWithFormat:@"clientId length = %lu", - (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.clientId) { - NSException* myException = [NSException - exceptionWithName:@"clientId must not be nil" - reason:[NSString stringWithFormat:@"clientId length = %lu", - (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - [self.clientId dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { - NSException* myException = [NSException - exceptionWithName:@"clientId may not be longer than 65535 bytes in UTF8 representation" - reason:[NSString stringWithFormat:@"clientId length = %lu", - (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - ![self.clientId dataUsingEncoding:NSUTF8StringEncoding]) { - NSException* myException = [NSException - exceptionWithName:@"clientId must not contain non-UTF8 characters" - reason:[NSString stringWithFormat:@"clientId = %@", self.clientId] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - [self.userName dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { - NSException* myException = [NSException - exceptionWithName:@"userName may not be longer than 65535 bytes in UTF8 representation" - reason:[NSString stringWithFormat:@"userName length = %lu", - (unsigned long)[self.userName dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - ![self.userName dataUsingEncoding:NSUTF8StringEncoding]) { - NSException* myException = [NSException - exceptionWithName:@"userName must not contain non-UTF8 characters" - reason:[NSString stringWithFormat:@"userName = %@", self.userName] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.userName) { - NSException* myException = [NSException - exceptionWithName:@"password specified without userName" - reason:[NSString stringWithFormat:@"password = %@", self.password] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.protocolLevel != MQTTProtocolVersion31 && - self.protocolLevel != MQTTProtocolVersion311 && - self.protocolLevel != MQTTProtocolVersion50) { - NSException* myException = [NSException - exceptionWithName:@"Illegal protocolLevel" - reason:[NSString stringWithFormat:@"%d is not 3, 4, or 5", self.protocolLevel] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.willFlag && - self.willTopic) { - NSException* myException = [NSException - exceptionWithName:@"Will topic must be nil if willFlag is false" - reason:[NSString stringWithFormat:@"%@", self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.willFlag && - self.willMsg) { - NSException* myException = [NSException - exceptionWithName:@"Will message must be nil if willFlag is false" - reason:[NSString stringWithFormat:@"%@", self.willMsg] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.willFlag && - self.willRetainFlag) { - NSException* myException = [NSException - exceptionWithName:@"Will retain must be false if willFlag is false" - reason:[NSString stringWithFormat:@"%d", self.willRetainFlag] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - !self.willFlag && - self.willQoS != MQTTQosLevelAtMostOnce) { - NSException* myException = [NSException - exceptionWithName:@"Will QoS Level must be 0 if willFlag is false" - reason:[NSString stringWithFormat:@"%d", self.willQoS] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willQoS != MQTTQosLevelAtMostOnce && - self.willQoS != MQTTQosLevelAtLeastOnce && - self.willQoS != MQTTQosLevelExactlyOnce) { - NSException* myException = [NSException - exceptionWithName:@"Illegal will QoS level" - reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", self.willQoS] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willFlag && - !self.willTopic) { - NSException* myException = [NSException - exceptionWithName:@"Will topic must not be nil if willFlag is true" - reason:[NSString stringWithFormat:@"%@", self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willTopic && - self.willTopic.length < 1) { - NSException* myException = [NSException - exceptionWithName:@"Will topic must be at least 1 character long" - reason:[NSString stringWithFormat:@"%@", self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willTopic && - [self.willTopic dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { - NSException* myException = [NSException - exceptionWithName:@"willTopic may not be longer than 65535 bytes in UTF8 representation" - reason:[NSString stringWithFormat:@"willTopic length = %lu", - (unsigned long)[self.willTopic dataUsingEncoding:NSUTF8StringEncoding].length] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willTopic && - ![self.willTopic dataUsingEncoding:NSUTF8StringEncoding]) { - NSException* myException = [NSException - exceptionWithName:@"willTopic must not contain non-UTF8 characters" - reason:[NSString stringWithFormat:@"willTopic = %@", self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willTopic && - ([self.willTopic containsString:@"+"] || - [self.willTopic containsString:@"#"]) - ) { - NSException* myException = [NSException - exceptionWithName:@"willTopic must not contain wildcards" - reason:[NSString stringWithFormat:@"willTopic = %@", self.self.willTopic] - userInfo:nil]; - @throw myException; - } - - if (MQTTStrict.strict && - self.willFlag && - !self.willMsg) { - NSException* myException = [NSException - exceptionWithName:@"Will message must not be nil if willFlag is true" - reason:[NSString stringWithFormat:@"%@", self.willMsg] - userInfo:nil]; - @throw myException; - } - - DDLogVerbose(@"[MQTTSession] connecting"); - if (self.cleanSessionFlag) { - [self.persistence deleteAllFlowsForClientId:self.clientId]; - [self.subscribeHandlers removeAllObjects]; - [self.unsubscribeHandlers removeAllObjects]; - [self.publishHandlers removeAllObjects]; - } - [self tell]; - - self.status = MQTTSessionStatusConnecting; - - self.decoder = [[MQTTDecoder alloc] init]; - self.decoder.queue = self.queue; - self.decoder.delegate = self; - [self.decoder open]; - - self.transport.delegate = self; - [self.transport open]; -} - -- (void)connectWithConnectHandler:(MQTTConnectHandler)connectHandler { - DDLogVerbose(@"[MQTTSession] connectWithConnectHandler:%p", connectHandler); - self.connectHandler = connectHandler; - [self connect]; -} - -- (BOOL)encode:(MQTTMessage *)message { - if (message) { - NSData *wireFormat = message.wireFormat; - if (wireFormat) { - if (self.delegate) { - if ([self.delegate respondsToSelector:@selector(sending:type:qos:retained:duped:mid:data:)]) { - [self.delegate sending:self - type:message.type - qos:message.qos - retained:message.retainFlag - duped:message.dupFlag - mid:message.mid - data:message.data]; - } - } - DDLogVerbose(@"[MQTTSession] mqttTransport send"); - return [self.transport send:wireFormat]; - } else { - DDLogError(@"[MQTTSession] trying to send message without wire format"); - return false; - } - } else { - DDLogError(@"[MQTTSession] trying to send nil message"); - return false; - } -} - -#pragma mark - MQTTTransport delegate -- (void)mqttTransport:(id)mqttTransport didReceiveMessage:(NSData *)message { - DDLogVerbose(@"[MQTTSession] mqttTransport didReceiveMessage"); - - [self.decoder decodeMessage:message]; - -} - -- (void)mqttTransportDidClose:(id)mqttTransport { - DDLogVerbose(@"[MQTTSession] mqttTransport mqttTransportDidClose"); - - [self error:MQTTSessionEventConnectionClosedByBroker error:nil]; - -} - -- (void)mqttTransportDidOpen:(id)mqttTransport { - DDLogVerbose(@"[MQTTSession] mqttTransportDidOpen"); - - DDLogVerbose(@"[MQTTSession] sending CONNECT"); - - if (!self.connectMessage) { - (void)[self encode:[MQTTMessage connectMessageWithClientId:self.clientId - userName:self.userName - password:self.password - keepAlive:self.keepAliveInterval - cleanSession:self.cleanSessionFlag - will:self.willFlag - willTopic:self.willTopic - willMsg:self.willMsg - willQoS:self.willQoS - willRetain:self.willRetainFlag - protocolLevel:self.protocolLevel - sessionExpiryInterval:self.sessionExpiryInterval - authMethod:self.authMethod - authData:self.authData - requestProblemInformation:self.requestProblemInformation - willDelayInterval:self.willDelayInterval - requestResponseInformation:self.requestResponseInformation - receiveMaximum:self.receiveMaximum - topicAliasMaximum:self.topicAliasMaximum - userProperty:self.userProperty - maximumPacketSize:self.maximumPacketSize]]; - } else { - (void)[self encode:self.connectMessage]; - } -} - -- (void)mqttTransport:(id)mqttTransport didFailWithError:(NSError *)error { - DDLogWarn(@"[MQTTSession] mqttTransport didFailWithError %@", error); - - [self connectionError:error]; -} -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h deleted file mode 100644 index b0f075a..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h +++ /dev/null @@ -1,112 +0,0 @@ -// -// MQTTSessionLegacy.h -// MQTTClient.framework -// - -/** - Using MQTT in your Objective-C application - This file contains definitions for mqttio-OBJC backward compatibility - - @author Christoph Krey c@ckrey.de - @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. - - based on Copyright (c) 2011, 2013, 2lemetry LLC - All rights reserved. This program and the accompanying materials - are made available under the terms of the Eclipse Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/epl-v10.html - - @see http://mqtt.org - */ - - -#import -#import "MQTTSession.h" - -@interface MQTTSession(Create) - -/** initialises the MQTT session - * - * this constructor can specifies SSL securityPolicy. the default value of securityPolicy is nil(which do nothing). - * - * if SSL is enabled, by default it only evaluate server's certificates using CA infrastructure, and for most case, this type of check is enough. - * However, if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks - * and other vulnerabilities. you may need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). - * - * NOTE: about self-signed server certificates: - * In CA infrastructure, you may establish a SSL/TLS connection with server which using self-signed certificates - * by install the certificates into OS keychain(either programmatically or manually). however, this method has some disadvantages: - * 1. every socket you app created will trust certificates you added. - * 2. if user choice to remove certificates from keychain, you app need to handling certificates re-adding. - * - * If you only want to verify the cert for the socket you are creating and for no other sockets in your app, you need to use - * MQTTSSLSecurityPolicy. - * And if you use self-signed server certificates, your need to set property: MQTTSSLSecurityPolicy.allowInvalidCertificates=YES - * (see MQTTSSLSecurityPolicy.h for more detail). - * - * @param clientId The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. - * @param userName an NSString object containing the user's name (or ID) for authentication. May be nil. - * @param password an NSString object containing the user's password. If userName is nil, password must be nil as well. - * @param keepAliveInterval The Keep Alive is a time interval measured in seconds. The MQTTClient ensures that the interval between Control Packets being sent does not exceed the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. - * @param cleanSessionFlag specifies if the server should discard previous session information. - * @param willFlag If the Will Flag is set to YES this indicates that a Will Message MUST be published by the Server when the Server detects that the Client is disconnected for any reason other than the Client flowing a DISCONNECT Packet. - * @param willTopic If the Will Flag is set to YES, the Will Topic is a string, nil otherwise. - * @param willMsg If the Will Flag is set to YES the Will Message must be specified, nil otherwise. - * @param willQoS specifies the QoS level to be used when publishing the Will Message. If the Will Flag is set to NO, then the Will QoS MUST be set to 0. If the Will Flag is set to YES, the value of Will QoS can be 0 (0x00), 1 (0x01), or 2 (0x02). - * @param willRetainFlag indicates if the server should publish the Will Messages with retainFlag. If the Will Flag is set to NO, then the Will Retain Flag MUST be set to NO . If the Will Flag is set to YES: If Will Retain is set to NO, the Server MUST publish the Will Message as a non-retained publication [MQTT-3.1.2-14]. If Will Retain is set to YES, the Server MUST publish the Will Message as a retained publication [MQTT-3.1.2-15]. - * @param protocolLevel specifies the protocol to be used. The value of the Protocol Level field for the version 3.1.1 of the protocol is 4. The value for the version 3.1 is 3. - * @param queue The queue where the streams are scheduled. - * @param securityPolicy The security policy used to evaluate server trust for secure connections. - * @param certificates An identity certificate used to reply to a server requiring client certificates according to the description given for SSLSetCertificate(). You may build the certificates array yourself or use the sundry method clientCertFromP12 - * @return the initialised MQTTSession object - * - * @code - #import "MQTTClient.h" - - NSString* certificate = [[NSBundle bundleForClass:[MQTTSession class]] pathForResource:@"certificate" ofType:@"cer"]; - MQTTSSLSecurityPolicy *securityPolicy = [MQTTSSLSecurityPolicy policyWithPinningMode:MQTTSSLPinningModeCertificate]; - securityPolicy.pinnedCertificates = @[ [NSData dataWithContentsOfFile:certificate] ]; - securityPolicy.allowInvalidCertificates = YES; // if your certificate is self-signed(which didn't coupled with CA infrastructure) - - MQTTSession *session = [[MQTTSession alloc] - initWithClientId:@"example-1234" - userName:@"user" - password:@"secret" - keepAlive:60 - cleanSession:YES - will:YES - willTopic:@"example/status" - willMsg:[[@"Client off-line"] dataUsingEncoding:NSUTF8StringEncoding] - willQoS:2 - willRetainFlag:YES - protocolLevel:4 - queue:dispatch_queue_get_main_queue() - securityPolicy:securityPolicy - certificates:certificates]; - - [session connectToHost:@"example-1234" port:1883 usingSSL:YES]; - @endcode - */ -- (MQTTSession *)initWithClientId:(NSString *)clientId - userName:(NSString *)userName - password:(NSString *)password - keepAlive:(UInt16)keepAliveInterval - connectMessage:(MQTTMessage *)theConnectMessage - cleanSession:(BOOL)cleanSessionFlag - will:(BOOL)willFlag - willTopic:(NSString *)willTopic - willMsg:(NSData *)willMsg - willQoS:(MQTTQosLevel)willQoS - willRetainFlag:(BOOL)willRetainFlag - protocolLevel:(UInt8)protocolLevel - queue:(dispatch_queue_t)queue - securityPolicy:(MQTTSSLSecurityPolicy *) securityPolicy - certificates:(NSArray *)certificates; - -/** for mqttio-OBJC backward compatibility - @param payload JSON payload is converted to NSData and then send. See publishData for description - @param theTopic see publishData for description - */ -- (void)publishJson:(id)payload onTopic:(NSString *)theTopic; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m deleted file mode 100644 index ad3c18b..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m +++ /dev/null @@ -1,86 +0,0 @@ -// -// MQTTSessionLegacy.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// -// based on -// -// Copyright (c) 2011, 2013, 2lemetry LLC -// -// All rights reserved. This program and the accompanying materials -// are made available under the terms of the Eclipse Public License v1.0 -// which accompanies this distribution, and is available at -// http://www.eclipse.org/legal/epl-v10.html -// -// Contributors: -// Kyle Roche - initial API and implementation and/or initial documentation -// - -/** - Using MQTT in your Objective-C application - - This file contains implementation for mqttio-OBJC backward compatibility - - @author Christoph Krey c@ckrey.de - @see http://mqtt.org - */ - -#import "MQTTSession.h" -#import "MQTTSessionLegacy.h" -#import "MQTTCFSocketTransport.h" -#import "MQTTSSLSecurityPolicyTransport.h" - -#import "MQTTLog.h" - -@interface MQTTSession() -@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; - -@end - -@implementation MQTTSession(Legacy) - -- (MQTTSession *)initWithClientId:(NSString *)clientId - userName:(NSString *)userName - password:(NSString *)password - keepAlive:(UInt16)keepAliveInterval - connectMessage:(MQTTMessage *)theConnectMessage - cleanSession:(BOOL)cleanSessionFlag - will:(BOOL)willFlag - willTopic:(NSString *)willTopic - willMsg:(NSData *)willMsg - willQoS:(MQTTQosLevel)willQoS - willRetainFlag:(BOOL)willRetainFlag - protocolLevel:(UInt8)protocolLevel - queue:(dispatch_queue_t)queue - securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy - certificates:(NSArray *)certificates { - DDLogVerbose(@"[MQTTSessionLegacy] initWithClientId:%@ ", clientId); - - self = [self init]; - self.connectMessage = theConnectMessage; - self.clientId = clientId; - self.userName = userName; - self.password = password; - self.keepAliveInterval = keepAliveInterval; - self.cleanSessionFlag = cleanSessionFlag; - self.willFlag = willFlag; - self.willTopic = willTopic; - self.willMsg = willMsg; - self.willQoS = willQoS; - self.willRetainFlag = willRetainFlag; - self.protocolLevel = protocolLevel; - self.queue = queue; - self.securityPolicy = securityPolicy; - self.certificates = certificates; - - return self; -} - -- (void)publishJson:(id)payload onTopic:(NSString*)theTopic { - NSData *data = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil]; - if (data) { - [self publishData:data onTopic:theTopic retain:FALSE qos:MQTTQosLevelAtLeastOnce]; - } -} -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h deleted file mode 100644 index dc2fafb..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h +++ /dev/null @@ -1,237 +0,0 @@ -// -// MQTTSessionManager.h -// MQTTClient -// -// Created by Christoph Krey on 09.07.14. -// Copyright © 2013-2017 Christoph Krey. All rights reserved. -// - -#import -#if TARGET_OS_IPHONE == 1 -#import -#endif -#import "MQTTSession.h" -#import "MQTTSessionLegacy.h" -#import "MQTTSSLSecurityPolicy.h" - -@class MQTTSessionManager; - -/** delegate gives your application access to received messages - */ -@protocol MQTTSessionManagerDelegate - -/** - Enumeration of MQTTSessionManagerState values - */ -typedef NS_ENUM(int, MQTTSessionManagerState) { - MQTTSessionManagerStateStarting, - MQTTSessionManagerStateConnecting, - MQTTSessionManagerStateError, - MQTTSessionManagerStateConnected, - MQTTSessionManagerStateClosing, - MQTTSessionManagerStateClosed -}; - -@optional - -/** gets called when a new message was received - - @param data the data received, might be zero length - @param topic the topic the data was published to - @param retained indicates if the data retransmitted from server storage - */ -- (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained; - -/** gets called when a new message was received - @param sessionManager the instance of MQTTSessionManager whose state changed - @param data the data received, might be zero length - @param topic the topic the data was published to - @param retained indicates if the data retransmitted from server storage - */ -- (void)sessionManager:(MQTTSessionManager *)sessionManager - didReceiveMessage:(NSData *)data - onTopic:(NSString *)topic - retained:(BOOL)retained; - -/** gets called when a published message was actually delivered - @param msgID the Message Identifier of the delivered message - @note this method is called after a publish with qos 1 or 2 only - */ -- (void)messageDelivered:(UInt16)msgID; - -/** gets called when a published message was actually delivered - @param sessionManager the instance of MQTTSessionManager whose state changed - @param msgID the Message Identifier of the delivered message - @note this method is called after a publish with qos 1 or 2 only - */ -- (void)sessionManager:(MQTTSessionManager *)sessionManager didDeliverMessage:(UInt16)msgID; - -/** gets called when the connection status changes - @param sessionManager the instance of MQTTSessionManager whose state changed - @param newState the new connection state of the sessionManager. This will be identical to `sessionManager.state`. - */ -- (void)sessionManager:(MQTTSessionManager *)sessionManager didChangeState:(MQTTSessionManagerState)newState; - -@end - -/** SessionManager handles the MQTT session for your application - */ -@interface MQTTSessionManager : NSObject - -/** Underlying MQTTSession currently in use. - */ -@property (strong, nonatomic, readonly) MQTTSession *session; - -/** host an NSString containing the hostName or IP address of the Server - */ -@property (readonly) NSString *host; - -/** port an unsigned 32 bit integer containing the IP port number of the Server - */ -@property (readonly) UInt32 port; - -/** the delegate receiving incoming messages - */ -@property (weak, nonatomic) id delegate; - -/** indicates if manager requires tear down - */ -@property (readonly) BOOL requiresTearDown; - -/** subscriptions is a dictionary of NSNumber instances indicating the MQTTQoSLevel. - * The keys are topic filters. - * The SessionManager subscribes to the given subscriptions after successfull (re-)connect - * according to the cleansession parameter and the state of the session as indicated by the broker. - * Setting a new subscriptions dictionary initiates SUBSCRIBE or UNSUBSCRIBE messages by SessionManager - * by comparing the old and new subscriptions. - */ -@property (strong, nonatomic) NSDictionary *subscriptions; - -/** effectiveSubscriptions s a dictionary of NSNumber instances indicating the granted MQTTQoSLevel, or 0x80 for subscription failure. - * The keys are topic filters. - * effectiveSubscriptions is observable and is updated everytime subscriptions change - * @code - ... - MQTTSessionManager *manager = [[MQTTSessionManager alloc] init]; - manager.delegate = self; - - [manager addObserver:self - forKeyPath:@"effectiveSubscriptions" - options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew - context:nil]; - manager.subscriptions = [@{@"#": @(0)} mutableCopy]; - [manager connectTo: ... - ... - [manager removeObserver:self forKeyPath:@"effectiveSubscriptions"]; - ... - - - (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context { - if ([keyPath isEqualToString:@"effectiveSubscriptions"]) { - MQTTSessionManager *manager = (MQTTSessionManager *)object; - DDLogVerbose(@"effectiveSubscriptions changed: %@", manager.effectiveSubscriptions); - } - } - * @endcode - */ -@property (readonly, strong, nonatomic) NSDictionary *effectiveSubscriptions; - -/** SessionManager status - */ -@property (nonatomic, readonly) MQTTSessionManagerState state; - -/** SessionManager last error code when state equals MQTTSessionManagerStateError - */ -@property (nonatomic, readonly) NSError *lastErrorCode; - -/** initWithPersistence sets the MQTTPersistence properties other than default - * @param persistent YES or NO (default) to establish file or in memory persistence. - * @param maxWindowSize (a positive number, default is 16) to control the number of messages sent before waiting for acknowledgement in Qos 1 or 2. Additional messages are stored and transmitted later. - * @param maxSize (a positive number of bytes, default is 64 MB) to limit the size of the persistence file. Messages published after the limit is reached are dropped. - * @param maxMessages (a positive number, default is 1024) to limit the number of messages stored. Additional messages published are dropped. - * @param maxRetryInterval The duration at which the connection-retry timer should be capped. When MQTTSessionManager receives a ClosedByBroker or an Error - event, it will attempt to reconnect to the broker. The time in between connection attempts is doubled each time, until it remains at maxRetryInterval. - Defaults to 64 seconds. - * @param connectInForeground Whether or not to connect the MQTTSession when the app enters the foreground, and disconnect when it becomes inactive. When NO, the caller is responsible for calling -connectTo: and -disconnect. Defaults to YES. - * @param streamSSLLevel an NSString containing the security level for read and write streams - * For list of possible values see: - * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants - * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list - * and cannot be used as constant, but you can use it as a string value - * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL - * @param queue Queue for MQTTSession. - * @return the initialized MQTTSessionManager object - */ - -- (MQTTSessionManager *)initWithPersistence:(BOOL)persistent - maxWindowSize:(NSUInteger)maxWindowSize - maxMessages:(NSUInteger)maxMessages - maxSize:(NSUInteger)maxSize - maxConnectionRetryInterval:(NSTimeInterval)maxRetryInterval - connectInForeground:(BOOL)connectInForeground - streamSSLLevel:(NSString *)streamSSLLevel - queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; - -/** Connects to the MQTT broker and stores the parameters for subsequent reconnects - * @param host specifies the hostname or ip address to connect to. Defaults to @"localhost". - * @param port specifies the port to connect to - * @param tls specifies whether to use SSL or not - * @param keepalive The Keep Alive is a time interval measured in seconds. The MQTTClient ensures that the interval between Control Packets being sent does not exceed the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. - * @param clean specifies if the server should discard previous session information. - * @param auth specifies the user and pass parameters should be used for authenthication - * @param user an NSString object containing the user's name (or ID) for authentication. May be nil. - * @param pass an NSString object containing the user's password. If userName is nil, password must be nil as well. - * @param will indicates whether a will shall be sent - * @param willTopic the Will Topic is a string, may be nil - * @param willMsg the Will Message, might be zero length or nil - * @param willQos specifies the QoS level to be used when publishing the Will Message. - * @param willRetainFlag indicates if the server should publish the Will Messages with retainFlag. - * @param clientId The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. - * @param securityPolicy A custom SSL security policy or nil. - * @param certificates An NSArray of the pinned certificates to use or nil. - * @param protocolLevel Protocol version of the connection. - * @param connectHandler Called when first connected or if error occurred. It is not called on subsequent internal reconnects. - */ - -- (void)connectTo:(NSString *)host - port:(NSInteger)port - tls:(BOOL)tls - keepalive:(NSInteger)keepalive - clean:(BOOL)clean - auth:(BOOL)auth - user:(NSString *)user - pass:(NSString *)pass - will:(BOOL)will - willTopic:(NSString *)willTopic - willMsg:(NSData *)willMsg - willQos:(MQTTQosLevel)willQos - willRetainFlag:(BOOL)willRetainFlag - withClientId:(NSString *)clientId - securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy - certificates:(NSArray *)certificates - protocolLevel:(MQTTProtocolVersion)protocolLevel - connectHandler:(MQTTConnectHandler)connectHandler; - -/** Re-Connects to the MQTT broker using the parameters for given in the connectTo method - */ -- (void)connectToLast:(MQTTConnectHandler)connectHandler; - -/** publishes data on a given topic at a specified QoS level and retain flag - - @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. - @param topic the Topic to identify the data - @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES - @param qos specifies the Quality of Service for the publish - qos can be 0, 1, or 2. - @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped - @note returns immediately. - */ -- (UInt16)sendData:(NSData *)data topic:(NSString *)topic qos:(MQTTQosLevel)qos retain:(BOOL)retainFlag; - -/** Disconnects gracefully from the MQTT broker - */ -- (void)disconnectWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m deleted file mode 100644 index dbefc5c..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m +++ /dev/null @@ -1,420 +0,0 @@ -// -// MQTTSessionManager.m -// MQTTClient -// -// Created by Christoph Krey on 09.07.14. -// Copyright © 2013-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTSessionManager.h" -#import "MQTTCoreDataPersistence.h" -#import "MQTTLog.h" -#import "ReconnectTimer.h" -#import "ForegroundReconnection.h" -#import "MQTTSSLSecurityPolicyTransport.h" - -@interface MQTTSessionManager() - -@property (nonatomic, readwrite) MQTTSessionManagerState state; -@property (nonatomic, readwrite) NSError *lastErrorCode; - -@property (strong, nonatomic) ReconnectTimer *reconnectTimer; -@property (nonatomic) BOOL reconnectFlag; - -@property (strong, nonatomic) MQTTSession *session; - -@property (strong, nonatomic) NSString *host; -@property (nonatomic) UInt32 port; -@property (nonatomic) BOOL tls; -@property (nonatomic) NSInteger keepalive; -@property (nonatomic) BOOL clean; -@property (nonatomic) BOOL auth; -@property (nonatomic) BOOL will; -@property (strong, nonatomic) NSString *user; -@property (strong, nonatomic) NSString *pass; -@property (strong, nonatomic) NSString *willTopic; -@property (strong, nonatomic) NSData *willMsg; -@property (nonatomic) NSInteger willQos; -@property (nonatomic) BOOL willRetainFlag; -@property (strong, nonatomic) NSString *clientId; -@property (strong, nonatomic) dispatch_queue_t queue; -@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; -@property (strong, nonatomic) NSArray *certificates; -@property (nonatomic) MQTTProtocolVersion protocolLevel; - -#if TARGET_OS_IPHONE == 1 -@property (strong, nonatomic) ForegroundReconnection *foregroundReconnection; -#endif - -@property (nonatomic) BOOL persistent; -@property (nonatomic) NSUInteger maxWindowSize; -@property (nonatomic) NSUInteger maxSize; -@property (nonatomic) NSUInteger maxMessages; -@property (strong, nonatomic) NSString *streamSSLLevel; - -@property (strong, nonatomic) NSDictionary *internalSubscriptions; -@property (strong, nonatomic) NSDictionary *effectiveSubscriptions; -@property (strong, nonatomic) NSLock *subscriptionLock; - -@end - -#define RECONNECT_TIMER 1.0 -#define RECONNECT_TIMER_MAX_DEFAULT 64.0 - -@implementation MQTTSessionManager - -- (instancetype)init { - self = [self initWithPersistence:MQTT_PERSISTENT - maxWindowSize:MQTT_MAX_WINDOW_SIZE - maxMessages:MQTT_MAX_MESSAGES - maxSize:MQTT_MAX_SIZE - maxConnectionRetryInterval:RECONNECT_TIMER_MAX_DEFAULT - connectInForeground:YES - streamSSLLevel:(NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL - queue:dispatch_get_main_queue()]; - return self; -} - -- (MQTTSessionManager *)initWithPersistence:(BOOL)persistent - maxWindowSize:(NSUInteger)maxWindowSize - maxMessages:(NSUInteger)maxMessages - maxSize:(NSUInteger)maxSize - maxConnectionRetryInterval:(NSTimeInterval)maxRetryInterval - connectInForeground:(BOOL)connectInForeground - streamSSLLevel:(NSString *)streamSSLLevel - queue:(dispatch_queue_t)queue { - self = [super init]; - self.streamSSLLevel = streamSSLLevel; - self.queue = queue; - [self updateState:MQTTSessionManagerStateStarting]; - self.internalSubscriptions = [[NSMutableDictionary alloc] init]; - self.effectiveSubscriptions = [[NSMutableDictionary alloc] init]; - self.persistent = persistent; - self.maxWindowSize = maxWindowSize; - self.maxSize = maxSize; - self.maxMessages = maxMessages; - - __weak MQTTSessionManager *weakSelf = self; - self.reconnectTimer = [[ReconnectTimer alloc] initWithRetryInterval:RECONNECT_TIMER - maxRetryInterval:maxRetryInterval - queue:self.queue - reconnectBlock:^{ - [weakSelf reconnect:nil]; - }]; -#if TARGET_OS_IPHONE == 1 - if (connectInForeground) { - self.foregroundReconnection = [[ForegroundReconnection alloc] initWithMQTTSessionManager:self]; - } -#endif - self.subscriptionLock = [[NSLock alloc] init]; - - return self; -} - -- (void)connectTo:(NSString *)host - port:(NSInteger)port - tls:(BOOL)tls - keepalive:(NSInteger)keepalive - clean:(BOOL)clean - auth:(BOOL)auth - user:(NSString *)user - pass:(NSString *)pass - will:(BOOL)will - willTopic:(NSString *)willTopic - willMsg:(NSData *)willMsg - willQos:(MQTTQosLevel)willQos - willRetainFlag:(BOOL)willRetainFlag - withClientId:(NSString *)clientId - securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy - certificates:(NSArray *)certificates - protocolLevel:(MQTTProtocolVersion)protocolLevel - connectHandler:(MQTTConnectHandler)connectHandler { - DDLogVerbose(@"MQTTSessionManager connectTo:%@", host); - BOOL shouldReconnect = self.session != nil; - if (!self.session || - ![host isEqualToString:self.host] || - port != self.port || - tls != self.tls || - keepalive != self.keepalive || - clean != self.clean || - auth != self.auth || - ![user isEqualToString:self.user] || - ![pass isEqualToString:self.pass] || - ![willTopic isEqualToString:self.willTopic] || - ![willMsg isEqualToData:self.willMsg] || - willQos != self.willQos || - willRetainFlag != self.willRetainFlag || - ![clientId isEqualToString:self.clientId] || - securityPolicy != self.securityPolicy || - certificates != self.certificates) { - self.host = host; - self.port = (int)port; - self.tls = tls; - self.keepalive = keepalive; - self.clean = clean; - self.auth = auth; - self.user = user; - self.pass = pass; - self.will = will; - self.willTopic = willTopic; - self.willMsg = willMsg; - self.willQos = willQos; - self.willRetainFlag = willRetainFlag; - self.clientId = clientId; - self.securityPolicy = securityPolicy; - self.certificates = certificates; - self.protocolLevel = protocolLevel; - - self.session = [[MQTTSession alloc] initWithClientId:clientId - userName:auth ? user : nil - password:auth ? pass : nil - keepAlive:keepalive - connectMessage:nil - cleanSession:clean - will:will - willTopic:willTopic - willMsg:willMsg - willQoS:willQos - willRetainFlag:willRetainFlag - protocolLevel:protocolLevel - queue:self.queue - securityPolicy:securityPolicy - certificates:certificates]; - self.session.streamSSLLevel = self.streamSSLLevel; - MQTTCoreDataPersistence *persistence = [[MQTTCoreDataPersistence alloc] init]; - - persistence.persistent = self.persistent; - persistence.maxWindowSize = self.maxWindowSize; - persistence.maxSize = self.maxSize; - persistence.maxMessages = self.maxMessages; - - self.session.persistence = persistence; - - self.session.delegate = self; - self.reconnectFlag = FALSE; - } - if (shouldReconnect) { - DDLogVerbose(@"[MQTTSessionManager] reconnecting"); - [self disconnectWithDisconnectHandler:nil]; - [self reconnect:connectHandler]; - } else { - DDLogVerbose(@"[MQTTSessionManager] connecting"); - [self connectToInternal:connectHandler]; - } -} - -- (UInt16)sendData:(NSData *)data topic:(NSString *)topic qos:(MQTTQosLevel)qos retain:(BOOL)retainFlag { - if (self.state != MQTTSessionManagerStateConnected) { - [self connectToLast:nil]; - } - UInt16 msgId = [self.session publishData:data - onTopic:topic - retain:retainFlag - qos:qos]; - return msgId; -} - -- (void)disconnectWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler { - [self updateState:MQTTSessionManagerStateClosing]; - [self.session closeWithDisconnectHandler:disconnectHandler]; - [self.reconnectTimer stop]; -} - -- (BOOL)requiresTearDown { - return (self.state != MQTTSessionManagerStateClosed && - self.state != MQTTSessionManagerStateStarting); -} - -- (void)updateState:(MQTTSessionManagerState)newState { - self.state = newState; - - if ([self.delegate respondsToSelector:@selector(sessionManager:didChangeState:)]) { - [self.delegate sessionManager:self didChangeState:newState]; - } -} - - -#pragma mark - MQTT Callback methods - -- (void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error { -#ifdef DEBUG - __unused const NSDictionary *events = @{ - @(MQTTSessionEventConnected): @"connected", - @(MQTTSessionEventConnectionRefused): @"connection refused", - @(MQTTSessionEventConnectionClosed): @"connection closed", - @(MQTTSessionEventConnectionError): @"connection error", - @(MQTTSessionEventProtocolError): @"protocoll error", - @(MQTTSessionEventConnectionClosedByBroker): @"connection closed by broker" - }; - DDLogVerbose(@"[MQTTSessionManager] eventCode: %@ (%ld) %@", events[@(eventCode)], (long)eventCode, error); -#endif - switch (eventCode) { - case MQTTSessionEventConnected: - self.lastErrorCode = nil; - [self updateState:MQTTSessionManagerStateConnected]; - [self.reconnectTimer resetRetryInterval]; - break; - - case MQTTSessionEventConnectionClosed: - [self updateState:MQTTSessionManagerStateClosed]; - break; - - case MQTTSessionEventConnectionClosedByBroker: - if (self.state != MQTTSessionManagerStateClosing) { - [self triggerDelayedReconnect]; - } - [self updateState:MQTTSessionManagerStateClosed]; - break; - - case MQTTSessionEventProtocolError: - case MQTTSessionEventConnectionRefused: - case MQTTSessionEventConnectionError: - [self triggerDelayedReconnect]; - self.lastErrorCode = error; - [self updateState:MQTTSessionManagerStateError]; - break; - - default: - break; - } -} - -- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid { - if (self.delegate) { - if ([self.delegate respondsToSelector:@selector(sessionManager:didReceiveMessage:onTopic:retained:)]) { - [self.delegate sessionManager:self didReceiveMessage:data onTopic:topic retained:retained]; - } - if ([self.delegate respondsToSelector:@selector(handleMessage:onTopic:retained:)]) { - [self.delegate handleMessage:data onTopic:topic retained:retained]; - } - } -} - -- (void)connected:(MQTTSession *)session sessionPresent:(BOOL)sessionPresent { - if (self.clean || !self.reconnectFlag || !sessionPresent) { - NSDictionary *subscriptions = [self.internalSubscriptions copy]; - [self.subscriptionLock lock]; - self.effectiveSubscriptions = [[NSMutableDictionary alloc] init]; - [self.subscriptionLock unlock]; - if (subscriptions.count) { - __weak MQTTSessionManager *weakSelf = self; - [self.session subscribeToTopics:subscriptions subscribeHandler:^(NSError *error, NSArray *gQoss) { - MQTTSessionManager *strongSelf = weakSelf; - if (!error) { - NSArray *allTopics = subscriptions.allKeys; - for (int i = 0; i < allTopics.count; i++) { - NSString *topic = allTopics[i]; - NSNumber *gQos = gQoss[i]; - [strongSelf.subscriptionLock lock]; - NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; - newEffectiveSubscriptions[topic] = gQos; - strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; - [strongSelf.subscriptionLock unlock]; - } - } - }]; - - } - self.reconnectFlag = TRUE; - } -} - -- (void)messageDelivered:(MQTTSession *)session msgID:(UInt16)msgID { - if (self.delegate) { - if ([self.delegate respondsToSelector:@selector(sessionManager:didDeliverMessage:)]) { - [self.delegate sessionManager:self didDeliverMessage:msgID]; - } - if ([self.delegate respondsToSelector:@selector(messageDelivered:)]) { - [self.delegate messageDelivered:msgID]; - } - } -} - - -- (void)connectToInternal:(MQTTConnectHandler)connectHandler { - if (self.session && self.state == MQTTSessionManagerStateStarting) { - [self updateState:MQTTSessionManagerStateConnecting]; - MQTTCFSocketTransport *transport; - if (self.securityPolicy) { - transport = [[MQTTSSLSecurityPolicyTransport alloc] init]; - ((MQTTSSLSecurityPolicyTransport *)transport).securityPolicy = self.securityPolicy; - } else { - transport = [[MQTTCFSocketTransport alloc] init]; - } - transport.host = self.host; - transport.port = self.port; - transport.tls = self.tls; - transport.certificates = self.certificates; - transport.voip = self.session.voip; - transport.queue = self.queue; - transport.streamSSLLevel = self.streamSSLLevel; - self.session.transport = transport; - [self.session connectWithConnectHandler:connectHandler]; - } -} - -- (void)reconnect:(MQTTConnectHandler)connectHandler { - [self updateState:MQTTSessionManagerStateStarting]; - [self connectToInternal:connectHandler]; -} - -- (void)connectToLast:(MQTTConnectHandler)connectHandler { - if (self.state == MQTTSessionManagerStateConnected) { - return; - } - [self.reconnectTimer resetRetryInterval]; - [self reconnect:connectHandler]; -} - -- (void)triggerDelayedReconnect { - [self.reconnectTimer schedule]; -} - -- (NSDictionary *)subscriptions { - return self.internalSubscriptions; -} - -- (void)setSubscriptions:(NSDictionary *)newSubscriptions { - if (self.state == MQTTSessionManagerStateConnected) { - NSDictionary *currentSubscriptions = [self.effectiveSubscriptions copy]; - - for (NSString *topicFilter in currentSubscriptions) { - if (!newSubscriptions[topicFilter]) { - __weak MQTTSessionManager *weakSelf = self; - [self.session unsubscribeTopic:topicFilter unsubscribeHandler:^(NSError *error) { - MQTTSessionManager *strongSelf = weakSelf; - if (!error) { - [strongSelf.subscriptionLock lock]; - NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; - [newEffectiveSubscriptions removeObjectForKey:topicFilter]; - strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; - [strongSelf.subscriptionLock unlock]; - } - }]; - } - } - - for (NSString *topicFilter in newSubscriptions) { - if (!currentSubscriptions[topicFilter]) { - NSNumber *number = newSubscriptions[topicFilter]; - MQTTQosLevel qos = number.unsignedIntValue; - __weak MQTTSessionManager *weakSelf = self; - [self.session subscribeToTopic:topicFilter atLevel:qos subscribeHandler:^(NSError *error, NSArray *gQoss) { - MQTTSessionManager *strongSelf = weakSelf; - if (!error) { - NSNumber *gQos = gQoss[0]; - [strongSelf.subscriptionLock lock]; - NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; - newEffectiveSubscriptions[topicFilter] = gQos; - strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; - [strongSelf.subscriptionLock unlock]; - } - }]; - } - } - } - self.internalSubscriptions = newSubscriptions; - DDLogVerbose(@"MQTTSessionManager internalSubscriptions: %@", self.internalSubscriptions); -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h deleted file mode 100644 index 52bb7d3..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h +++ /dev/null @@ -1,194 +0,0 @@ -// -// MQTTSessionSynchron.h -// MQTTClient.framework -// - -/** - Synchronous API - - @author Christoph Krey c@ckrey.de - @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. - - */ - - -#import -#import "MQTTSession.h" - -@interface MQTTSession(Synchron) - -/** connects to the specified MQTT server synchronously - - @param timeout defines the maximum time to wait. Defaults to 0 for no timeout. - - @return true if the connection was established - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - @endcode - - */ -- (BOOL)connectAndWaitTimeout:(NSTimeInterval)timeout; - -/** subscribes to a topic at a specific QoS level synchronously - - @param topic the Topic Filter to subscribe to. - - @param qosLevel specifies the QoS Level of the subscription. - qosLevel can be 0, 1, or 2. - @param timeout defines the maximum time to wait - - @return TRUE if successfully subscribed - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - [session subscribeAndWaitToTopic:@"example/#" atLevel:2 timeout:10]; - - @endcode - - */ -- (BOOL)subscribeAndWaitToTopic:(NSString *)topic - atLevel:(MQTTQosLevel)qosLevel - timeout:(NSTimeInterval)timeout; - -/** subscribes a number of topics - - @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and - the corresponding QoS as NSNumber values - @param timeout defines the maximum time to wait - - @return TRUE if the subscribe was succesfull - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - [session subscribeAndWaitToTopics:@{ - @"example/#": @(0), - @"example/status": @(2), - @"other/#": @(1) - } - timeout:10]; - - @endcode - */ -- (BOOL)subscribeAndWaitToTopics:(NSDictionary *)topics - timeout:(NSTimeInterval)timeout; - -/** unsubscribes from a topic synchronously - - @param topic the Topic Filter to unsubscribe from. - @param timeout defines the maximum time to wait - - @return TRUE if sucessfully unsubscribed - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - ... - - [session unsubscribeAndWaitTopic:@"example/#" timeout:10]; - - @endcode - */ -- (BOOL)unsubscribeAndWaitTopic:(NSString *)topic - timeout:(NSTimeInterval)timeout; - -/** unsubscribes from a number of topics synchronously - - @param topics an NSArray of topics to unsubscribe from - @param timeout defines the maximum time to wait - - @return TRUE if the unsubscribe was successful - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - ... - - [session unsubscribeAndWaitTopics:@[ - @"example/#", - @"example/status", - @"other/#" - ] - timeout:10]; - - @endcode - - */ -- (BOOL)unsubscribeAndWaitTopics:(NSArray *)topics - timeout:(NSTimeInterval)timeout; - -/** publishes synchronously data on a given topic at a specified QoS level and retain flag - - @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. - @param topic the Topic to identify the data - @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES - @param qos specifies the Quality of Service for the publish - qos can be 0, 1, or 2. - @param timeout defines the maximum time to wait - @returns TRUE if the publish was successful - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - [session publishAndWaitData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] - topic:@"example/data" - retain:YES - qos:1 - timeout:10]; - @endcode - - */ -- (BOOL)publishAndWaitData:(NSData *)data - onTopic:(NSString *)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - timeout:(NSTimeInterval)timeout; - -/** closes an MQTTSession gracefully synchronously - @param timeout defines the maximum time to wait - - If the connection was successfully established before, a DISCONNECT is sent. - - @code - #import "MQTTClient.h" - - MQTTSession *session = [[MQTTSession alloc] init]; - - [session connectAndWaitTimeout:30]; - - ... - - [session closeAndWait:10]; - - @endcode - - */ -- (void)closeAndWait:(NSTimeInterval)timeout; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m deleted file mode 100644 index ed355c6..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m +++ /dev/null @@ -1,192 +0,0 @@ -// -// MQTTSessionSynchron.m -// MQTTClient.framework -// -// Copyright © 2013-2017, Christoph Krey. All rights reserved. -// - -/** - Synchronous API - - @author Christoph Krey c@ckrey.de - @see http://mqtt.org - */ - -#import "MQTTSession.h" -#import "MQTTSessionLegacy.h" -#import "MQTTSessionSynchron.h" - -#import "MQTTLog.h" - -@interface MQTTSession() -@property (nonatomic) BOOL synchronPub; -@property (nonatomic) UInt16 synchronPubMid; -@property (nonatomic) BOOL synchronUnsub; -@property (nonatomic) UInt16 synchronUnsubMid; -@property (nonatomic) BOOL synchronSub; -@property (nonatomic) UInt16 synchronSubMid; -@property (nonatomic) BOOL synchronConnect; -@property (nonatomic) BOOL synchronDisconnect; - -@end - -@implementation MQTTSession(Synchron) - -/** Synchron connect - * - */ -- (BOOL)connectAndWaitTimeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - self.synchronConnect = TRUE; - - [self connect]; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronConnect && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for connect"); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end connect"); - - return (self.status == MQTTSessionStatusConnected); -} - -- (BOOL)subscribeAndWaitToTopic:(NSString *)topic atLevel:(MQTTQosLevel)qosLevel timeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - self.synchronSub = TRUE; - UInt16 mid = [self subscribeToTopic:topic atLevel:qosLevel]; - self.synchronSubMid = mid; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronSub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for suback %d", mid); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end subscribe"); - - if (self.synchronSub || self.synchronSubMid != mid) { - return FALSE; - } else { - return TRUE; - } -} - -- (BOOL)subscribeAndWaitToTopics:(NSDictionary *)topics timeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - self.synchronSub = TRUE; - UInt16 mid = [self subscribeToTopics:topics]; - self.synchronSubMid = mid; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronSub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for suback %d", mid); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end subscribe"); - - if (self.synchronSub || self.synchronSubMid != mid) { - return FALSE; - } else { - return TRUE; - } -} - -- (BOOL)unsubscribeAndWaitTopic:(NSString *)theTopic timeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - - self.synchronUnsub = TRUE; - UInt16 mid = [self unsubscribeTopic:theTopic]; - self.synchronUnsubMid = mid; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronUnsub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for unsuback %d", mid); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end unsubscribe"); - - if (self.synchronUnsub || self.synchronUnsubMid != mid) { - return FALSE; - } else { - return TRUE; - } -} - -- (BOOL)unsubscribeAndWaitTopics:(NSArray *)topics timeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - self.synchronUnsub = TRUE; - UInt16 mid = [self unsubscribeTopics:topics]; - self.synchronUnsubMid = mid; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronUnsub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for unsuback %d", mid); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end unsubscribe"); - - if (self.synchronUnsub || self.synchronUnsubMid != mid) { - return FALSE; - } else { - return TRUE; - } -} - -- (BOOL)publishAndWaitData:(NSData*)data - onTopic:(NSString*)topic - retain:(BOOL)retainFlag - qos:(MQTTQosLevel)qos - timeout:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - - if (qos != MQTTQosLevelAtMostOnce) { - self.synchronPub = TRUE; - } - - UInt16 mid = self.synchronPubMid = [self publishData:data onTopic:topic retain:retainFlag qos:qos]; - if (qos == MQTTQosLevelAtMostOnce) { - return TRUE; - } else { - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronPub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for mid %d", mid); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - - DDLogVerbose(@"[MQTTSessionSynchron] end publish"); - - if (self.synchronPub || self.synchronPubMid != mid) { - return FALSE; - } else { - return TRUE; - } - } -} - -- (void)closeAndWait:(NSTimeInterval)timeout { - NSDate *started = [NSDate date]; - self.synchronDisconnect = TRUE; - [self closeWithDisconnectHandler:nil]; - - [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; - - while (self.synchronDisconnect && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { - DDLogVerbose(@"[MQTTSessionSynchron] waiting for close"); - [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; - } - DDLogVerbose(@"[MQTTSessionSynchron] end close"); -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h deleted file mode 100644 index 88349ad..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// MQTTStrict.h -// MQTTClient -// -// Created by Christoph Krey on 24.07.17. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import - -/** MQTTStrict controls the behaviour of MQTTClient with regards to parameter checking - * If strict is true, all parameters passed by the caller are checked before - * the corresponding message is send (CONNECT, PUBLISH, SUBSCRIBE, UNSUBSCRIBE) - * and an exception is thrown if any invalid values or inconsistencies are detected - * - * If strict is false, parameters are used as passed by the caller. - * Messages will be sent "incorrectly" and - * parameter checking will be done on the broker end. - * - */ -@interface MQTTStrict : NSObject - -/** strict returns the current strict flag - * @return the strict flag - */ -+ (BOOL)strict; - -/** setString sets the global strict flag - * @param strict the new strict flag - */ -+ (void)setStrict:(BOOL)strict; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m deleted file mode 100644 index 810f85d..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m +++ /dev/null @@ -1,22 +0,0 @@ -// -// MQTTStrict.m -// MQTTClient -// -// Created by Christoph Krey on 24.07.17. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import "MQTTStrict.h" - -@implementation MQTTStrict -static BOOL internalStrict = false; - -+ (BOOL)strict { - return internalStrict; -} - -+ (void)setStrict:(BOOL)strict { - internalStrict = strict; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h deleted file mode 100644 index d7ab0b4..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h +++ /dev/null @@ -1,114 +0,0 @@ -// -// MQTTTransport.h -// MQTTClient -// -// Created by Christoph Krey on 06.12.15. -// Copyright © 2015-2017 Christoph Krey. All rights reserved. -// - -#import - -@protocol MQTTTransportDelegate; - -/** MQTTTransport is a protocol abstracting the underlying transport level for MQTTClient - * - */ -@protocol MQTTTransport - -/** MQTTTransport state defines the possible state of an abstract transport - * - */ - typedef NS_ENUM(NSInteger, MQTTTransportState) { - - /** MQTTTransportCreated indicates an initialized transport */ - MQTTTransportCreated = 0, - - /** MQTTTransportOpening indicates a transport in the process of opening a connection */ - MQTTTransportOpening, - - /** MQTTTransportCreated indicates a transport opened ready for communication */ - MQTTTransportOpen, - - /** MQTTTransportCreated indicates a transport in the process of closing */ - MQTTTransportClosing, - - /** MQTTTransportCreated indicates a closed transport */ - MQTTTransportClosed - }; - -/** queue The queue where the streams are scheduled. */ -@property (strong, nonatomic, nonnull) dispatch_queue_t queue; - -/** streamSSLLevel an NSString containing the security level for read and write streams - * For list of possible values see: - * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants - * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list - * and cannot be used as constant, but you can use it as a string value - * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL - */ -@property (strong, nonatomic, nonnull) NSString *streamSSLLevel; - -/** host an NSString containing the hostName or IP address of the host to connect to */ -@property (strong, nonatomic, nonnull) NSString *host; - -/** port an unsigned 32 bit integer containing the IP port number to connect to */ -@property (nonatomic) UInt32 port; - -/** MQTTTransportDelegate needs to be set to a class implementing th MQTTTransportDelegate protocol - * to receive delegate messages. - */ -@property (weak, nonatomic) _Nullable id delegate; - -/** state contains the current MQTTTransportState of the transport */ -@property (nonatomic) MQTTTransportState state; - -/** open opens the transport and prepares it for communication - * actual transports may require additional parameters to be set before opening - */ -- (void)open; - -/** send transmits a data message - * @param data data to be send, might be zero length - * @result a boolean indicating if the data could be send or not - */ -- (BOOL)send:(nonnull NSData *)data; - -/** close closes the transport */ -- (void)close; - -@end - -/** MQTTTransportDelegate protocol - * Note: the implementation of the didReceiveMessage method is mandatory, the others are optional - */ -@protocol MQTTTransportDelegate - -/** didReceiveMessage gets called when a message was received - * @param mqttTransport the transport on which the message was received - * @param message the data received which may be zero length - */ - - (void)mqttTransport:(nonnull id)mqttTransport didReceiveMessage:(nonnull NSData *)message; - -@optional - -/** mqttTransportDidOpen gets called when a transport is successfully opened - * @param mqttTransport the transport which was successfully opened - */ -- (void)mqttTransportDidOpen:(_Nonnull id)mqttTransport; - -/** didFailWithError gets called when an error was detected on the transport - * @param mqttTransport the transport which detected the error - * @param error available error information, might be nil - */ -- (void)mqttTransport:(_Nonnull id)mqttTransport didFailWithError:(nullable NSError *)error; - -/** mqttTransportDidClose gets called when the transport closed - * @param mqttTransport the transport which was closed - */ -- (void)mqttTransportDidClose:(_Nonnull id)mqttTransport; - -@end - -@interface MQTTTransport : NSObject -@end - diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m deleted file mode 100644 index d372e02..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m +++ /dev/null @@ -1,40 +0,0 @@ -// -// MQTTTransport.m -// MQTTClient -// -// Created by Christoph Krey on 05.01.16. -// Copyright © 2016-2017 Christoph Krey. All rights reserved. -// - -#import "MQTTTransport.h" - -#import "MQTTLog.h" - -@implementation MQTTTransport -@synthesize state; -@synthesize queue; -@synthesize streamSSLLevel; -@synthesize delegate; -@synthesize host; -@synthesize port; - -- (instancetype)init { - self = [super init]; - self.state = MQTTTransportCreated; - return self; -} - -- (void)open { - DDLogError(@"MQTTTransport is abstract class"); -} - -- (void)close { - DDLogError(@"MQTTTransport is abstract class"); -} - -- (BOOL)send:(NSData *)data { - DDLogError(@"MQTTTransport is abstract class"); - return FALSE; -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h deleted file mode 100644 index 00b4302..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h +++ /dev/null @@ -1,21 +0,0 @@ -// -// ReconnectTimer.h -// MQTTClient -// -// Created by Josip Cavar on 22/08/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import - -@interface ReconnectTimer : NSObject - -- (instancetype)initWithRetryInterval:(NSTimeInterval)retryInterval - maxRetryInterval:(NSTimeInterval)maxRetryInterval - queue:(dispatch_queue_t)queue - reconnectBlock:(void (^)(void))block; -- (void)schedule; -- (void)stop; -- (void)resetRetryInterval; - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m b/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m deleted file mode 100644 index adf509f..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m +++ /dev/null @@ -1,67 +0,0 @@ -// -// ReconnectTimer.m -// MQTTClient -// -// Created by Josip Cavar on 22/08/2017. -// Copyright © 2017 Christoph Krey. All rights reserved. -// - -#import "ReconnectTimer.h" -#import "GCDTimer.h" - -@interface ReconnectTimer() - -@property (strong, nonatomic) GCDTimer *timer; -@property (assign, nonatomic) NSTimeInterval retryInterval; -@property (assign, nonatomic) NSTimeInterval currentRetryInterval; -@property (assign, nonatomic) NSTimeInterval maxRetryInterval; -@property (strong, nonatomic) dispatch_queue_t queue; -@property (copy, nonatomic) void (^reconnectBlock)(void); - -@end - -@implementation ReconnectTimer - -- (instancetype)initWithRetryInterval:(NSTimeInterval)retryInterval - maxRetryInterval:(NSTimeInterval)maxRetryInterval - queue:(dispatch_queue_t)queue - reconnectBlock:(void (^)(void))block { - self = [super init]; - if (self) { - self.retryInterval = retryInterval; - self.currentRetryInterval = retryInterval; - self.maxRetryInterval = maxRetryInterval; - self.reconnectBlock = block; - self.queue = queue; - } - return self; -} - -- (void)schedule { - __weak typeof(self) weakSelf = self; - self.timer = [GCDTimer scheduledTimerWithTimeInterval:self.currentRetryInterval - repeats:NO - queue:self.queue - block:^{ - [weakSelf reconnect]; - }]; -} - -- (void)stop { - [self.timer invalidate]; - self.timer = nil; -} - -- (void)resetRetryInterval { - self.currentRetryInterval = self.retryInterval; -} - -- (void)reconnect { - [self stop]; - if (self.currentRetryInterval < self.maxRetryInterval) { - self.currentRetryInterval *= 2; - } - self.reconnectBlock(); -} - -@end diff --git a/ios/RCTMqtt/Pods/MQTTClient/README.md b/ios/RCTMqtt/Pods/MQTTClient/README.md deleted file mode 100644 index 5c3ad4e..0000000 --- a/ios/RCTMqtt/Pods/MQTTClient/README.md +++ /dev/null @@ -1,153 +0,0 @@ -# MQTT-Client-Framework - -[![Build Status](https://travis-ci.org/novastone-media/MQTT-Client-Framework.svg?branch=master)](https://travis-ci.org/novastone-media/MQTT-Client-Framework) -[![codecov](https://codecov.io/gh/novastone-media/MQTT-Client-Framework/branch/master/graph/badge.svg)](https://codecov.io/gh/novastone-media/MQTT-Client-Framework) -[![CocoaPods Version](https://img.shields.io/cocoapods/v/MQTTClient.svg)](https://img.shields.io/cocoapods/v/MQTTClient.svg) -[![Platform](https://img.shields.io/cocoapods/p/MQTTClient.svg?style=flat)](https://img.shields.io/cocoapods/p/MQTTClient.svg?style=flat) - -**Welcome to MQTT-Client-Framework** - -MQTT-Client-Framework is a native Objective-C iOS library. It uses `CFNetwork` for networking and `CoreData` for persistence. It is a complete implementation of MQTT 3.1.1 and supports TLS. - -You can read [introduction](http://www.hivemq.com/blog/mqtt-client-library-encyclopedia-mqtt-client-framework) to learn more about framework. - -MQTT-Client-Framework is tested with a long list of brokers: - -* mosquitto -* paho -* rabbitmq -* hivemq -* rsmb -* mosca -* vernemq -* emqtt -* moquette -* ActiveMQ -* Apollo -* CloudMQTT -* aws -* hbmqtt (MQTTv311 only, limitations) -* [aedes](https://github.com/mcollina/aedes) -* [flespi](https://flespi.com/mqtt-broker) - -## Usage - -Create a new client and connect to a broker: - -```objective-c -#import "MQTTClient.h" - -MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init]; -transport.host = @"test.mosquitto.org"; -transport.port = 1883; - -MQTTSession *session = [[MQTTSession alloc] init]; -session.transport = transport; -[session connectWithConnectHandler:^(NSError *error) { - // Do some work -}]; -``` - -Subscribe to a topic: - -```objective-c -[session subscribeToTopic:@"example/#" atLevel:MQTTQosLevelExactlyOnce subscribeHandler:^(NSError *error, NSArray *gQoss) { - if (error) { - NSLog(@"Subscription failed %@", error.localizedDescription); - } else { - NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); - } - }]; - -``` - -In your `MQTTSession` delegate, add the following to receive messages for the subscribed topics: - -```objective-c -- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid { - // New message received in topic -} -``` - -Publish a message to a topic: - -```objective-c -[session publishData:someData onTopic:@"example/#" retain:NO qos:MQTTQosLevelAtMostOnce publishHandler:^(NSError *error) { -}]; -``` - -If you already have a self signed URL from broker like AWS IoT endpoint, use the `url` property of `MQTTWebsocketTransport`: -```objective-c -MQTTWebsocketTransport *transport = [[MQTTWebsocketTransport alloc] init]; -transport.url = @"wss://aws.iot-amazonaws.com/mqtt?expiry='2018-05-01T23:12:32.950Z'" - -MQTTSession *session = [[MQTTSession alloc] init]; -session.transport = transport; -[session connectWithConnectHandler:^(NSError *error) { - // Do some work -}]; -``` - -## Installation - -### CocoaPods - -Add this to your Podfile: - -``` -pod 'MQTTClient' -``` -which is a short for: - -``` -pod 'MQTTClient/Min' -pod 'MQTTClient/Manager' -``` - -The Manager subspec includes the `MQTTSessionManager` class. - -If you want to use MQTT over Websockets: - -``` -pod 'MQTTClient/Websocket' -``` - -If you want to do your logging with CocoaLumberjack (recommended): - -``` -pod 'MQTTClient/MinL' -pod 'MQTTClient/ManagerL' -pod 'MQTTClient/WebsocketL' -``` - -### Carthage - -In your Cartfile: - -``` -github "novastone-media/MQTT-Client-Framework" -``` - -### Manually - -#### Git submodule - -1. Add MQTT-Client-Framework as a git submodule into your top-level project directory or simply copy whole folder -2. Find MQTTClient.xcodeproj and drag it into the file navigator of your app project. -3. In Xcode, navigate to the target configuration window by clicking on the blue project icon, and selecting the application target under the "Targets" heading in the sidebar. -4. Under "General" panel go to "Linked Frameworks and Libraries" and add MQTTClient.framework - -#### Framework - -1. Download MQTT-Client-Framework -2. Build it and you should find MQTTClient.framework under "Products" group. -3. Right click on it and select "Show in Finder" option. -4. Just drag and drop MQTTClient.framework to your project - -## Security Disclosure - -If you believe you have identified a security vulnerability with MQTT-Client-Framework, please report it to ios@novastonemedia.com and do not post it to a public issue tracker. - -## Thanks - -This project was originally written by [Christoph Krey](https://github.com/ckrey). diff --git a/ios/RCTMqtt/Pods/Manifest.lock b/ios/RCTMqtt/Pods/Manifest.lock deleted file mode 100644 index 5be5182..0000000 --- a/ios/RCTMqtt/Pods/Manifest.lock +++ /dev/null @@ -1,23 +0,0 @@ -PODS: - - MQTTClient (0.15.2): - - MQTTClient/Core (= 0.15.2) - - MQTTClient/Core (0.15.2): - - MQTTClient/Manager - - MQTTClient/Min - - MQTTClient/Manager (0.15.2): - - MQTTClient/Min - - MQTTClient/Min (0.15.2) - -DEPENDENCIES: - - MQTTClient - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - MQTTClient - -SPEC CHECKSUMS: - MQTTClient: 902c7bcac1501595f3d0b15178c7205b40331fb0 - -PODFILE CHECKSUM: e61f0901f7eb0b464089f1f9f5d404df37195e34 - -COCOAPODS: 1.5.3 diff --git a/ios/RCTMqtt/Pods/Pods.xcodeproj/project.pbxproj b/ios/RCTMqtt/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 3487900..0000000 --- a/ios/RCTMqtt/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,696 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0DA95B589FD02D53E571AAFE0007D8EE /* ForegroundReconnection.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EDD6DBFEAB36620EF7FC56C062B994E /* ForegroundReconnection.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 10C6F2CB802BEC1EFFFE380FE1EFA38F /* MQTTSSLSecurityPolicyEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = ED6ACA614ADD98F1063B32BEE06E89AE /* MQTTSSLSecurityPolicyEncoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 18F4A977DD2F9C3D574A6C0895D93604 /* MQTTSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BA5185485FAFC37583A285624D1C0A5 /* MQTTSession.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1E1FAFE83EEDCECB8036802F45F0DB7F /* MQTTCoreDataPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = EC1CCBAAB2ACC7454ABF99859E68F45E /* MQTTCoreDataPersistence.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 200A350965FD41171B2A649334392258 /* MQTTStrict.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C9E1CDE3471B1EA6962C61CD9C5E840 /* MQTTStrict.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 22BA0165527297805067BB3F9F586EFD /* MQTTStrict.h in Headers */ = {isa = PBXBuildFile; fileRef = 1154EBF0E4B58A1ED21B8A0F1E7C54AC /* MQTTStrict.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3027AC08FD082AF0DC4EDC212AB06BD5 /* MQTTMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C9A4F4071EA25C3CCCE95039ED67BD9 /* MQTTMessage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 39DCB4C31884D742EFC584CC8A137338 /* MQTTTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E2D069AAF32B58B03CB0CA63337B2F9 /* MQTTTransport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 3A6EA94C4D584837804C1CA29307407B /* MQTTSSLSecurityPolicyTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = DAE1A44DD7B7B9636F5099FA74E1D28E /* MQTTSSLSecurityPolicyTransport.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 3D02E989AD313414561F98E78A2514AF /* MQTTDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 394F19498B0F147AE2A56BEA9375A9B6 /* MQTTDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 420AD0C3B49CE6F2BC27EF4758D37562 /* MQTTCFSocketEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = CE5BCAEBE07FF56C21DB8AFC3784BEEA /* MQTTCFSocketEncoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 434057E0CC10695BF704D480B1EC14B5 /* GCDTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 3CB4E08291BA715BDC2DD0C40CCF8D11 /* GCDTimer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 467F3A6C751D9CA43A3FB06838FAF2A0 /* MQTTProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = ECD987B5BFAB7B577A7357C1C6F87E40 /* MQTTProperties.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4F971C382D5BECBED224D0B889E6C7A8 /* MQTTCFSocketDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 830AB91F42FEE4FE049F39989DCF7755 /* MQTTCFSocketDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 53A2B2DEFC3E35AE6F3AFC9961238330 /* MQTTInMemoryPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = E717D095B76828579E2F24F47F865E8A /* MQTTInMemoryPersistence.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5551EECE9193A2C08D4ECA9A5059AA26 /* MQTTTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E1F3D87BFA6EC3273B6A7CFD643307 /* MQTTTransport.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 5958B4024E29300E908FFC4773E4F061 /* MQTTCFSocketTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = 85936E35BAEDEA0A7773733F3730E728 /* MQTTCFSocketTransport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5AF57ED8730589B1A90BBFD89AF32905 /* MQTTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = EC88550DD642743E7D062050125411AE /* MQTTLog.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5FC0536C577C0E03219E01FFE85D1195 /* MQTTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = DCFB583828B0DFF9DFF2523E68E3FE8E /* MQTTLog.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 603F295CC4AEFFFC385066F746AF7AE5 /* MQTTPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2A90588C46EC19F052503A4449ED61 /* MQTTPersistence.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 655C4A694C051D11A270CB11E63C3A33 /* MQTTSSLSecurityPolicyTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EBECAAB12F819D8EAEB40099878D746 /* MQTTSSLSecurityPolicyTransport.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 693DD5CBD5FA132FC5543558933600E1 /* MQTTSSLSecurityPolicyDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E349A74ADB8113AE90F1132E35A3767C /* MQTTSSLSecurityPolicyDecoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7AB0950A954C7E195108E7F7EB69F219 /* GCDTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6268731C050562F46B5C42FC087FF98F /* GCDTimer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7B405601E3898B09A5D135A4A6DBFFED /* MQTTSessionSynchron.h in Headers */ = {isa = PBXBuildFile; fileRef = 37E50DDDDD9EDC40A1DA17A1DC5F5018 /* MQTTSessionSynchron.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7B6080D9EE090C02031A5A7EAA6C7B61 /* MQTTSession.h in Headers */ = {isa = PBXBuildFile; fileRef = CBD95B416495C6006E87B5EA4BB4F660 /* MQTTSession.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 7D67F1EE84F26F057D84F4A1D7DF83CD /* MQTTSSLSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 73B4623E4586A1EBCDFD04BCDBCBF313 /* MQTTSSLSecurityPolicy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 89F766BCA57B976FF8A9D8C8845AAE83 /* MQTTCFSocketTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = 8089264233D9806D1265817B67FB795B /* MQTTCFSocketTransport.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 8B4D6C5E5D69DD62EBA454BFA600164A /* MQTTProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 23D252F94B0DDAFA51BD40CF5766DFE8 /* MQTTProperties.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9201C63EA48CBBD270A9C47DB17A1B3F /* MQTTInMemoryPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 73A2381D3BC7DCA24983CF728297697A /* MQTTInMemoryPersistence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 922F833BC09F5C0B50123E0605650E63 /* MQTTSSLSecurityPolicyDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B7D12DA34DE33846716B8CAD485578C8 /* MQTTSSLSecurityPolicyDecoder.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 94054AD0E9926F07A4416B507C885E16 /* ReconnectTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 02D434F6EE1529869407E85F23AF7F3A /* ReconnectTimer.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9702684FB865484D3E4F7DF4CD9438D1 /* MQTTClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 10B1039DC86FE1EFFC896E8862C103F2 /* MQTTClient.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9830939743B99D4EFEF82CF9A6FDA20F /* MQTTCFSocketEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = BB952639D5D02A0986DA57915330A95C /* MQTTCFSocketEncoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 9AFAD4DF9B124F694DCB807E35D57EF4 /* MQTTSessionLegacy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE8F400DCE0F6D8C13F7257B31E48CD9 /* MQTTSessionLegacy.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - A273E1D74D5433257CF6D576A9695C70 /* ReconnectTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E5009BBCCABC04758994CC237E1EBEC /* ReconnectTimer.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AA6FFA82800A6363AC43B071183C16A8 /* MQTTCFSocketDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B78C99BDF39C8CDA81DE09DC2B270008 /* MQTTCFSocketDecoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - AEA8CBF0ABE460132ACA3BD6F54B0A7B /* MQTTSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 668304767497366832F63A530E358881 /* MQTTSessionManager.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - AF45604A1088FE2D6405D09399FC7A9F /* MQTTSSLSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 0713751E0F854F054479F9B232F350B5 /* MQTTSSLSecurityPolicy.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B590E4A124AC46F9784E11061F6D5A8B /* MQTTSSLSecurityPolicyEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8363FCBFF6BC7F122EE3ED1781B78ADF /* MQTTSSLSecurityPolicyEncoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B6EC3A8F3AEC022F0ED6DB55B6DEF1B9 /* ForegroundReconnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 67D1575A657818179185DE44E5E0D1E1 /* ForegroundReconnection.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B8A92F725799BB7143906E029382F330 /* Pods-RCTMqtt-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 07C7D2091EA8E9E36FCD056281D0D671 /* Pods-RCTMqtt-dummy.m */; }; - CAF35C26D7AE65617983AD8A681951A3 /* MQTTCoreDataPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 824B26077856B9434AF2AA0945B78230 /* MQTTCoreDataPersistence.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D0AA8766372321EB4ABF8A5DD0F22BBC /* MQTTSessionLegacy.h in Headers */ = {isa = PBXBuildFile; fileRef = 24B821D06A2D71CE7D557C87D8D7E4AC /* MQTTSessionLegacy.h */; settings = {ATTRIBUTES = (Project, ); }; }; - E4A9FDF9DD50B12ECB8014FFA400F8E2 /* MQTTClient-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D42D4127DCE5C8C431351BE380FB56E3 /* MQTTClient-dummy.m */; }; - EBB269003744775E0E30D87272B084D8 /* MQTTMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = A2C9B541FDDAB9EF6A721303B50E82CE /* MQTTMessage.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - EE61CBA5FDC88943C8C43895790657B1 /* MQTTSessionSynchron.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BAA655F8C8796DDFFA4BF941A85C0C6 /* MQTTSessionSynchron.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - F5C8BC87101A27CCD3D17F423FD1D65A /* MQTTDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C4FBFC5A8F2AC4E0BA4E10A25C861DA /* MQTTDecoder.h */; settings = {ATTRIBUTES = (Project, ); }; }; - F8C124C0049CCDE7AE186F31DC302357 /* MQTTSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = AD92220BB569CC8B5B899D693EA9F2E4 /* MQTTSessionManager.h */; settings = {ATTRIBUTES = (Project, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - B8136350CECD69D6E48F3FF7FD88894E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = B8F78F3B11FDACA05E24886B367C185F; - remoteInfo = MQTTClient; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 02D434F6EE1529869407E85F23AF7F3A /* ReconnectTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ReconnectTimer.h; path = MQTTClient/MQTTClient/ReconnectTimer.h; sourceTree = ""; }; - 0713751E0F854F054479F9B232F350B5 /* MQTTSSLSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicy.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h; sourceTree = ""; }; - 07C7D2091EA8E9E36FCD056281D0D671 /* Pods-RCTMqtt-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-RCTMqtt-dummy.m"; sourceTree = ""; }; - 10B1039DC86FE1EFFC896E8862C103F2 /* MQTTClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTClient.h; path = MQTTClient/MQTTClient/MQTTClient.h; sourceTree = ""; }; - 1154EBF0E4B58A1ED21B8A0F1E7C54AC /* MQTTStrict.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTStrict.h; path = MQTTClient/MQTTClient/MQTTStrict.h; sourceTree = ""; }; - 1E2D069AAF32B58B03CB0CA63337B2F9 /* MQTTTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTTransport.m; path = MQTTClient/MQTTClient/MQTTTransport.m; sourceTree = ""; }; - 23D252F94B0DDAFA51BD40CF5766DFE8 /* MQTTProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTProperties.h; path = MQTTClient/MQTTClient/MQTTProperties.h; sourceTree = ""; }; - 24B821D06A2D71CE7D557C87D8D7E4AC /* MQTTSessionLegacy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionLegacy.h; path = MQTTClient/MQTTClient/MQTTSessionLegacy.h; sourceTree = ""; }; - 2BAA655F8C8796DDFFA4BF941A85C0C6 /* MQTTSessionSynchron.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionSynchron.m; path = MQTTClient/MQTTClient/MQTTSessionSynchron.m; sourceTree = ""; }; - 2EDD6DBFEAB36620EF7FC56C062B994E /* ForegroundReconnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ForegroundReconnection.m; path = MQTTClient/MQTTClient/ForegroundReconnection.m; sourceTree = ""; }; - 37E50DDDDD9EDC40A1DA17A1DC5F5018 /* MQTTSessionSynchron.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionSynchron.h; path = MQTTClient/MQTTClient/MQTTSessionSynchron.h; sourceTree = ""; }; - 394F19498B0F147AE2A56BEA9375A9B6 /* MQTTDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTDecoder.m; path = MQTTClient/MQTTClient/MQTTDecoder.m; sourceTree = ""; }; - 3C4FBFC5A8F2AC4E0BA4E10A25C861DA /* MQTTDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTDecoder.h; path = MQTTClient/MQTTClient/MQTTDecoder.h; sourceTree = ""; }; - 3CB4E08291BA715BDC2DD0C40CCF8D11 /* GCDTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDTimer.h; path = MQTTClient/MQTTClient/GCDTimer.h; sourceTree = ""; }; - 5EBECAAB12F819D8EAEB40099878D746 /* MQTTSSLSecurityPolicyTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyTransport.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m; sourceTree = ""; }; - 6268731C050562F46B5C42FC087FF98F /* GCDTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDTimer.m; path = MQTTClient/MQTTClient/GCDTimer.m; sourceTree = ""; }; - 62712E6757C9F4F352686E2EB0F7DE36 /* MQTTClient-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MQTTClient-prefix.pch"; sourceTree = ""; }; - 637B8EEC3DAA9500EE63E9B743B00D13 /* Pods-RCTMqtt.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RCTMqtt.release.xcconfig"; sourceTree = ""; }; - 64AA53858E342061D9D0458B06A86954 /* Pods-RCTMqtt.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-RCTMqtt.debug.xcconfig"; sourceTree = ""; }; - 668304767497366832F63A530E358881 /* MQTTSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionManager.m; path = MQTTClient/MQTTClient/MQTTSessionManager.m; sourceTree = ""; }; - 67D1575A657818179185DE44E5E0D1E1 /* ForegroundReconnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ForegroundReconnection.h; path = MQTTClient/MQTTClient/ForegroundReconnection.h; sourceTree = ""; }; - 68B085AA83EF69CC4252D85002E906DA /* Pods-RCTMqtt-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-RCTMqtt-resources.sh"; sourceTree = ""; }; - 73A2381D3BC7DCA24983CF728297697A /* MQTTInMemoryPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTInMemoryPersistence.m; path = MQTTClient/MQTTClient/MQTTInMemoryPersistence.m; sourceTree = ""; }; - 73B4623E4586A1EBCDFD04BCDBCBF313 /* MQTTSSLSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicy.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m; sourceTree = ""; }; - 77C1EC246B4DA662502ABC908E6A2AC0 /* libPods-RCTMqtt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-RCTMqtt.a"; path = "libPods-RCTMqtt.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 77E1F3D87BFA6EC3273B6A7CFD643307 /* MQTTTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTTransport.h; path = MQTTClient/MQTTClient/MQTTTransport.h; sourceTree = ""; }; - 7BA5185485FAFC37583A285624D1C0A5 /* MQTTSession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSession.m; path = MQTTClient/MQTTClient/MQTTSession.m; sourceTree = ""; }; - 7E5009BBCCABC04758994CC237E1EBEC /* ReconnectTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ReconnectTimer.m; path = MQTTClient/MQTTClient/ReconnectTimer.m; sourceTree = ""; }; - 8089264233D9806D1265817B67FB795B /* MQTTCFSocketTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketTransport.h; path = MQTTClient/MQTTClient/MQTTCFSocketTransport.h; sourceTree = ""; }; - 80EDB93D5D0D8636182AA1FEBF96F836 /* Pods-RCTMqtt-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-RCTMqtt-acknowledgements.markdown"; sourceTree = ""; }; - 824B26077856B9434AF2AA0945B78230 /* MQTTCoreDataPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCoreDataPersistence.m; path = MQTTClient/MQTTClient/MQTTCoreDataPersistence.m; sourceTree = ""; }; - 830AB91F42FEE4FE049F39989DCF7755 /* MQTTCFSocketDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketDecoder.m; path = MQTTClient/MQTTClient/MQTTCFSocketDecoder.m; sourceTree = ""; }; - 8363FCBFF6BC7F122EE3ED1781B78ADF /* MQTTSSLSecurityPolicyEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyEncoder.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h; sourceTree = ""; }; - 85936E35BAEDEA0A7773733F3730E728 /* MQTTCFSocketTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketTransport.m; path = MQTTClient/MQTTClient/MQTTCFSocketTransport.m; sourceTree = ""; }; - 8C9E1CDE3471B1EA6962C61CD9C5E840 /* MQTTStrict.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTStrict.m; path = MQTTClient/MQTTClient/MQTTStrict.m; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 94947EDA047BAA20E672AF4F37ABAF41 /* MQTTClient.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MQTTClient.xcconfig; sourceTree = ""; }; - 9C9A4F4071EA25C3CCCE95039ED67BD9 /* MQTTMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTMessage.h; path = MQTTClient/MQTTClient/MQTTMessage.h; sourceTree = ""; }; - A2C9B541FDDAB9EF6A721303B50E82CE /* MQTTMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTMessage.m; path = MQTTClient/MQTTClient/MQTTMessage.m; sourceTree = ""; }; - AD92220BB569CC8B5B899D693EA9F2E4 /* MQTTSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionManager.h; path = MQTTClient/MQTTClient/MQTTSessionManager.h; sourceTree = ""; }; - B78C99BDF39C8CDA81DE09DC2B270008 /* MQTTCFSocketDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketDecoder.h; path = MQTTClient/MQTTClient/MQTTCFSocketDecoder.h; sourceTree = ""; }; - B7D12DA34DE33846716B8CAD485578C8 /* MQTTSSLSecurityPolicyDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyDecoder.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m; sourceTree = ""; }; - BB952639D5D02A0986DA57915330A95C /* MQTTCFSocketEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketEncoder.h; path = MQTTClient/MQTTClient/MQTTCFSocketEncoder.h; sourceTree = ""; }; - BCA05712A40C75F5A971BAA26F49CA48 /* libMQTTClient.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libMQTTClient.a; path = libMQTTClient.a; sourceTree = BUILT_PRODUCTS_DIR; }; - BD2A90588C46EC19F052503A4449ED61 /* MQTTPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTPersistence.h; path = MQTTClient/MQTTClient/MQTTPersistence.h; sourceTree = ""; }; - BE8F400DCE0F6D8C13F7257B31E48CD9 /* MQTTSessionLegacy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionLegacy.m; path = MQTTClient/MQTTClient/MQTTSessionLegacy.m; sourceTree = ""; }; - C595DE082166559009E4B2367D8AEA8D /* Pods-RCTMqtt-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-RCTMqtt-acknowledgements.plist"; sourceTree = ""; }; - CBD95B416495C6006E87B5EA4BB4F660 /* MQTTSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSession.h; path = MQTTClient/MQTTClient/MQTTSession.h; sourceTree = ""; }; - CE5BCAEBE07FF56C21DB8AFC3784BEEA /* MQTTCFSocketEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketEncoder.m; path = MQTTClient/MQTTClient/MQTTCFSocketEncoder.m; sourceTree = ""; }; - D42D4127DCE5C8C431351BE380FB56E3 /* MQTTClient-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MQTTClient-dummy.m"; sourceTree = ""; }; - DAE1A44DD7B7B9636F5099FA74E1D28E /* MQTTSSLSecurityPolicyTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyTransport.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h; sourceTree = ""; }; - DCFB583828B0DFF9DFF2523E68E3FE8E /* MQTTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTLog.h; path = MQTTClient/MQTTClient/MQTTLog.h; sourceTree = ""; }; - E349A74ADB8113AE90F1132E35A3767C /* MQTTSSLSecurityPolicyDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyDecoder.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h; sourceTree = ""; }; - E717D095B76828579E2F24F47F865E8A /* MQTTInMemoryPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTInMemoryPersistence.h; path = MQTTClient/MQTTClient/MQTTInMemoryPersistence.h; sourceTree = ""; }; - EC1CCBAAB2ACC7454ABF99859E68F45E /* MQTTCoreDataPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCoreDataPersistence.h; path = MQTTClient/MQTTClient/MQTTCoreDataPersistence.h; sourceTree = ""; }; - EC88550DD642743E7D062050125411AE /* MQTTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTLog.m; path = MQTTClient/MQTTClient/MQTTLog.m; sourceTree = ""; }; - ECD987B5BFAB7B577A7357C1C6F87E40 /* MQTTProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTProperties.m; path = MQTTClient/MQTTClient/MQTTProperties.m; sourceTree = ""; }; - ED6ACA614ADD98F1063B32BEE06E89AE /* MQTTSSLSecurityPolicyEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyEncoder.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 13DF2F2930CB8DA61571F42E58510362 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - CD53E2EDDCDC41654F9A97FB956F9144 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0F8D2E47FE03D3B91B51069F7C273AF4 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - 329A84E763AAA3CE9B53CA4941691647 /* Pods */ = { - isa = PBXGroup; - children = ( - E92ABFDC6DA66E923C7A21B1145750C7 /* MQTTClient */, - ); - name = Pods; - sourceTree = ""; - }; - 3BC49147AACB9AA067DCD757CF01B017 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 86420754682E1557BDFAC234CB957DCB /* Pods-RCTMqtt */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 55E955C0A45DB8321D3EE10E46CA6EC5 /* Manager */ = { - isa = PBXGroup; - children = ( - 67D1575A657818179185DE44E5E0D1E1 /* ForegroundReconnection.h */, - 2EDD6DBFEAB36620EF7FC56C062B994E /* ForegroundReconnection.m */, - AD92220BB569CC8B5B899D693EA9F2E4 /* MQTTSessionManager.h */, - 668304767497366832F63A530E358881 /* MQTTSessionManager.m */, - 02D434F6EE1529869407E85F23AF7F3A /* ReconnectTimer.h */, - 7E5009BBCCABC04758994CC237E1EBEC /* ReconnectTimer.m */, - ); - name = Manager; - sourceTree = ""; - }; - 7DB346D0F39D3F0E887471402A8071AB = { - isa = PBXGroup; - children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 0F8D2E47FE03D3B91B51069F7C273AF4 /* Frameworks */, - 329A84E763AAA3CE9B53CA4941691647 /* Pods */, - CB762F9F656BB9FC728036CE9944F24A /* Products */, - 3BC49147AACB9AA067DCD757CF01B017 /* Targets Support Files */, - ); - sourceTree = ""; - }; - 86420754682E1557BDFAC234CB957DCB /* Pods-RCTMqtt */ = { - isa = PBXGroup; - children = ( - 80EDB93D5D0D8636182AA1FEBF96F836 /* Pods-RCTMqtt-acknowledgements.markdown */, - C595DE082166559009E4B2367D8AEA8D /* Pods-RCTMqtt-acknowledgements.plist */, - 07C7D2091EA8E9E36FCD056281D0D671 /* Pods-RCTMqtt-dummy.m */, - 68B085AA83EF69CC4252D85002E906DA /* Pods-RCTMqtt-resources.sh */, - 64AA53858E342061D9D0458B06A86954 /* Pods-RCTMqtt.debug.xcconfig */, - 637B8EEC3DAA9500EE63E9B743B00D13 /* Pods-RCTMqtt.release.xcconfig */, - ); - name = "Pods-RCTMqtt"; - path = "Target Support Files/Pods-RCTMqtt"; - sourceTree = ""; - }; - CB762F9F656BB9FC728036CE9944F24A /* Products */ = { - isa = PBXGroup; - children = ( - BCA05712A40C75F5A971BAA26F49CA48 /* libMQTTClient.a */, - 77C1EC246B4DA662502ABC908E6A2AC0 /* libPods-RCTMqtt.a */, - ); - name = Products; - sourceTree = ""; - }; - D7CE7E6AC42014E0153D252D82BCECC8 /* Min */ = { - isa = PBXGroup; - children = ( - 3CB4E08291BA715BDC2DD0C40CCF8D11 /* GCDTimer.h */, - 6268731C050562F46B5C42FC087FF98F /* GCDTimer.m */, - B78C99BDF39C8CDA81DE09DC2B270008 /* MQTTCFSocketDecoder.h */, - 830AB91F42FEE4FE049F39989DCF7755 /* MQTTCFSocketDecoder.m */, - BB952639D5D02A0986DA57915330A95C /* MQTTCFSocketEncoder.h */, - CE5BCAEBE07FF56C21DB8AFC3784BEEA /* MQTTCFSocketEncoder.m */, - 8089264233D9806D1265817B67FB795B /* MQTTCFSocketTransport.h */, - 85936E35BAEDEA0A7773733F3730E728 /* MQTTCFSocketTransport.m */, - 10B1039DC86FE1EFFC896E8862C103F2 /* MQTTClient.h */, - EC1CCBAAB2ACC7454ABF99859E68F45E /* MQTTCoreDataPersistence.h */, - 824B26077856B9434AF2AA0945B78230 /* MQTTCoreDataPersistence.m */, - 3C4FBFC5A8F2AC4E0BA4E10A25C861DA /* MQTTDecoder.h */, - 394F19498B0F147AE2A56BEA9375A9B6 /* MQTTDecoder.m */, - E717D095B76828579E2F24F47F865E8A /* MQTTInMemoryPersistence.h */, - 73A2381D3BC7DCA24983CF728297697A /* MQTTInMemoryPersistence.m */, - DCFB583828B0DFF9DFF2523E68E3FE8E /* MQTTLog.h */, - EC88550DD642743E7D062050125411AE /* MQTTLog.m */, - 9C9A4F4071EA25C3CCCE95039ED67BD9 /* MQTTMessage.h */, - A2C9B541FDDAB9EF6A721303B50E82CE /* MQTTMessage.m */, - BD2A90588C46EC19F052503A4449ED61 /* MQTTPersistence.h */, - 23D252F94B0DDAFA51BD40CF5766DFE8 /* MQTTProperties.h */, - ECD987B5BFAB7B577A7357C1C6F87E40 /* MQTTProperties.m */, - CBD95B416495C6006E87B5EA4BB4F660 /* MQTTSession.h */, - 7BA5185485FAFC37583A285624D1C0A5 /* MQTTSession.m */, - 24B821D06A2D71CE7D557C87D8D7E4AC /* MQTTSessionLegacy.h */, - BE8F400DCE0F6D8C13F7257B31E48CD9 /* MQTTSessionLegacy.m */, - 37E50DDDDD9EDC40A1DA17A1DC5F5018 /* MQTTSessionSynchron.h */, - 2BAA655F8C8796DDFFA4BF941A85C0C6 /* MQTTSessionSynchron.m */, - 0713751E0F854F054479F9B232F350B5 /* MQTTSSLSecurityPolicy.h */, - 73B4623E4586A1EBCDFD04BCDBCBF313 /* MQTTSSLSecurityPolicy.m */, - E349A74ADB8113AE90F1132E35A3767C /* MQTTSSLSecurityPolicyDecoder.h */, - B7D12DA34DE33846716B8CAD485578C8 /* MQTTSSLSecurityPolicyDecoder.m */, - 8363FCBFF6BC7F122EE3ED1781B78ADF /* MQTTSSLSecurityPolicyEncoder.h */, - ED6ACA614ADD98F1063B32BEE06E89AE /* MQTTSSLSecurityPolicyEncoder.m */, - DAE1A44DD7B7B9636F5099FA74E1D28E /* MQTTSSLSecurityPolicyTransport.h */, - 5EBECAAB12F819D8EAEB40099878D746 /* MQTTSSLSecurityPolicyTransport.m */, - 1154EBF0E4B58A1ED21B8A0F1E7C54AC /* MQTTStrict.h */, - 8C9E1CDE3471B1EA6962C61CD9C5E840 /* MQTTStrict.m */, - 77E1F3D87BFA6EC3273B6A7CFD643307 /* MQTTTransport.h */, - 1E2D069AAF32B58B03CB0CA63337B2F9 /* MQTTTransport.m */, - ); - name = Min; - sourceTree = ""; - }; - E92ABFDC6DA66E923C7A21B1145750C7 /* MQTTClient */ = { - isa = PBXGroup; - children = ( - 55E955C0A45DB8321D3EE10E46CA6EC5 /* Manager */, - D7CE7E6AC42014E0153D252D82BCECC8 /* Min */, - EEC3F2E6739B15CF9DB77581D4BE5222 /* Support Files */, - ); - name = MQTTClient; - path = MQTTClient; - sourceTree = ""; - }; - EEC3F2E6739B15CF9DB77581D4BE5222 /* Support Files */ = { - isa = PBXGroup; - children = ( - 94947EDA047BAA20E672AF4F37ABAF41 /* MQTTClient.xcconfig */, - D42D4127DCE5C8C431351BE380FB56E3 /* MQTTClient-dummy.m */, - 62712E6757C9F4F352686E2EB0F7DE36 /* MQTTClient-prefix.pch */, - ); - name = "Support Files"; - path = "../Target Support Files/MQTTClient"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 852885CDA73E74D75303D388070CEE5B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C28F7AD23CFA51B7B4410D514B43EA8B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - B6EC3A8F3AEC022F0ED6DB55B6DEF1B9 /* ForegroundReconnection.h in Headers */, - 434057E0CC10695BF704D480B1EC14B5 /* GCDTimer.h in Headers */, - AA6FFA82800A6363AC43B071183C16A8 /* MQTTCFSocketDecoder.h in Headers */, - 9830939743B99D4EFEF82CF9A6FDA20F /* MQTTCFSocketEncoder.h in Headers */, - 89F766BCA57B976FF8A9D8C8845AAE83 /* MQTTCFSocketTransport.h in Headers */, - 9702684FB865484D3E4F7DF4CD9438D1 /* MQTTClient.h in Headers */, - 1E1FAFE83EEDCECB8036802F45F0DB7F /* MQTTCoreDataPersistence.h in Headers */, - F5C8BC87101A27CCD3D17F423FD1D65A /* MQTTDecoder.h in Headers */, - 53A2B2DEFC3E35AE6F3AFC9961238330 /* MQTTInMemoryPersistence.h in Headers */, - 5FC0536C577C0E03219E01FFE85D1195 /* MQTTLog.h in Headers */, - 3027AC08FD082AF0DC4EDC212AB06BD5 /* MQTTMessage.h in Headers */, - 603F295CC4AEFFFC385066F746AF7AE5 /* MQTTPersistence.h in Headers */, - 8B4D6C5E5D69DD62EBA454BFA600164A /* MQTTProperties.h in Headers */, - 7B6080D9EE090C02031A5A7EAA6C7B61 /* MQTTSession.h in Headers */, - D0AA8766372321EB4ABF8A5DD0F22BBC /* MQTTSessionLegacy.h in Headers */, - F8C124C0049CCDE7AE186F31DC302357 /* MQTTSessionManager.h in Headers */, - 7B405601E3898B09A5D135A4A6DBFFED /* MQTTSessionSynchron.h in Headers */, - AF45604A1088FE2D6405D09399FC7A9F /* MQTTSSLSecurityPolicy.h in Headers */, - 693DD5CBD5FA132FC5543558933600E1 /* MQTTSSLSecurityPolicyDecoder.h in Headers */, - B590E4A124AC46F9784E11061F6D5A8B /* MQTTSSLSecurityPolicyEncoder.h in Headers */, - 3A6EA94C4D584837804C1CA29307407B /* MQTTSSLSecurityPolicyTransport.h in Headers */, - 22BA0165527297805067BB3F9F586EFD /* MQTTStrict.h in Headers */, - 5551EECE9193A2C08D4ECA9A5059AA26 /* MQTTTransport.h in Headers */, - 94054AD0E9926F07A4416B507C885E16 /* ReconnectTimer.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 94A5C39CF3C92090C8E4D8B3D7008808 /* Pods-RCTMqtt */ = { - isa = PBXNativeTarget; - buildConfigurationList = EB94F00F36B0EC192703D5CB90C8FBC2 /* Build configuration list for PBXNativeTarget "Pods-RCTMqtt" */; - buildPhases = ( - 852885CDA73E74D75303D388070CEE5B /* Headers */, - B1A29019DF3C9AC962F052924C3986FA /* Sources */, - 13DF2F2930CB8DA61571F42E58510362 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - AC8A6CC9DE6E6419F7CE158C87A59BAA /* PBXTargetDependency */, - ); - name = "Pods-RCTMqtt"; - productName = "Pods-RCTMqtt"; - productReference = 77C1EC246B4DA662502ABC908E6A2AC0 /* libPods-RCTMqtt.a */; - productType = "com.apple.product-type.library.static"; - }; - B8F78F3B11FDACA05E24886B367C185F /* MQTTClient */ = { - isa = PBXNativeTarget; - buildConfigurationList = 5C503185F7E416E8E304F343DE5E5DDD /* Build configuration list for PBXNativeTarget "MQTTClient" */; - buildPhases = ( - C28F7AD23CFA51B7B4410D514B43EA8B /* Headers */, - 6C34355B700B6A41101CA7F5AF71C3D2 /* Sources */, - CD53E2EDDCDC41654F9A97FB956F9144 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = MQTTClient; - productName = MQTTClient; - productReference = BCA05712A40C75F5A971BAA26F49CA48 /* libMQTTClient.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; - }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = CB762F9F656BB9FC728036CE9944F24A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - B8F78F3B11FDACA05E24886B367C185F /* MQTTClient */, - 94A5C39CF3C92090C8E4D8B3D7008808 /* Pods-RCTMqtt */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 6C34355B700B6A41101CA7F5AF71C3D2 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0DA95B589FD02D53E571AAFE0007D8EE /* ForegroundReconnection.m in Sources */, - 7AB0950A954C7E195108E7F7EB69F219 /* GCDTimer.m in Sources */, - 4F971C382D5BECBED224D0B889E6C7A8 /* MQTTCFSocketDecoder.m in Sources */, - 420AD0C3B49CE6F2BC27EF4758D37562 /* MQTTCFSocketEncoder.m in Sources */, - 5958B4024E29300E908FFC4773E4F061 /* MQTTCFSocketTransport.m in Sources */, - E4A9FDF9DD50B12ECB8014FFA400F8E2 /* MQTTClient-dummy.m in Sources */, - CAF35C26D7AE65617983AD8A681951A3 /* MQTTCoreDataPersistence.m in Sources */, - 3D02E989AD313414561F98E78A2514AF /* MQTTDecoder.m in Sources */, - 9201C63EA48CBBD270A9C47DB17A1B3F /* MQTTInMemoryPersistence.m in Sources */, - 5AF57ED8730589B1A90BBFD89AF32905 /* MQTTLog.m in Sources */, - EBB269003744775E0E30D87272B084D8 /* MQTTMessage.m in Sources */, - 467F3A6C751D9CA43A3FB06838FAF2A0 /* MQTTProperties.m in Sources */, - 18F4A977DD2F9C3D574A6C0895D93604 /* MQTTSession.m in Sources */, - 9AFAD4DF9B124F694DCB807E35D57EF4 /* MQTTSessionLegacy.m in Sources */, - AEA8CBF0ABE460132ACA3BD6F54B0A7B /* MQTTSessionManager.m in Sources */, - EE61CBA5FDC88943C8C43895790657B1 /* MQTTSessionSynchron.m in Sources */, - 7D67F1EE84F26F057D84F4A1D7DF83CD /* MQTTSSLSecurityPolicy.m in Sources */, - 922F833BC09F5C0B50123E0605650E63 /* MQTTSSLSecurityPolicyDecoder.m in Sources */, - 10C6F2CB802BEC1EFFFE380FE1EFA38F /* MQTTSSLSecurityPolicyEncoder.m in Sources */, - 655C4A694C051D11A270CB11E63C3A33 /* MQTTSSLSecurityPolicyTransport.m in Sources */, - 200A350965FD41171B2A649334392258 /* MQTTStrict.m in Sources */, - 39DCB4C31884D742EFC584CC8A137338 /* MQTTTransport.m in Sources */, - A273E1D74D5433257CF6D576A9695C70 /* ReconnectTimer.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B1A29019DF3C9AC962F052924C3986FA /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B8A92F725799BB7143906E029382F330 /* Pods-RCTMqtt-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - AC8A6CC9DE6E6419F7CE158C87A59BAA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = MQTTClient; - target = B8F78F3B11FDACA05E24886B367C185F /* MQTTClient */; - targetProxy = B8136350CECD69D6E48F3FF7FD88894E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 1D67730CB92A8A9595AB681AFC20DE29 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 94947EDA047BAA20E672AF4F37ABAF41 /* MQTTClient.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/MQTTClient/MQTTClient-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = MQTTClient; - PRODUCT_NAME = MQTTClient; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 2B76DAD0EBE577A6A04DBF996CDFEAF4 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 94947EDA047BAA20E672AF4F37ABAF41 /* MQTTClient.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - GCC_PREFIX_HEADER = "Target Support Files/MQTTClient/MQTTClient-prefix.pch"; - IPHONEOS_DEPLOYMENT_TARGET = 6.1; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PRIVATE_HEADERS_FOLDER_PATH = ""; - PRODUCT_MODULE_NAME = MQTTClient; - PRODUCT_NAME = MQTTClient; - PUBLIC_HEADERS_FOLDER_PATH = ""; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 6B6A76310185AD7FEFEC469C32EF5ECA /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 64AA53858E342061D9D0458B06A86954 /* Pods-RCTMqtt.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 85B95B1234E227C814CCC2C7902D0916 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - A73625DEBD810B78234FA1958C191C8C /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_ALLOWED = NO; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - D68FCE68AE26E62B7B74E273C37ED0A3 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 637B8EEC3DAA9500EE63E9B743B00D13 /* Pods-RCTMqtt.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A73625DEBD810B78234FA1958C191C8C /* Debug */, - 85B95B1234E227C814CCC2C7902D0916 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 5C503185F7E416E8E304F343DE5E5DDD /* Build configuration list for PBXNativeTarget "MQTTClient" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2B76DAD0EBE577A6A04DBF996CDFEAF4 /* Debug */, - 1D67730CB92A8A9595AB681AFC20DE29 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - EB94F00F36B0EC192703D5CB90C8FBC2 /* Build configuration list for PBXNativeTarget "Pods-RCTMqtt" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 6B6A76310185AD7FEFEC469C32EF5ECA /* Debug */, - D68FCE68AE26E62B7B74E273C37ED0A3 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; -} diff --git a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m b/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m deleted file mode 100644 index 2e28530..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_MQTTClient : NSObject -@end -@implementation PodsDummy_MQTTClient -@end diff --git a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch b/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig b/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig deleted file mode 100644 index 1968f88..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/MQTTClient" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/MQTTClient" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/MQTTClient -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.markdown b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.markdown deleted file mode 100644 index add9ba3..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.markdown +++ /dev/null @@ -1,237 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## MQTTClient - -Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' - from a Contributor if it was added to the Program by such Contributor - itself or anyone acting on such Contributor's behalf. Contributions do not - include additions to the Program which: (i) are separate modules of - software distributed in conjunction with the Program under their own - license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly - perform, distribute and sublicense the Contribution of such Contributor, - if any, and such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of - the Contribution and the Program if, at the time the Contribution is - added by the Contributor, such addition of the Contribution causes such - combination to be covered by the Licensed Patents. The patent license - shall not apply to any other combinations which include the Contribution. - No hardware per se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses - to its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other - entity based on infringement of intellectual property rights or - otherwise. As a condition to exercising the rights and licenses granted - hereunder, each Recipient hereby assumes sole responsibility to secure - any other intellectual property rights needed, if any. For example, if a - third party patent license is required to allow Recipient to distribute - the Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained - within the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, -if a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits and -other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such Commercial -Contributor in connection with its distribution of the Program in a commercial -product offering. The obligations in this section do not apply to any claims -or Losses relating to any actual or alleged intellectual property -infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor to control, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim at -its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using -and distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to the -risks and costs of program errors, compliance with applicable laws, damage to -or loss of data, programs or equipment, and unavailability or interruption of -operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue -and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of the -Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this Agreement, -whether expressly, by implication, estoppel or otherwise. All rights in the -Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - -Copyright (c) 2013-2015 Christoph Krey - -Based on - -https://github.com/m2mIO/mqttIO-objC - -Copyright © 2011, 2013 2lemetry, LLC - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -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. - -THIS 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. - - - -Generated by CocoaPods - https://cocoapods.org diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.plist b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.plist deleted file mode 100644 index b9a5321..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-acknowledgements.plist +++ /dev/null @@ -1,269 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Eclipse Public License - v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC -LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM -CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation - distributed under this Agreement, and -b) in the case of each subsequent Contributor: - i) changes to the Program, and - ii) additions to the Program; - - where such changes and/or additions to the Program originate from and are - distributed by that particular Contributor. A Contribution 'originates' - from a Contributor if it was added to the Program by such Contributor - itself or anyone acting on such Contributor's behalf. Contributions do not - include additions to the Program which: (i) are separate modules of - software distributed in conjunction with the Program under their own - license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents" mean patent claims licensable by a Contributor which are -necessarily infringed by the use or sale of its Contribution alone or when -combined with the Program. - -"Program" means the Contributions distributed in accordance with this -Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, -including all Contributors. - -2. GRANT OF RIGHTS - a) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free copyright license to - reproduce, prepare derivative works of, publicly display, publicly - perform, distribute and sublicense the Contribution of such Contributor, - if any, and such derivative works, in source code and object code form. - b) Subject to the terms of this Agreement, each Contributor hereby grants - Recipient a non-exclusive, worldwide, royalty-free patent license under - Licensed Patents to make, use, sell, offer to sell, import and otherwise - transfer the Contribution of such Contributor, if any, in source code and - object code form. This patent license shall apply to the combination of - the Contribution and the Program if, at the time the Contribution is - added by the Contributor, such addition of the Contribution causes such - combination to be covered by the Licensed Patents. The patent license - shall not apply to any other combinations which include the Contribution. - No hardware per se is licensed hereunder. - c) Recipient understands that although each Contributor grants the licenses - to its Contributions set forth herein, no assurances are provided by any - Contributor that the Program does not infringe the patent or other - intellectual property rights of any other entity. Each Contributor - disclaims any liability to Recipient for claims brought by any other - entity based on infringement of intellectual property rights or - otherwise. As a condition to exercising the rights and licenses granted - hereunder, each Recipient hereby assumes sole responsibility to secure - any other intellectual property rights needed, if any. For example, if a - third party patent license is required to allow Recipient to distribute - the Program, it is Recipient's responsibility to acquire that license - before distributing the Program. - d) Each Contributor represents that to its knowledge it has sufficient - copyright rights in its Contribution, if any, to grant the copyright - license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under -its own license agreement, provided that: - - a) it complies with the terms and conditions of this Agreement; and - b) its license agreement: - i) effectively disclaims on behalf of all Contributors all warranties - and conditions, express and implied, including warranties or - conditions of title and non-infringement, and implied warranties or - conditions of merchantability and fitness for a particular purpose; - ii) effectively excludes on behalf of all Contributors all liability for - damages, including direct, indirect, special, incidental and - consequential damages, such as lost profits; - iii) states that any provisions which differ from this Agreement are - offered by that Contributor alone and not by any other party; and - iv) states that source code for the Program is available from such - Contributor, and informs licensees how to obtain it in a reasonable - manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - - a) it must be made available under this Agreement; and - b) a copy of this Agreement must be included with each copy of the Program. - Contributors may not remove or alter any copyright notices contained - within the Program. - -Each Contributor must identify itself as the originator of its Contribution, -if -any, in a manner that reasonably allows subsequent Recipients to identify the -originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with -respect to end users, business partners and the like. While this license is -intended to facilitate the commercial use of the Program, the Contributor who -includes the Program in a commercial product offering should do so in a manner -which does not create potential liability for other Contributors. Therefore, -if a Contributor includes the Program in a commercial product offering, such -Contributor ("Commercial Contributor") hereby agrees to defend and indemnify -every other Contributor ("Indemnified Contributor") against any losses, -damages and costs (collectively "Losses") arising from claims, lawsuits and -other legal actions brought by a third party against the Indemnified -Contributor to the extent caused by the acts or omissions of such Commercial -Contributor in connection with its distribution of the Program in a commercial -product offering. The obligations in this section do not apply to any claims -or Losses relating to any actual or alleged intellectual property -infringement. In order to qualify, an Indemnified Contributor must: -a) promptly notify the Commercial Contributor in writing of such claim, and -b) allow the Commercial Contributor to control, and cooperate with the -Commercial Contributor in, the defense and any related settlement -negotiations. The Indemnified Contributor may participate in any such claim at -its own expense. - -For example, a Contributor might include the Program in a commercial product -offering, Product X. That Contributor is then a Commercial Contributor. If -that Commercial Contributor then makes performance claims, or offers -warranties related to Product X, those performance claims and warranties are -such Commercial Contributor's responsibility alone. Under this section, the -Commercial Contributor would have to defend claims against the other -Contributors related to those performance claims and warranties, and if a -court requires any other Contributor to pay any damages as a result, the -Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR -IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, -NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each -Recipient is solely responsible for determining the appropriateness of using -and distributing the Program and assumes all risks associated with its -exercise of rights under this Agreement , including but not limited to the -risks and costs of program errors, compliance with applicable laws, damage to -or loss of data, programs or equipment, and unavailability or interruption of -operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY -CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION -LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE -EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY -OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under -applicable law, it shall not affect the validity or enforceability of the -remainder of the terms of this Agreement, and without further action by the -parties hereto, such provision shall be reformed to the minimum extent -necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Program itself -(excluding combinations of the Program with other software or hardware) -infringes such Recipient's patent(s), then such Recipient's rights granted -under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to -comply with any of the material terms or conditions of this Agreement and does -not cure such failure in a reasonable period of time after becoming aware of -such noncompliance. If all Recipient's rights under this Agreement terminate, -Recipient agrees to cease use and distribution of the Program as soon as -reasonably practicable. However, Recipient's obligations under this Agreement -and any licenses granted by Recipient relating to the Program shall continue -and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in -order to avoid inconsistency the Agreement is copyrighted and may only be -modified in the following manner. The Agreement Steward reserves the right to -publish new versions (including revisions) of this Agreement from time to -time. No one other than the Agreement Steward has the right to modify this -Agreement. The Eclipse Foundation is the initial Agreement Steward. The -Eclipse Foundation may assign the responsibility to serve as the Agreement -Steward to a suitable separate entity. Each new version of the Agreement will -be given a distinguishing version number. The Program (including -Contributions) may always be distributed subject to the version of the -Agreement under which it was received. In addition, after a new version of the -Agreement is published, Contributor may elect to distribute the Program -(including its Contributions) under the new version. Except as expressly -stated in Sections 2(a) and 2(b) above, Recipient receives no rights or -licenses to the intellectual property of any Contributor under this Agreement, -whether expressly, by implication, estoppel or otherwise. All rights in the -Program not expressly granted under this Agreement are reserved. - -This Agreement is governed by the laws of the State of New York and the -intellectual property laws of the United States of America. No party to this -Agreement will bring a legal action under this Agreement more than one year -after the cause of action arose. Each party waives its rights to a jury trial in -any resulting litigation. - -Copyright (c) 2013-2015 Christoph Krey <krey.christoph@gmail.com> - -Based on - -https://github.com/m2mIO/mqttIO-objC - -Copyright © 2011, 2013 2lemetry, LLC - -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that -the following conditions are met: - -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. -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. - -THIS 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. - - - - License - EPLv1 - Title - MQTTClient - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-dummy.m b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-dummy.m deleted file mode 100644 index 68d1034..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_RCTMqtt : NSObject -@end -@implementation PodsDummy_Pods_RCTMqtt -@end diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-resources.sh b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-resources.sh deleted file mode 100755 index 345301f..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt-resources.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - 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 - 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} - ;; - *.xib) - 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 - 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} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - 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}" - else - 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}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig deleted file mode 100644 index 3299d6e..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.debug.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/MQTTClient" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/MQTTClient" -OTHER_LDFLAGS = $(inherited) -ObjC -l"MQTTClient" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.release.xcconfig b/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.release.xcconfig deleted file mode 100644 index 3299d6e..0000000 --- a/ios/RCTMqtt/Pods/Target Support Files/Pods-RCTMqtt/Pods-RCTMqtt.release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/MQTTClient" -LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/MQTTClient" -OTHER_LDFLAGS = $(inherited) -ObjC -l"MQTTClient" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/ios/RCTMqtt/RCTMqtt.xcworkspace/contents.xcworkspacedata b/ios/RCTMqtt/RCTMqtt.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 216dc31..0000000 --- a/ios/RCTMqtt/RCTMqtt.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/RCTMqtt/RCTMqtt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/RCTMqtt/RCTMqtt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/ios/RCTMqtt/RCTMqtt.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/package.json b/package.json index 93f0233..4d483e6 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "@hawkingnetwork/react-native-mqtt", + "name": "sp-react-native-mqtt", "version": "0.4.16", "description": "MQTT client for react-native", "main": "index.js", @@ -35,7 +35,7 @@ ], "license": "MIT", "bugs": { - "url": "https://github.com/hawkingnetwork/react-native-mqtt/issues" + "url": "https://github.com/SudoPlz/react-native-mqtt/issues" }, - "homepage": "https://github.com/hawkingnetwork/react-native-mqtt#readme" + "homepage": "https://github.com/SudoPlz/react-native-mqtt#readme" } From 82ea78d9319529e3bc1d8433df34443a2e252d9d Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Thu, 28 Feb 2019 02:24:53 +0200 Subject: [PATCH 02/41] Changed pkg name --- ios/RCTMqtt.xcodeproj/project.pbxproj | 22 ---------------------- package.json | 2 +- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/ios/RCTMqtt.xcodeproj/project.pbxproj b/ios/RCTMqtt.xcodeproj/project.pbxproj index 633ae6c..96af4f6 100644 --- a/ios/RCTMqtt.xcodeproj/project.pbxproj +++ b/ios/RCTMqtt.xcodeproj/project.pbxproj @@ -68,7 +68,6 @@ isa = PBXNativeTarget; buildConfigurationList = FF7A9D491C64785B006743BA /* Build configuration list for PBXNativeTarget "RCTMqtt" */; buildPhases = ( - 8A2A2943DEA045B900795060 /* [CP] Check Pods Manifest.lock */, FF7A9D3C1C64785B006743BA /* Sources */, FF7A9D3D1C64785B006743BA /* Frameworks */, FF7A9D3E1C64785B006743BA /* CopyFiles */, @@ -113,27 +112,6 @@ }; /* End PBXProject section */ -/* Begin PBXShellScriptBuildPhase section */ - 8A2A2943DEA045B900795060 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RCTMqtt-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "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"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ FF7A9D3C1C64785B006743BA /* Sources */ = { isa = PBXSourcesBuildPhase; diff --git a/package.json b/package.json index 4d483e6..ffb4a75 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "email": "tuanpm@live.com", "url": "http://tuanpm.net" } - ], + ], "license": "MIT", "bugs": { "url": "https://github.com/SudoPlz/react-native-mqtt/issues" From 02b1a1ff671329599f8a2f740c9112009c6f65cc Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Sat, 2 Mar 2019 01:17:27 +0200 Subject: [PATCH 03/41] Now throwing an error when the user specifies a wrong uri --- index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/index.js b/index.js index 913faf3..0f2b822 100644 --- a/index.js +++ b/index.js @@ -67,6 +67,9 @@ module.exports = { if(options.uri) { var pattern = /^((mqtt[s]?|ws[s]?)?:(\/\/)([0-9a-zA-Z_\.]*):?(\d+))$/; var matches = options.uri.match(pattern); + if (!matches) { + throw new Error(`Uri passed to createClient ${options.uri} doesn't match a known protocol (mqtt:// or ws://).`); + } var protocol = matches[2]; var host = matches[4]; var port = matches[5]; From 8b8e3d70a5ba1b58339f803ad27b96f08c111b99 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Sat, 2 Mar 2019 01:18:05 +0200 Subject: [PATCH 04/41] onError now actually returns the error message (and not just an error vague string) --- ios/Mqtt.m | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ios/Mqtt.m b/ios/Mqtt.m index 8d8fb2d..0b01a20 100644 --- a/ios/Mqtt.m +++ b/ios/Mqtt.m @@ -82,6 +82,7 @@ - (void) connect { } if (!self.manager) { dispatch_queue_t queue = dispatch_queue_create("com.hawking.app.anchor.mqtt", NULL); + self.manager = [[MQTTSessionManager alloc] initWithPersistence:NO maxWindowSize:MQTT_MAX_WINDOW_SIZE maxMessages:MQTT_MAX_MESSAGES maxSize:MQTT_MAX_SIZE maxConnectionRetryInterval:60.0 connectInForeground:NO streamSSLLevel:nil queue: queue]; self.manager.delegate = self; MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init]; @@ -147,13 +148,16 @@ - (void)sessionManager:(MQTTSessionManager *)sessonManager didChangeState:(MQTTS @"message": @"connecting" }]; break; - case MQTTSessionManagerStateError: + case MQTTSessionManagerStateError: { + NSError *lastError = self.manager.lastErrorCode; + NSString *errorMsg = [NSString stringWithFormat:@"error: %@", [lastError localizedDescription]]; [self.emitter sendEventWithName:@"mqtt_events" body:@{@"event": @"error", @"clientRef": self.clientRef, - @"message": @"error" + @"message": errorMsg }]; break; + } case MQTTSessionManagerStateStarting: default: break; @@ -215,4 +219,4 @@ - (void)dealloc [self disconnect]; } -@end \ No newline at end of file +@end From 738aa576330dcbafd046909c881215122323b783 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Sat, 2 Mar 2019 01:18:22 +0200 Subject: [PATCH 05/41] Making sure we no longer receive bridge null errors --- ios/RCTMqtt.h | 3 ++- ios/RCTMqtt.m | 34 +++++++++++++++++---------- ios/RCTMqtt.xcodeproj/project.pbxproj | 12 +++++++--- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/ios/RCTMqtt.h b/ios/RCTMqtt.h index 4b4b6d7..f07f420 100644 --- a/ios/RCTMqtt.h +++ b/ios/RCTMqtt.h @@ -7,7 +7,8 @@ // #import #import +#import -@interface RCTMqtt : RCTEventEmitter +@interface RCTMqtt : RCTEventEmitter @end diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index 6503146..e111dd5 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -22,20 +22,13 @@ @interface RCTMqtt () @implementation RCTMqtt - +{ + bool hasListeners; +} RCT_EXPORT_MODULE(); -+ (id)allocWithZone:(NSZone *)zone { - static RCTMqtt *sharedInstance = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - sharedInstance = [super allocWithZone:zone]; - }); - return sharedInstance; -} - + (BOOL) requiresMainQueueSetup{ return NO; } @@ -49,10 +42,29 @@ - (instancetype)init } + +- (void)sendEventWithName:(NSString *)name body:(id)body { + if (hasListeners && self.bridge) { // Only send events if anyone is listening + [super sendEventWithName:name body:body]; + } +} + - (NSArray *)supportedEvents { return @[ @"mqtt_events" ]; } +// Will be called when this module's first listener is added. +-(void)startObserving { + hasListeners = YES; + // Set up any upstream listeners or background tasks as necessary +} + +// Will be called when this module's last listener is removed, or on dealloc. +-(void)stopObserving { + hasListeners = NO; + // Remove upstream listeners, stop unnecessary background tasks +} + RCT_EXPORT_METHOD(createClient:(NSDictionary *) options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { @@ -100,5 +112,3 @@ - (void)dealloc } @end - - diff --git a/ios/RCTMqtt.xcodeproj/project.pbxproj b/ios/RCTMqtt.xcodeproj/project.pbxproj index 96af4f6..208b369 100644 --- a/ios/RCTMqtt.xcodeproj/project.pbxproj +++ b/ios/RCTMqtt.xcodeproj/project.pbxproj @@ -47,8 +47,8 @@ children = ( D20012C41E4FA06500CE2854 /* Mqtt.h */, D20012C51E4FA06500CE2854 /* Mqtt.m */, - FF7A9D4C1C64788B006743BA /* RCTMqtt.m */, FF7A9D4D1C64788B006743BA /* RCTMqtt.h */, + FF7A9D4C1C64788B006743BA /* RCTMqtt.m */, FF7A9D411C64785B006743BA /* Products */, ); sourceTree = ""; @@ -211,7 +211,10 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../react-native/React/**", - "$(SRCROOT)/../../../../@hawkingnetwork/react-native-mqtt/ios/RCTMqtt/**", + "$(SRCROOT)/../../../node_modules/sp-react-native-mqtt/ios", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + "$(SRCROOT)/../../../../sp-react-native-mqtt/ios/**", + "$(SRCROOT)/../../../ios/Pods/MQTTClient/**", ); OTHER_LDFLAGS = ( "-ObjC", @@ -228,7 +231,10 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/../../../../react-native/React/**", - "$(SRCROOT)/../../../../@hawkingnetwork/react-native-mqtt/ios/RCTMqtt/**", + "$(SRCROOT)/../../../node_modules/sp-react-native-mqtt/ios", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + "$(SRCROOT)/../../../../sp-react-native-mqtt/ios/**", + "$(SRCROOT)/../../../ios/Pods/MQTTClient/**", ); OTHER_LDFLAGS = ( "-ObjC", From b52b948a8b19e28045f7708a34af2f4d78e785e5 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Thu, 14 Mar 2019 19:57:04 +0200 Subject: [PATCH 06/41] Version bump 0.4.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ffb4a75..6ae83f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.16", + "version": "0.4.17", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From b7e2c2f168ff731b3a114f13efe40ef432649ed9 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 13:40:44 +0200 Subject: [PATCH 07/41] Added disconnectAll - Disconnects all clients --- android/react-native-mqtt.iml | 141 ++++++++++++++++++ .../com/tuanpm/RCTMqtt/RCTMqttModule.java | 10 ++ ios/RCTMqtt.m | 8 + package.json | 2 +- 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 android/react-native-mqtt.iml diff --git a/android/react-native-mqtt.iml b/android/react-native-mqtt.iml new file mode 100644 index 0000000..107aece --- /dev/null +++ b/android/react-native-mqtt.iml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java index cbcc834..253fae7 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java @@ -61,6 +61,16 @@ public void disconnect(@NonNull final String clientRef) clients.get(clientRef).disconnect(); } + @ReactMethod + public void disconnectAll() + { + if (clients != null && clients.size() > 0) { + for (RCTMqtt aClient : clients.values()) { + aClient.disconnect(); + } + } + } + @ReactMethod public void subscribe(@NonNull final String clientRef, @NonNull final String topic, diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index e111dd5..8b6b780 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -91,6 +91,14 @@ -(void)stopObserving { [[[self clients] objectForKey:clientRef] disconnect]; } +RCT_EXPORT_METHOD(disconnectAll:(nonnull NSString *) clientRef) { + if (self.clients.count > 0) { + for(NSString* aClientRef in self.clients) { + [[[self clients] objectForKey:aClientRef] disconnect]; + } + } +} + RCT_EXPORT_METHOD(subscribe:(nonnull NSString *) clientRef topic:(NSString *)topic qos:(nonnull NSNumber *)qos) { [[[self clients] objectForKey:clientRef] subscribe:topic qos:qos]; } diff --git a/package.json b/package.json index 6ae83f0..7dbb11e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.17", + "version": "0.4.18", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From 8da9f899555c330e4cb68e9454ed8a63e77ffe5a Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 13:40:44 +0200 Subject: [PATCH 08/41] Added disconnectAll - Disconnects all clients --- android/react-native-mqtt.iml | 141 ++++++++++++++++++ .../com/tuanpm/RCTMqtt/RCTMqttModule.java | 10 ++ index.js | 6 +- ios/RCTMqtt.m | 8 + package.json | 2 +- 5 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 android/react-native-mqtt.iml diff --git a/android/react-native-mqtt.iml b/android/react-native-mqtt.iml new file mode 100644 index 0000000..107aece --- /dev/null +++ b/android/react-native-mqtt.iml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java index cbcc834..253fae7 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java @@ -61,6 +61,16 @@ public void disconnect(@NonNull final String clientRef) clients.get(clientRef).disconnect(); } + @ReactMethod + public void disconnectAll() + { + if (clients != null && clients.size() > 0) { + for (RCTMqtt aClient : clients.values()) { + aClient.disconnect(); + } + } + } + @ReactMethod public void subscribe(@NonNull final String clientRef, @NonNull final String topic, diff --git a/index.js b/index.js index 0f2b822..689a55d 100644 --- a/index.js +++ b/index.js @@ -115,6 +115,10 @@ module.exports = { } Mqtt.removeClient(client.clientRef); - } + }, + + disconnectAll: function () { + Mqtt.disconnectAll(); + }, }; diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index e111dd5..8b6b780 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -91,6 +91,14 @@ -(void)stopObserving { [[[self clients] objectForKey:clientRef] disconnect]; } +RCT_EXPORT_METHOD(disconnectAll:(nonnull NSString *) clientRef) { + if (self.clients.count > 0) { + for(NSString* aClientRef in self.clients) { + [[[self clients] objectForKey:aClientRef] disconnect]; + } + } +} + RCT_EXPORT_METHOD(subscribe:(nonnull NSString *) clientRef topic:(NSString *)topic qos:(nonnull NSNumber *)qos) { [[[self clients] objectForKey:clientRef] subscribe:topic qos:qos]; } diff --git a/package.json b/package.json index 6ae83f0..7dbb11e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.17", + "version": "0.4.18", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From 7976485caa3c5bf6ce039d364a7e801d8cc9d2f9 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:01:34 +0200 Subject: [PATCH 09/41] disconnectAll no longer receives an argument --- ios/RCTMqtt.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index 8b6b780..e82994d 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -91,7 +91,7 @@ -(void)stopObserving { [[[self clients] objectForKey:clientRef] disconnect]; } -RCT_EXPORT_METHOD(disconnectAll:(nonnull NSString *) clientRef) { +RCT_EXPORT_METHOD(disconnectAll:() clientRef) { if (self.clients.count > 0) { for(NSString* aClientRef in self.clients) { [[[self clients] objectForKey:aClientRef] disconnect]; From f4c43468f7ba9c209e1b5bbd05e59870596a4378 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:02:08 +0200 Subject: [PATCH 10/41] Bumped version .19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7dbb11e..1bd5dd2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.18", + "version": "0.4.19", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From af8648574572f5d58ef6bc03e8f72ed03e56690b Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:09:12 +0200 Subject: [PATCH 11/41] Removing the clientRef from disconnectAll --- ios/RCTMqtt.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index e82994d..9ce86ee 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -91,7 +91,7 @@ -(void)stopObserving { [[[self clients] objectForKey:clientRef] disconnect]; } -RCT_EXPORT_METHOD(disconnectAll:() clientRef) { +RCT_EXPORT_METHOD(disconnectAll) { if (self.clients.count > 0) { for(NSString* aClientRef in self.clients) { [[[self clients] objectForKey:aClientRef] disconnect]; From f68e93e99bdad6915b22566103dbcbcac60ddb5a Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:09:46 +0200 Subject: [PATCH 12/41] Published 4.20 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1bd5dd2..b2a0751 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.19", + "version": "0.4.20", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From d2748c58cd217a4d668bc7fe7e9fd5fee4874c22 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:48:16 +0200 Subject: [PATCH 13/41] Now disconnecting previous sessions on app reload --- .../src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java | 9 +++++++-- ios/RCTMqtt.m | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java index 253fae7..ac0fb7c 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java @@ -16,8 +16,7 @@ import java.util.HashMap; import java.util.UUID; -public class RCTMqttModule - extends ReactContextBaseJavaModule +public class RCTMqttModule extends ReactContextBaseJavaModule { private static final String TAG = "RCTMqttModule"; @@ -131,4 +130,10 @@ private void log(@NonNull final String message) } Log.d(TAG, message); } + + @Override + public void onCatalystInstanceDestroy() { + disconnectAll(); + } + } \ No newline at end of file diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index 9ce86ee..3008563 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -112,7 +112,12 @@ -(void)stopObserving { data:[data dataUsingEncoding:NSUTF8StringEncoding] qos:qos retain:retain]; + +} +- (void)invalidate +{ + [self disconnectAll]; } - (void)dealloc From c64397decb699b86f943ef625f2a583465f3e973 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Mar 2019 14:48:35 +0200 Subject: [PATCH 14/41] Bumped version .21 --- ios/RCTMqtt.m | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index 3008563..7add36d 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -68,14 +68,14 @@ -(void)stopObserving { RCT_EXPORT_METHOD(createClient:(NSDictionary *) options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - + NSString *clientRef = [[NSProcessInfo processInfo] globallyUniqueString]; - + Mqtt *client = [[Mqtt allocWithZone: nil] initWithEmitter:self options:options clientRef:clientRef]; - + [[self clients] setObject:client forKey:clientRef]; resolve(clientRef); - + } RCT_EXPORT_METHOD(removeClient:(nonnull NSString *) clientRef) { diff --git a/package.json b/package.json index b2a0751..87761b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.20", + "version": "0.4.21", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From b8e471ea33c8c99cf6ebfdd8a35ff11d052efc71 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 22 May 2019 23:16:56 +0300 Subject: [PATCH 15/41] Added podspec --- sp-react-native-mqtt.podspec | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 sp-react-native-mqtt.podspec diff --git a/sp-react-native-mqtt.podspec b/sp-react-native-mqtt.podspec new file mode 100644 index 0000000..1fa6954 --- /dev/null +++ b/sp-react-native-mqtt.podspec @@ -0,0 +1,17 @@ +require "json" + +json = File.read(File.join(__dir__, "package.json")) +package = JSON.parse(json).deep_symbolize_keys + +Pod::Spec.new do |s| + s.name = package[:name] + s.version = package[:version] + s.license = { type: "MIT" } + s.homepage = "https://github.com/SudoPlz/sp-react-native-mqtt" + s.authors = package[:author][:name] + s.summary = package[:description] + s.source = { git: package[:repository][:url] } + s.source_files = "ios/*.{h,m}" + s.platform = :ios, "8.0" + + s.dependency "React" From 87d1cc82b4f9bff9b28a978be99be929c649757e Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 22 May 2019 23:17:21 +0300 Subject: [PATCH 16/41] Bumped version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87761b0..be98c7c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.21", + "version": "0.4.22", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From 36911d13dd966b77ec370817885f4971aeca0f6c Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 22 May 2019 23:20:39 +0300 Subject: [PATCH 17/41] Ok fixed the podspec --- sp-react-native-mqtt.podspec | 1 + 1 file changed, 1 insertion(+) diff --git a/sp-react-native-mqtt.podspec b/sp-react-native-mqtt.podspec index 1fa6954..9eb3418 100644 --- a/sp-react-native-mqtt.podspec +++ b/sp-react-native-mqtt.podspec @@ -15,3 +15,4 @@ Pod::Spec.new do |s| s.platform = :ios, "8.0" s.dependency "React" +end \ No newline at end of file From 1a06ec7c6e131ea8f4d6f001a4d41bdcd7eeba50 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 22 May 2019 23:20:50 +0300 Subject: [PATCH 18/41] Bumped version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be98c7c..5454017 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.22", + "version": "0.4.23", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From e2da32b218425a3a0c4475c08910edb0cb376e8d Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 22 May 2019 23:25:50 +0300 Subject: [PATCH 19/41] Fixed podspec --- package.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5454017..b9afae1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.23", + "version": "0.4.24", "description": "MQTT client for react-native", "main": "index.js", "scripts": { @@ -15,7 +15,11 @@ "reactnative", "iot" ], - "author": "NaviOcean (https://githubs.com/naviocean)", + "author": { + "name": "Ioannis Kokkinidis", + "email": "sudoplz@gmail.com", + "url": "https://www.linkedin.com/in/sudoplz" + }, "contributors": [ { "name": "Yury Korolev", From ee12682ba4ab9d1bb02bb8be1892866d765ab10b Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Tue, 28 May 2019 16:49:30 +0300 Subject: [PATCH 20/41] Removed READ_PHONE_STATE permission --- android/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 448e450..7add54e 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@ - From 775c897f239b149ee04a94e15da6ddbdde9b89ab Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Tue, 28 May 2019 16:49:52 +0300 Subject: [PATCH 21/41] Bumped version (0.4.25) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b9afae1..690cb81 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.24", + "version": "0.4.25", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From f036a864dda5ca86bad5bcef6ed45a478ffc6d6b Mon Sep 17 00:00:00 2001 From: taoqf Date: Thu, 30 May 2019 16:13:44 +0800 Subject: [PATCH 22/41] android link --- README.md | 91 ++++++++++--------- android/build.gradle | 12 ++- .../main/java/com/tuanpm/RCTMqtt/RCTMqtt.java | 3 +- .../com/tuanpm/RCTMqtt/RCTMqttPackage.java | 3 +- package.json | 7 +- 5 files changed, 66 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 36f0506..0ce63c9 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ -[![npm](https://img.shields.io/npm/dt/react-native-mqtt.svg)]() +[![npm version](https://badge.fury.io/js/sp-react-native-mqtt.svg)](https://badge.fury.io/js/sp-react-native-mqtt) ## Description [react-native](https://github.com/facebook/react-native) mqtt client module ## MQTT Features (inherit from native MQTT framework) + * Use [MQTT Framework](https://github.com/ckrey/MQTT-Client-Framework) for IOS, [Paho MQTT Client](https://eclipse.org/paho/clients/android/) for Android * Support both IOS and Android * SSL/TLS * Native library, support mqtt over tcp ## Warning + This library in progress developing, api may change, SSL/TLS non verify ## Getting started @@ -18,26 +20,35 @@ This library in progress developing, api may change, SSL/TLS non verify ### Manual install #### JS + ```bash -npm install rusfearuth/react-native-mqtt --save +npm install sp-react-native-mqtt --save ``` + or + ```bash -yarn add rusfearuth/react-native-mqtt +yarn add sp-react-native-mqtt ``` +### Linking + +```sh +react-native link sp-react-native-mqtt +``` #### iOS -- In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` -- Go to `node_modules` ➜ `react-native-mqtt` and add `RCTMqtt.xcodeproj` -- In XCode, in the project navigator, select your project. Add `libRCTmqtt.a` and `libicucore.tbd` to your project's `Build Phases` ➜ `Link Binary With Libraries` -- Click `RCTMqtt.xcodeproj` in the project navigator and go the `Build Settings` tab. Make sure 'All' is toggled on (instead of 'Basic'). In the `Search Paths` section, look for `Header Search Paths` and make sure it contains both `$(SRCROOT)/../../react-native/React` - mark as `recursive`. -Add `pod 'MQTTClient'` to your podfile and `pod install` -- Run your project (`Cmd+R`) +* In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` +* Go to `node_modules` ➜ `react-native-mqtt` and add `RCTMqtt.xcodeproj` +* In XCode, in the project navigator, select your project. Add `libRCTmqtt.a` and `libicucore.tbd` to your project's `Build Phases` ➜ `Link Binary With Libraries` +* Click `RCTMqtt.xcodeproj` in the project navigator and go the `Build Settings` tab. Make sure 'All' is toggled on (instead of 'Basic'). In the `Search Paths` section, look for `Header Search Paths` and make sure it contains both `$(SRCROOT)/../../react-native/React` - mark as `recursive`. +* Add `pod 'MQTTClient'` to your podfile and `pod install` +* Run your project (`Cmd+R`) #### Android -- Modify the ReactInstanceManager.builder() calls chain in `android/app/main/java/.../MainActivity.java` to include: + +* Modify the ReactInstanceManager.builder() calls chain in `android/app/main/java/.../MainActivity.java` to include: ```java import com.tuanpm.RCTMqtt.*; // import @@ -48,30 +59,28 @@ import com.tuanpm.RCTMqtt.*; // import new RCTMqttPackage() // for newest version of react-native ``` -- Append the following lines to `android/settings.gradle` before `include ':app'`: +* Append the following lines to `android/settings.gradle` before `include ':app'`: -``` +```gradle include ':react-native-mqtt' project(':react-native-mqtt').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-mqtt/android') ``` +* Insert the following lines inside the dependencies block in `android/app/build.gradle`, don't missing `apply plugin:'java'` on top: -- Insert the following lines inside the dependencies block in `android/app/build.gradle`, don't missing `apply plugin:'java'` on top: - -``` +```gradle compile project(':react-native-mqtt') ``` Notes: -``` +```gradle dependencies { compile project(':react-native-mqtt') } ``` - ## Usage ```javascript @@ -109,42 +118,42 @@ MQTT.createClient({ ``` ## API + * `mqtt.createClient(options)` create new client instance with `options`, async operation - - `uri`: `protocol://host:port`, protocol is [mqtt | mqtts] - - `host`: ipaddress or host name (override by uri if set) - - `port`: port number (override by uri if set) - - `tls`: true/false (override by uri if set to mqtts or wss) - - `user`: string username - - `pass`: string password - - `auth`: true/false - override = true if `user` or `pass` exist - - `clientId`: string client id - - `keepalive` + * `uri`: `protocol://host:port`, protocol is [mqtt | mqtts] + * `host`: ipaddress or host name (override by uri if set) + * `port`: port number (override by uri if set) + * `tls`: true/false (override by uri if set to mqtts or wss) + * `user`: string username + * `pass`: string password + * `auth`: true/false - override = true if `user` or `pass` exist + * `clientId`: string client id + * `keepalive` * `client` - - `on(event, callback)`: add event listener for - + event: `connect` - client connected - + event: `closed` - client disconnected - + event: `error` - error - + event: `message` - message object - - `connect`: begin connection - - `disconnect`: disconnect - - `subscribe(topic, qos)` - - `publish(topic, payload, qos, retain)` + * `on(event, callback)`: add event listener for + * event: `connect` - client connected + * event: `closed` - client disconnected + * event: `error` - error + * event: `message` - message object + * `connect`: begin connection + * `disconnect`: disconnect + * `subscribe(topic, qos)` + * `publish(topic, payload, qos, retain)` * `message` - - `retain`: *boolean* `false` - - `qos`: *number* `2` - - `data`: *string* `"test message"` - - `topic`: *string* `"/data"` + * `retain`: *boolean* `false` + * `qos`: *number* `2` + * `data`: *string* `"test message"` + * `topic`: *string* `"/data"` ## Todo * [ ] Use WeakReference for timer * [ ] Add disconnecting event - ## LICENSE -``` +```text INHERIT FROM MQTT LIBRARY (progress) ``` diff --git a/android/build.gradle b/android/build.gradle index 1aef5de..a518716 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,3 +1,7 @@ +def safeExtGet(prop, fallback) { + rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback +} + buildscript { repositories { google() @@ -12,12 +16,12 @@ buildscript { apply plugin: 'com.android.library' android { - compileSdkVersion 28 - buildToolsVersion "28.0.3" + compileSdkVersion safeExtGet('compileSdkVersion', 28) + buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3') defaultConfig { - minSdkVersion 16 - targetSdkVersion 26 + minSdkVersion safeExtGet('minSdkVersion', 16) + targetSdkVersion safeExtGet('targetSdkVersion', 26) versionCode 1 versionName "1.0" } diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java index 3a6e48d..67d98bc 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java @@ -65,7 +65,6 @@ public RCTMqtt(@NonNull final String ref, final ReactApplicationContext reactCon defaultOptions.putString("user", ""); defaultOptions.putString("pass", ""); defaultOptions.putBoolean("will", false); - defaultOptions.putInt("protocolLevel", 4); defaultOptions.putString("willMsg", ""); defaultOptions.putString("willtopic", ""); defaultOptions.putInt("willQos", 0); @@ -155,7 +154,7 @@ private void createClient(@NonNull final ReadableMap params) { /* * http://stackoverflow.com/questions/3761737/https-get-ssl-with-android-and- * self-signed-server-certificate - * + * * WARNING: for anybody else arriving at this answer, this is a dirty, horrible * hack and you must not use it for anything that matters. SSL/TLS without * authentication is worse than no encryption at all - reading and modifying diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttPackage.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttPackage.java index 55c1d4c..969d7da 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttPackage.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttPackage.java @@ -10,8 +10,7 @@ import java.util.Collections; import java.util.List; -public class RCTMqttPackage - implements ReactPackage +public class RCTMqttPackage implements ReactPackage { @Override diff --git a/package.json b/package.json index 690cb81..6a29b83 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/hawkingnetwork/react-native-mqtt.git" + "url": "git+https://github.com/SudoPlz/react-native-mqtt.git" }, "keywords": [ "mqtt", @@ -35,6 +35,11 @@ "name": "Tuan PM", "email": "tuanpm@live.com", "url": "http://tuanpm.net" + }, + { + "name": "taoqf", + "email": "tao_qiufeng@126.com", + "url": "http://github.com/taoqf" } ], "license": "MIT", From ba79e53f3961ae786fb4963885a8e0c2651604d1 Mon Sep 17 00:00:00 2001 From: taoqf Date: Thu, 30 May 2019 16:14:20 +0800 Subject: [PATCH 23/41] add typescript definition --- index.d.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..83582a8 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,48 @@ +export type QoS = 0 | 1 | 2; + +export class IMqttClient { + constructor(options: { + clientId: string; + uri: string; + host?: string; + port?: number; + protocol?: 'mqtt' | 'tcp' | 'wss' | 'mqtts' | 'ws'; + tls?: boolean; + keepalive?: number; // seconds + protocolLevel?: number; + clean?: boolean; + auth?: boolean; + user?: string; // only used when auth is true + pass?: string; // only used when auth is true + will?: boolean; + willMsg?: string; // only used when will is true + willtopic?: string; // only used when will is true + willQos?: QoS; // only used when will is true + willRetainFlag: boolean; // only used when will is true + automaticReconnect?: boolean; // android only + }) + on(event: 'closed', cb: (msg: string) => void): void + on(event: 'error', cb: (msg: string) => void): void + on(event: 'message', cb: (msg: { + data: string; + qos: QoS; + retain: boolean; + topic: string; + }) => void): void + on(event: 'connect', cb: (msg: { reconnect: boolean; }) => void): void + connect(): void; + disconnect(): void; + subscribe(topic: string, qos: QoS): void; + unsubscribe(topic: string): void; + publish(topic: string, payload: string, qos: QoS, retain: boolean): void; + reconnect(): void; + isConnected(): Promise; +} + +declare namespace mqtt { + function createClient(options: { uri: string, clientId?: string }): Promise; + function removeClient(client: IMqttClient): void; + function disconnectAll(): void; +} + +export default mqtt; From 28282b8fb58f327a13aa68d258ae4702f548adf6 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 12 Jun 2019 19:37:49 +0300 Subject: [PATCH 24/41] Added example --- rnmqttexample/.buckconfig | 6 + rnmqttexample/.flowconfig | 69 + rnmqttexample/.gitattributes | 1 + rnmqttexample/.gitignore | 56 + rnmqttexample/.watchmanconfig | 1 + rnmqttexample/App.js | 58 + rnmqttexample/__tests__/App-test.js | 14 + rnmqttexample/android/app/BUCK | 55 + rnmqttexample/android/app/build.gradle | 152 + rnmqttexample/android/app/build_defs.bzl | 19 + rnmqttexample/android/app/proguard-rules.pro | 17 + .../android/app/src/debug/AndroidManifest.xml | 8 + .../android/app/src/main/AndroidManifest.xml | 26 + .../java/com/rnmqttexample/MainActivity.java | 15 + .../com/rnmqttexample/MainApplication.java | 47 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3056 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5024 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2096 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2858 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4569 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7098 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6464 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10676 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9250 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15523 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 8 + rnmqttexample/android/build.gradle | 33 + rnmqttexample/android/gradle.properties | 18 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 55616 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + rnmqttexample/android/gradlew | 188 + rnmqttexample/android/gradlew.bat | 100 + rnmqttexample/android/keystores/BUCK | 8 + .../keystores/debug.keystore.properties | 4 + rnmqttexample/android/settings.gradle | 5 + rnmqttexample/app.json | 4 + rnmqttexample/babel.config.js | 3 + rnmqttexample/index.js | 9 + rnmqttexample/ios/Podfile | 21 + rnmqttexample/ios/Podfile.lock | 23 + rnmqttexample/ios/Pods/MQTTClient/LICENSE | 230 + .../MQTTClient/ForegroundReconnection.h | 23 + .../MQTTClient/ForegroundReconnection.m | 83 + .../MQTTClient/MQTTClient/GCDTimer.h | 19 + .../MQTTClient/MQTTClient/GCDTimer.m | 59 + .../MQTTClient/MQTTCFSocketDecoder.h | 39 + .../MQTTClient/MQTTCFSocketDecoder.m | 90 + .../MQTTClient/MQTTCFSocketEncoder.h | 38 + .../MQTTClient/MQTTCFSocketEncoder.m | 115 + .../MQTTClient/MQTTCFSocketTransport.h | 79 + .../MQTTClient/MQTTCFSocketTransport.m | 237 + .../MQTTClient/MQTTClient/MQTTClient.h | 39 + .../MQTTClient/MQTTCoreDataPersistence.h | 21 + .../MQTTClient/MQTTCoreDataPersistence.m | 513 + .../MQTTClient/MQTTClient/MQTTDecoder.h | 66 + .../MQTTClient/MQTTClient/MQTTDecoder.m | 215 + .../MQTTClient/MQTTInMemoryPersistence.h | 16 + .../MQTTClient/MQTTInMemoryPersistence.m | 180 + .../MQTTClient/MQTTClient/MQTTLog.h | 123 + .../MQTTClient/MQTTClient/MQTTLog.m | 27 + .../MQTTClient/MQTTClient/MQTTMessage.h | 233 + .../MQTTClient/MQTTClient/MQTTMessage.m | 762 ++ .../MQTTClient/MQTTClient/MQTTPersistence.h | 124 + .../MQTTClient/MQTTClient/MQTTProperties.h | 76 + .../MQTTClient/MQTTClient/MQTTProperties.m | 336 + .../MQTTClient/MQTTSSLSecurityPolicy.h | 158 + .../MQTTClient/MQTTSSLSecurityPolicy.m | 297 + .../MQTTClient/MQTTSSLSecurityPolicyDecoder.h | 19 + .../MQTTClient/MQTTSSLSecurityPolicyDecoder.m | 60 + .../MQTTClient/MQTTSSLSecurityPolicyEncoder.h | 18 + .../MQTTClient/MQTTSSLSecurityPolicyEncoder.m | 60 + .../MQTTSSLSecurityPolicyTransport.h | 30 + .../MQTTSSLSecurityPolicyTransport.m | 98 + .../MQTTClient/MQTTClient/MQTTSession.h | 886 ++ .../MQTTClient/MQTTClient/MQTTSession.m | 1641 ++++ .../MQTTClient/MQTTClient/MQTTSessionLegacy.h | 112 + .../MQTTClient/MQTTClient/MQTTSessionLegacy.m | 86 + .../MQTTClient/MQTTSessionManager.h | 237 + .../MQTTClient/MQTTSessionManager.m | 420 + .../MQTTClient/MQTTSessionSynchron.h | 194 + .../MQTTClient/MQTTSessionSynchron.m | 192 + .../MQTTClient/MQTTClient/MQTTStrict.h | 33 + .../MQTTClient/MQTTClient/MQTTStrict.m | 22 + .../MQTTClient/MQTTClient/MQTTTransport.h | 114 + .../MQTTClient/MQTTClient/MQTTTransport.m | 40 + .../MQTTClient/MQTTClient/ReconnectTimer.h | 21 + .../MQTTClient/MQTTClient/ReconnectTimer.m | 67 + rnmqttexample/ios/Pods/MQTTClient/README.md | 153 + rnmqttexample/ios/Pods/Manifest.lock | 23 + .../ios/Pods/Pods.xcodeproj/project.pbxproj | 1119 +++ .../MQTTClient/MQTTClient-Info.plist | 26 + .../MQTTClient/MQTTClient-dummy.m | 5 + .../MQTTClient/MQTTClient-prefix.pch | 12 + .../MQTTClient/MQTTClient-umbrella.h | 40 + .../MQTTClient/MQTTClient.modulemap | 6 + .../MQTTClient/MQTTClient.xcconfig | 8 + .../Pods-rnmqttexample-tvOSTests-Info.plist | 26 + ...xample-tvOSTests-acknowledgements.markdown | 3 + ...ttexample-tvOSTests-acknowledgements.plist | 29 + .../Pods-rnmqttexample-tvOSTests-dummy.m | 5 + .../Pods-rnmqttexample-tvOSTests-umbrella.h | 16 + ...ods-rnmqttexample-tvOSTests.debug.xcconfig | 8 + .../Pods-rnmqttexample-tvOSTests.modulemap | 6 + ...s-rnmqttexample-tvOSTests.release.xcconfig | 8 + .../Pods-rnmqttexample-Info.plist | 26 + ...ds-rnmqttexample-acknowledgements.markdown | 237 + .../Pods-rnmqttexample-acknowledgements.plist | 269 + .../Pods-rnmqttexample-dummy.m | 5 + .../Pods-rnmqttexample-frameworks.sh | 171 + .../Pods-rnmqttexample-umbrella.h | 16 + .../Pods-rnmqttexample.debug.xcconfig | 9 + .../Pods-rnmqttexample.modulemap | 6 + .../Pods-rnmqttexample.release.xcconfig | 9 + .../Pods-rnmqttexampleTests-Info.plist | 26 + ...mqttexampleTests-acknowledgements.markdown | 3 + ...-rnmqttexampleTests-acknowledgements.plist | 29 + .../Pods-rnmqttexampleTests-dummy.m | 5 + .../Pods-rnmqttexampleTests-umbrella.h | 16 + .../Pods-rnmqttexampleTests.debug.xcconfig | 8 + .../Pods-rnmqttexampleTests.modulemap | 6 + .../Pods-rnmqttexampleTests.release.xcconfig | 8 + .../ios/rnmqttexample-tvOS/Info.plist | 54 + .../ios/rnmqttexample-tvOSTests/Info.plist | 24 + .../rnmqttexample.xcodeproj/project.pbxproj | 1726 ++++ .../xcschemes/rnmqttexample-tvOS.xcscheme | 129 + .../xcschemes/rnmqttexample.xcscheme | 129 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + rnmqttexample/ios/rnmqttexample/AppDelegate.h | 15 + rnmqttexample/ios/rnmqttexample/AppDelegate.m | 42 + .../rnmqttexample/Base.lproj/LaunchScreen.xib | 42 + .../AppIcon.appiconset/Contents.json | 38 + .../Images.xcassets/Contents.json | 6 + rnmqttexample/ios/rnmqttexample/Info.plist | 60 + rnmqttexample/ios/rnmqttexample/main.m | 16 + .../ios/rnmqttexampleTests/Info.plist | 24 + .../rnmqttexampleTests/rnmqttexampleTests.m | 68 + rnmqttexample/metro.config.js | 17 + rnmqttexample/package-lock.json | 8376 +++++++++++++++++ rnmqttexample/package.json | 26 + rnmqttexample/realtimeManager.js | 76 + rnmqttexample/yarn.lock | 6234 ++++++++++++ 143 files changed, 28986 insertions(+) create mode 100644 rnmqttexample/.buckconfig create mode 100644 rnmqttexample/.flowconfig create mode 100644 rnmqttexample/.gitattributes create mode 100644 rnmqttexample/.gitignore create mode 100644 rnmqttexample/.watchmanconfig create mode 100644 rnmqttexample/App.js create mode 100644 rnmqttexample/__tests__/App-test.js create mode 100644 rnmqttexample/android/app/BUCK create mode 100644 rnmqttexample/android/app/build.gradle create mode 100644 rnmqttexample/android/app/build_defs.bzl create mode 100644 rnmqttexample/android/app/proguard-rules.pro create mode 100644 rnmqttexample/android/app/src/debug/AndroidManifest.xml create mode 100644 rnmqttexample/android/app/src/main/AndroidManifest.xml create mode 100644 rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainActivity.java create mode 100644 rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainApplication.java create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 rnmqttexample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 rnmqttexample/android/app/src/main/res/values/strings.xml create mode 100644 rnmqttexample/android/app/src/main/res/values/styles.xml create mode 100644 rnmqttexample/android/build.gradle create mode 100644 rnmqttexample/android/gradle.properties create mode 100644 rnmqttexample/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 rnmqttexample/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 rnmqttexample/android/gradlew create mode 100644 rnmqttexample/android/gradlew.bat create mode 100644 rnmqttexample/android/keystores/BUCK create mode 100644 rnmqttexample/android/keystores/debug.keystore.properties create mode 100644 rnmqttexample/android/settings.gradle create mode 100644 rnmqttexample/app.json create mode 100644 rnmqttexample/babel.config.js create mode 100644 rnmqttexample/index.js create mode 100644 rnmqttexample/ios/Podfile create mode 100644 rnmqttexample/ios/Podfile.lock create mode 100644 rnmqttexample/ios/Pods/MQTTClient/LICENSE create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h create mode 100755 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h create mode 100755 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h create mode 100644 rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m create mode 100644 rnmqttexample/ios/Pods/MQTTClient/README.md create mode 100644 rnmqttexample/ios/Pods/Manifest.lock create mode 100644 rnmqttexample/ios/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-Info.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-umbrella.h create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.modulemap create mode 100644 rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.markdown create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-dummy.m create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-umbrella.h create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.debug.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.release.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.markdown create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-dummy.m create mode 100755 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-umbrella.h create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.debug.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.release.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.markdown create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.plist create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-dummy.m create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-umbrella.h create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.debug.xcconfig create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap create mode 100644 rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.release.xcconfig create mode 100644 rnmqttexample/ios/rnmqttexample-tvOS/Info.plist create mode 100644 rnmqttexample/ios/rnmqttexample-tvOSTests/Info.plist create mode 100644 rnmqttexample/ios/rnmqttexample.xcodeproj/project.pbxproj create mode 100644 rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample-tvOS.xcscheme create mode 100644 rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample.xcscheme create mode 100644 rnmqttexample/ios/rnmqttexample.xcworkspace/contents.xcworkspacedata create mode 100644 rnmqttexample/ios/rnmqttexample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 rnmqttexample/ios/rnmqttexample/AppDelegate.h create mode 100644 rnmqttexample/ios/rnmqttexample/AppDelegate.m create mode 100644 rnmqttexample/ios/rnmqttexample/Base.lproj/LaunchScreen.xib create mode 100644 rnmqttexample/ios/rnmqttexample/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 rnmqttexample/ios/rnmqttexample/Images.xcassets/Contents.json create mode 100644 rnmqttexample/ios/rnmqttexample/Info.plist create mode 100644 rnmqttexample/ios/rnmqttexample/main.m create mode 100644 rnmqttexample/ios/rnmqttexampleTests/Info.plist create mode 100644 rnmqttexample/ios/rnmqttexampleTests/rnmqttexampleTests.m create mode 100644 rnmqttexample/metro.config.js create mode 100644 rnmqttexample/package-lock.json create mode 100644 rnmqttexample/package.json create mode 100644 rnmqttexample/realtimeManager.js create mode 100644 rnmqttexample/yarn.lock diff --git a/rnmqttexample/.buckconfig b/rnmqttexample/.buckconfig new file mode 100644 index 0000000..934256c --- /dev/null +++ b/rnmqttexample/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/rnmqttexample/.flowconfig b/rnmqttexample/.flowconfig new file mode 100644 index 0000000..47d80d9 --- /dev/null +++ b/rnmqttexample/.flowconfig @@ -0,0 +1,69 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* + +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js + +; Ignore polyfills +.*/Libraries/polyfills/.* + +; Ignore metro +.*/node_modules/metro/.* + +[include] + +[libs] +node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow/ + +[options] +emoji=true + +esproposal.optional_chaining=enable +esproposal.nullish_coalescing=enable + +module.system=haste +module.system.haste.use_name_reducers=true +# get basename +module.system.haste.name_reducers='^.*/\([a-zA-Z0-9$_.-]+\.js\(\.flow\)?\)$' -> '\1' +# strip .js or .js.flow suffix +module.system.haste.name_reducers='^\(.*\)\.js\(\.flow\)?$' -> '\1' +# strip .ios suffix +module.system.haste.name_reducers='^\(.*\)\.ios$' -> '\1' +module.system.haste.name_reducers='^\(.*\)\.android$' -> '\1' +module.system.haste.name_reducers='^\(.*\)\.native$' -> '\1' +module.system.haste.paths.blacklist=.*/__tests__/.* +module.system.haste.paths.blacklist=.*/__mocks__/.* +module.system.haste.paths.blacklist=/node_modules/react-native/Libraries/Animated/src/polyfills/.* +module.system.haste.paths.whitelist=/node_modules/react-native/Libraries/.* + +munge_underscores=true + +module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' + +module.file_ext=.js +module.file_ext=.jsx +module.file_ext=.json +module.file_ext=.native.js + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState + +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +[version] +^0.92.0 diff --git a/rnmqttexample/.gitattributes b/rnmqttexample/.gitattributes new file mode 100644 index 0000000..d42ff18 --- /dev/null +++ b/rnmqttexample/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/rnmqttexample/.gitignore b/rnmqttexample/.gitignore new file mode 100644 index 0000000..5d64756 --- /dev/null +++ b/rnmqttexample/.gitignore @@ -0,0 +1,56 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# BUCK +buck-out/ +\.buckd/ +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +*/fastlane/report.xml +*/fastlane/Preview.html +*/fastlane/screenshots + +# Bundle artifact +*.jsbundle diff --git a/rnmqttexample/.watchmanconfig b/rnmqttexample/.watchmanconfig new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/rnmqttexample/.watchmanconfig @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/rnmqttexample/App.js b/rnmqttexample/App.js new file mode 100644 index 0000000..65286ad --- /dev/null +++ b/rnmqttexample/App.js @@ -0,0 +1,58 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + * @flow + */ + +import React, {Component} from 'react'; +import {Platform, StyleSheet, Text, View} from 'react-native'; +import MqttNotificationsManager from './realtimeManager'; + +const instructions = Platform.select({ + ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu', + android: + 'Double tap R on your keyboard to reload,\n' + + 'Shake or press menu button for dev menu', +}); + +// init realtime +MqttNotificationsManager.create( + 'bob', + { + uri: 'mqtt://test.mosquitto.org:1883', + }, +); + +type Props = {}; +export default class App extends Component { + render() { + return ( + + Welcome to React Native! + To get started, edit App.js + {instructions} + + ); + } +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, + welcome: { + fontSize: 20, + textAlign: 'center', + margin: 10, + }, + instructions: { + textAlign: 'center', + color: '#333333', + marginBottom: 5, + }, +}); diff --git a/rnmqttexample/__tests__/App-test.js b/rnmqttexample/__tests__/App-test.js new file mode 100644 index 0000000..1784766 --- /dev/null +++ b/rnmqttexample/__tests__/App-test.js @@ -0,0 +1,14 @@ +/** + * @format + */ + +import 'react-native'; +import React from 'react'; +import App from '../App'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + renderer.create(); +}); diff --git a/rnmqttexample/android/app/BUCK b/rnmqttexample/android/app/BUCK new file mode 100644 index 0000000..30ae92e --- /dev/null +++ b/rnmqttexample/android/app/BUCK @@ -0,0 +1,55 @@ +# To learn about Buck see [Docs](https://buckbuild.com/). +# To run your application with Buck: +# - install Buck +# - `npm start` - to start the packager +# - `cd android` +# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` +# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck +# - `buck install -r android/app` - compile, install and run application +# + +load(":build_defs.bzl", "create_aar_targets", "create_jar_targets") + +lib_deps = [] + +create_aar_targets(glob(["libs/*.aar"])) + +create_jar_targets(glob(["libs/*.jar"])) + +android_library( + name = "all-libs", + exported_deps = lib_deps, +) + +android_library( + name = "app-code", + srcs = glob([ + "src/main/java/**/*.java", + ]), + deps = [ + ":all-libs", + ":build_config", + ":res", + ], +) + +android_build_config( + name = "build_config", + package = "com.rnmqttexample", +) + +android_resource( + name = "res", + package = "com.rnmqttexample", + res = "src/main/res", +) + +android_binary( + name = "app", + keystore = "//android/keystores:debug", + manifest = "src/main/AndroidManifest.xml", + package_type = "debug", + deps = [ + ":app-code", + ], +) diff --git a/rnmqttexample/android/app/build.gradle b/rnmqttexample/android/app/build.gradle new file mode 100644 index 0000000..a0f1b6a --- /dev/null +++ b/rnmqttexample/android/app/build.gradle @@ -0,0 +1,152 @@ +apply plugin: "com.android.application" + +import com.android.build.OutputFile + +/** + * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets + * and bundleReleaseJsAndAssets). + * These basically call `react-native bundle` with the correct arguments during the Android build + * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the + * bundle directly from the development server. Below you can see all the possible configurations + * and their defaults. If you decide to add a configuration block, make sure to add it before the + * `apply from: "../../node_modules/react-native/react.gradle"` line. + * + * project.ext.react = [ + * // the name of the generated asset file containing your JS bundle + * bundleAssetName: "index.android.bundle", + * + * // the entry file for bundle generation + * entryFile: "index.android.js", + * + * // whether to bundle JS and assets in debug mode + * bundleInDebug: false, + * + * // whether to bundle JS and assets in release mode + * bundleInRelease: true, + * + * // whether to bundle JS and assets in another build variant (if configured). + * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants + * // The configuration property can be in the following formats + * // 'bundleIn${productFlavor}${buildType}' + * // 'bundleIn${buildType}' + * // bundleInFreeDebug: true, + * // bundleInPaidRelease: true, + * // bundleInBeta: true, + * + * // whether to disable dev mode in custom build variants (by default only disabled in release) + * // for example: to disable dev mode in the staging build type (if configured) + * devDisabledInStaging: true, + * // The configuration property can be in the following formats + * // 'devDisabledIn${productFlavor}${buildType}' + * // 'devDisabledIn${buildType}' + * + * // the root of your project, i.e. where "package.json" lives + * root: "../../", + * + * // where to put the JS bundle asset in debug mode + * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", + * + * // where to put the JS bundle asset in release mode + * jsBundleDirRelease: "$buildDir/intermediates/assets/release", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in debug mode + * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", + * + * // where to put drawable resources / React Native assets, e.g. the ones you use via + * // require('./image.png')), in release mode + * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", + * + * // by default the gradle tasks are skipped if none of the JS files or assets change; this means + * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to + * // date; if you have any other folders that you want to ignore for performance reasons (gradle + * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ + * // for example, you might want to remove it from here. + * inputExcludes: ["android/**", "ios/**"], + * + * // override which node gets called and with what additional arguments + * nodeExecutableAndArgs: ["node"], + * + * // supply additional arguments to the packager + * extraPackagerArgs: [] + * ] + */ + +project.ext.react = [ + entryFile: "index.js" +] + +apply from: "../../node_modules/react-native/react.gradle" + +/** + * Set this to true to create two separate APKs instead of one: + * - An APK that only works on ARM devices + * - An APK that only works on x86 devices + * The advantage is the size of the APK is reduced by about 4MB. + * Upload all the APKs to the Play Store and people will download + * the correct one based on the CPU architecture of their device. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Run Proguard to shrink the Java bytecode in release builds. + */ +def enableProguardInReleaseBuilds = false + +android { + compileSdkVersion rootProject.ext.compileSdkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + defaultConfig { + applicationId "com.rnmqttexample" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" + } + } + buildTypes { + release { + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits + def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86_64": 4] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation "com.android.support:appcompat-v7:${rootProject.ext.supportLibVersion}" + implementation "com.facebook.react:react-native:+" // From node_modules + implementation project(':sp-react-native-mqtt') +} + +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task copyDownloadableDepsToLibs(type: Copy) { + from configurations.compile + into 'libs' +} diff --git a/rnmqttexample/android/app/build_defs.bzl b/rnmqttexample/android/app/build_defs.bzl new file mode 100644 index 0000000..fff270f --- /dev/null +++ b/rnmqttexample/android/app/build_defs.bzl @@ -0,0 +1,19 @@ +"""Helper definitions to glob .aar and .jar targets""" + +def create_aar_targets(aarfiles): + for aarfile in aarfiles: + name = "aars__" + aarfile[aarfile.rindex("/") + 1:aarfile.rindex(".aar")] + lib_deps.append(":" + name) + android_prebuilt_aar( + name = name, + aar = aarfile, + ) + +def create_jar_targets(jarfiles): + for jarfile in jarfiles: + name = "jars__" + jarfile[jarfile.rindex("/") + 1:jarfile.rindex(".jar")] + lib_deps.append(":" + name) + prebuilt_jar( + name = name, + binary_jar = jarfile, + ) diff --git a/rnmqttexample/android/app/proguard-rules.pro b/rnmqttexample/android/app/proguard-rules.pro new file mode 100644 index 0000000..a92fa17 --- /dev/null +++ b/rnmqttexample/android/app/proguard-rules.pro @@ -0,0 +1,17 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/rnmqttexample/android/app/src/debug/AndroidManifest.xml b/rnmqttexample/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..fa26aa5 --- /dev/null +++ b/rnmqttexample/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,8 @@ + + + + + + + diff --git a/rnmqttexample/android/app/src/main/AndroidManifest.xml b/rnmqttexample/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..1ab14c3 --- /dev/null +++ b/rnmqttexample/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + diff --git a/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainActivity.java b/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainActivity.java new file mode 100644 index 0000000..eb0af2a --- /dev/null +++ b/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainActivity.java @@ -0,0 +1,15 @@ +package com.rnmqttexample; + +import com.facebook.react.ReactActivity; + +public class MainActivity extends ReactActivity { + + /** + * Returns the name of the main component registered from JavaScript. + * This is used to schedule rendering of the component. + */ + @Override + protected String getMainComponentName() { + return "rnmqttexample"; + } +} diff --git a/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainApplication.java b/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainApplication.java new file mode 100644 index 0000000..97715a1 --- /dev/null +++ b/rnmqttexample/android/app/src/main/java/com/rnmqttexample/MainApplication.java @@ -0,0 +1,47 @@ +package com.rnmqttexample; + +import android.app.Application; + +import com.facebook.react.ReactApplication; +import com.facebook.react.ReactNativeHost; +import com.facebook.react.ReactPackage; +import com.facebook.react.shell.MainReactPackage; +import com.facebook.soloader.SoLoader; + +import java.util.Arrays; +import java.util.List; +import com.tuanpm.RCTMqtt.*; + +public class MainApplication extends Application implements ReactApplication { + + private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { + @Override + public boolean getUseDeveloperSupport() { + return BuildConfig.DEBUG; + } + + @Override + protected List getPackages() { + return Arrays.asList( + new MainReactPackage(), + new RCTMqttPackage() + ); + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); + } +} diff --git a/rnmqttexample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/rnmqttexample/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5908281d070150700378b64a84c7db1f97aa1 GIT binary patch literal 3056 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 axPAxe%7rDusX+w*00006jj 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⁣ zwiG+x#%j}{0gU~J8;<|!B1@-XaB@{KORFwrYg_8rOv({b0EO#DbeQRm;B6_9=mXGf z-x|VL{zd`)#@yN}HkCSJbjbNlE|zL3Wm9Q8HY`sV)}3%pgN>cL^67{Z;PPL(*wT8N zUjXU{@|*hvm}({wsAC=x0^ok0%UAz0;sogW{B!nDqk|JJ5x~4NfTDgP49^zeu`csl?5mY@JdQdISc zFs!E{^grmkLnUk9 zny~m)1vws@5BFI<-0Tuo2JWX(0v`W|t(wg;s--L47WTvTMz-8l#TL^=OJNRS2?_Qj z3AKT+gvbyBi#H*-tJ%tWD|>EV3wy|8qxfzS!5RW;Jpl5*zo&^UBU=fG#2}UvRyNkK zA06Dy9;K1ca@r2T>yThYgI!ont$(G{6q#2QT+00r_x0(b)gsE`lBB?2gr55gq^D3Fi&p%E(p9>U%bv zkg1Jco(RbyTX7FDHOnl7-O@ zI$AaIl?9NJKPm(WiBP`1-#CB1QzU>&hKm)fpa5DKE{2$X0hGz-0uZ?cyTk(YC!Y&| zL=1VrNERSA5NA2jq7FACfX4JfPyj5XXl1yv0>~s;eF7L2$>&oMqeTFT2m$y7FlkON z_yurD1yIOvA;5C6016pyxBznGUt0kJ&k5r#;&>Jow`r)sp9R~PmK~lz$3xH%LT*1U zJdOyABZ3!FvNoR*vN$5ykHS8f`jA4zV+|L}i1C4`B2c{R0;UdYxaU|H)2avz@ z=mEYc|2S<+(B2Tj+FkX+2D+yFI!k9lWMA61DJ{)e;lum$(;O87?vGJJe!KtK04+N_ zI*P~t@dUb>9Xh{dbyl{-ZQ(UMgz7$|QfL5XSPkskt^NgctYC#;4WcZB1@%@wy@2t3 z2z0DI7&%b$*Aw~abe?GxE`ez@+6hOh-6*8fHRV{1os$EL@}uUZeG4h1&Be`98q*7j z=3-v+lhIjfWVo12!<>%V^a6lTgW3+_#W6n|p*~==zOH7z$0{LSZk(Tpd7EaD04hnA zL;#fxS0aD{`5^&D`}>0Uq?byDD-l2=!wm_bLcUl4gc(% za1p|itVANvFF>hghAS07Im1;IK;|b*W)}VDyI;BIp2=K*yu2a)j?B|f<44NI$NbmJ z#dE0>jI$fMr&@>4kN8MLFb4&2O9fEKaQg%(QO$4_1rVQywG^CmBLh#}_7gKW3vd?| z2?1^&KWq8}8I^_S0|)MowU_pw$q@nl@Nkn$z>BQq_KA^9yaR`(R3u{{Ig;cwt z@AJ^{ODQCm^neroM9nKNUAXi9RCK`OsP_LuR0PUR(YZCCX5dNF6VzcoK&=b^r`W?ltt|*F zpkoae%ZT{C1h~EcFui~b7fF`vb<<~j_VquuUA$}QqIKYELPp#;{u?q8Dz}WAG-(3; zjrm$i%7UbyZMM(Y{>!uJ#vNB?R~B{6Htp=>e*<{fQQ5W7V(1coCWlOON!MzZxhum| ztZBQpGR z;~#ur^&PockKdV{Q6R>o`Pl{0x!DEbpZ7y9Y;*ZvE!*gU`V1W3znva{f=?WO5I&>B z&hw6}tjECtaghm5z|C#%M;Yf_*pI^};h}Vl=^r9EN=tVDj86D;C$jIJ?K7VP+00000NkvXXu0mjf D5i!M* literal 0 HcmV?d00001 diff --git a/rnmqttexample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/rnmqttexample/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..459ca609d3ae0d3943ab44cdc27feef9256dc6d7 GIT binary patch literal 7098 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 literal 0 HcmV?d00001 diff --git a/rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8ca12fe024be86e868d14e91120a6902f8e88ac6 GIT binary patch literal 6464 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 B0*L?s literal 0 HcmV?d00001 diff --git a/rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/rnmqttexample/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..8e19b410a1b15ff180f3dacac19395fe3046cdec GIT binary patch literal 10676 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 literal 0 HcmV?d00001 diff --git a/rnmqttexample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/rnmqttexample/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..4c19a13c239cb67b8a2134ddd5f325db1d2d5bee GIT binary patch literal 15523 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 BIP(Ai literal 0 HcmV?d00001 diff --git a/rnmqttexample/android/app/src/main/res/values/strings.xml b/rnmqttexample/android/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..6766487 --- /dev/null +++ b/rnmqttexample/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + rnmqttexample + diff --git a/rnmqttexample/android/app/src/main/res/values/styles.xml b/rnmqttexample/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..319eb0c --- /dev/null +++ b/rnmqttexample/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/rnmqttexample/android/build.gradle b/rnmqttexample/android/build.gradle new file mode 100644 index 0000000..3a1d305 --- /dev/null +++ b/rnmqttexample/android/build.gradle @@ -0,0 +1,33 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = "28.0.3" + minSdkVersion = 16 + compileSdkVersion = 28 + targetSdkVersion = 28 + supportLibVersion = "28.0.0" + } + repositories { + google() + jcenter() + } + dependencies { + classpath("com.android.tools.build:gradle:3.4.0") + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + mavenLocal() + google() + jcenter() + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$rootDir/../node_modules/react-native/android" + } + } +} diff --git a/rnmqttexample/android/gradle.properties b/rnmqttexample/android/gradle.properties new file mode 100644 index 0000000..89e0d99 --- /dev/null +++ b/rnmqttexample/android/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/rnmqttexample/android/gradle/wrapper/gradle-wrapper.jar b/rnmqttexample/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c2d1cf016b3885f6930543d57b744ea8c220a1a GIT binary patch literal 55616 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/rnmqttexample/android/gradlew.bat b/rnmqttexample/android/gradlew.bat new file mode 100644 index 0000000..15e1ee3 --- /dev/null +++ b/rnmqttexample/android/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem http://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/rnmqttexample/android/keystores/BUCK b/rnmqttexample/android/keystores/BUCK new file mode 100644 index 0000000..88e4c31 --- /dev/null +++ b/rnmqttexample/android/keystores/BUCK @@ -0,0 +1,8 @@ +keystore( + name = "debug", + properties = "debug.keystore.properties", + store = "debug.keystore", + visibility = [ + "PUBLIC", + ], +) diff --git a/rnmqttexample/android/keystores/debug.keystore.properties b/rnmqttexample/android/keystores/debug.keystore.properties new file mode 100644 index 0000000..121bfb4 --- /dev/null +++ b/rnmqttexample/android/keystores/debug.keystore.properties @@ -0,0 +1,4 @@ +key.store=debug.keystore +key.alias=androiddebugkey +key.store.password=android +key.alias.password=android diff --git a/rnmqttexample/android/settings.gradle b/rnmqttexample/android/settings.gradle new file mode 100644 index 0000000..629ba1f --- /dev/null +++ b/rnmqttexample/android/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'rnmqttexample' + +include ':sp-react-native-mqtt' +project(':sp-react-native-mqtt').projectDir = new File(rootProject.projectDir, '../node_modules/sp-react-native-mqtt/android') +include ':app' \ No newline at end of file diff --git a/rnmqttexample/app.json b/rnmqttexample/app.json new file mode 100644 index 0000000..9c85235 --- /dev/null +++ b/rnmqttexample/app.json @@ -0,0 +1,4 @@ +{ + "name": "rnmqttexample", + "displayName": "rnmqttexample" +} \ No newline at end of file diff --git a/rnmqttexample/babel.config.js b/rnmqttexample/babel.config.js new file mode 100644 index 0000000..f842b77 --- /dev/null +++ b/rnmqttexample/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], +}; diff --git a/rnmqttexample/index.js b/rnmqttexample/index.js new file mode 100644 index 0000000..a850d03 --- /dev/null +++ b/rnmqttexample/index.js @@ -0,0 +1,9 @@ +/** + * @format + */ + +import {AppRegistry} from 'react-native'; +import App from './App'; +import {name as appName} from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/rnmqttexample/ios/Podfile b/rnmqttexample/ios/Podfile new file mode 100644 index 0000000..19c9d38 --- /dev/null +++ b/rnmqttexample/ios/Podfile @@ -0,0 +1,21 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'rnmqttexample' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + pod 'MQTTClient' + + # Pods for rnmqttexample + + target 'rnmqttexample-tvOSTests' do + inherit! :search_paths + # Pods for testing + end + + target 'rnmqttexampleTests' do + inherit! :search_paths + # Pods for testing + end + +end \ No newline at end of file diff --git a/rnmqttexample/ios/Podfile.lock b/rnmqttexample/ios/Podfile.lock new file mode 100644 index 0000000..5b505ca --- /dev/null +++ b/rnmqttexample/ios/Podfile.lock @@ -0,0 +1,23 @@ +PODS: + - MQTTClient (0.15.2): + - MQTTClient/Core (= 0.15.2) + - MQTTClient/Core (0.15.2): + - MQTTClient/Manager + - MQTTClient/Min + - MQTTClient/Manager (0.15.2): + - MQTTClient/Min + - MQTTClient/Min (0.15.2) + +DEPENDENCIES: + - MQTTClient + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - MQTTClient + +SPEC CHECKSUMS: + MQTTClient: 902c7bcac1501595f3d0b15178c7205b40331fb0 + +PODFILE CHECKSUM: 9e0819579a9cda7b7d2416d353139e76ab61b9b8 + +COCOAPODS: 1.7.0 diff --git a/rnmqttexample/ios/Pods/MQTTClient/LICENSE b/rnmqttexample/ios/Pods/MQTTClient/LICENSE new file mode 100644 index 0000000..dbc2477 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/LICENSE @@ -0,0 +1,230 @@ +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + +Copyright (c) 2013-2015 Christoph Krey + +Based on + +https://github.com/m2mIO/mqttIO-objC + +Copyright © 2011, 2013 2lemetry, LLC + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that +the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +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. + +THIS 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. + + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h new file mode 100644 index 0000000..d9bc277 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.h @@ -0,0 +1,23 @@ +// +// ForegroundReconnection.h +// MQTTClient +// +// Created by Josip Cavar on 22/08/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import + +#if TARGET_OS_IPHONE == 1 + +@class MQTTSessionManager; + +@interface ForegroundReconnection : NSObject + +@property (weak, nonatomic) MQTTSessionManager *sessionManager; + +- (instancetype)initWithMQTTSessionManager:(MQTTSessionManager *)manager; + +@end + +#endif diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m new file mode 100644 index 0000000..ff5a097 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ForegroundReconnection.m @@ -0,0 +1,83 @@ +// +// ForegroundReconnection.m +// MQTTClient +// +// Created by Josip Cavar on 22/08/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import "ForegroundReconnection.h" + +#if TARGET_OS_IPHONE == 1 +#import "MQTTSessionManager.h" +#import +@interface ForegroundReconnection () + +@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; + +@end + +@implementation ForegroundReconnection + +- (instancetype)initWithMQTTSessionManager:(MQTTSessionManager *)manager { + self = [super init]; + self.sessionManager = manager; + self.backgroundTask = UIBackgroundTaskInvalid; + + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + + [defaultCenter addObserver:self + selector:@selector(appWillResignActive) + name:UIApplicationWillResignActiveNotification + object:nil]; + + [defaultCenter addObserver:self + selector:@selector(appDidEnterBackground) + name:UIApplicationDidEnterBackgroundNotification + object:nil]; + + [defaultCenter addObserver:self + selector:@selector(appDidBecomeActive) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + return self; +} + +- (void)dealloc { + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + [defaultCenter removeObserver:self name:UIApplicationWillResignActiveNotification object:nil]; + [defaultCenter removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil]; + [defaultCenter removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil]; +} + +- (void)appWillResignActive { + [self.sessionManager disconnectWithDisconnectHandler:nil]; +} + +- (void)appDidEnterBackground { + if (!self.sessionManager.requiresTearDown) { + // we don't want to tear down session as it's already closed + return; + } + + __weak typeof(self) weakSelf = self; + self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + [strongSelf endBackgroundTask]; + }]; +} + +- (void)appDidBecomeActive { + [self.sessionManager connectToLast:nil]; +} + +- (void)endBackgroundTask { + if (self.backgroundTask) { + [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; + self.backgroundTask = UIBackgroundTaskInvalid; + } +} + +@end + +#endif diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h new file mode 100644 index 0000000..23cfbb3 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.h @@ -0,0 +1,19 @@ +// +// Timer.h +// MQTTClient +// +// Created by Josip Cavar on 06/11/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import + +@interface GCDTimer: NSObject + ++ (GCDTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + repeats:(BOOL)repeats + queue:(dispatch_queue_t)queue + block:(void (^)(void))block; +- (void)invalidate; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m new file mode 100644 index 0000000..3b72b7a --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/GCDTimer.m @@ -0,0 +1,59 @@ +// +// Timer.m +// MQTTClient +// +// Created by Josip Cavar on 06/11/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import "GCDTimer.h" + +@interface GCDTimer () + +@property (strong, nonatomic) dispatch_source_t timer; + +@end + +@implementation GCDTimer + ++ (GCDTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval + repeats:(BOOL)repeats + queue:(dispatch_queue_t)queue + block:(void (^)(void))block { + GCDTimer *timer = [[GCDTimer alloc] initWithInterval:interval + repeats:repeats + queue:queue + block:block]; + return timer; +} + +- (instancetype)initWithInterval:(NSTimeInterval)interval + repeats:(BOOL)repeats + queue:(dispatch_queue_t)queue + block:(void (^)(void))block { + self = [super init]; + if (self) { + self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); + dispatch_source_set_timer(self.timer, dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC), interval * NSEC_PER_SEC, 0); + dispatch_source_set_event_handler(self.timer, ^{ + if (!repeats) { + dispatch_source_cancel(self.timer); + } + block(); + }); + dispatch_resume(self.timer); + } + return self; +} + +- (void)dealloc { + [self invalidate]; +} + +- (void)invalidate { + if (self.timer) { + dispatch_source_cancel(self.timer); + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h new file mode 100644 index 0000000..78843d0 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.h @@ -0,0 +1,39 @@ +// +// MQTTCFSocketDecoder.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, MQTTCFSocketDecoderState) { + MQTTCFSocketDecoderStateInitializing, + MQTTCFSocketDecoderStateReady, + MQTTCFSocketDecoderStateError +}; + +@class MQTTCFSocketDecoder; + +@protocol MQTTCFSocketDecoderDelegate + +- (void)decoder:(MQTTCFSocketDecoder *)sender didReceiveMessage:(NSData *)data; +- (void)decoderDidOpen:(MQTTCFSocketDecoder *)sender; +- (void)decoder:(MQTTCFSocketDecoder *)sender didFailWithError:(NSError *)error; +- (void)decoderdidClose:(MQTTCFSocketDecoder *)sender; + +@end + +@interface MQTTCFSocketDecoder : NSObject + +@property (nonatomic) MQTTCFSocketDecoderState state; +@property (strong, nonatomic) NSError *error; +@property (strong, nonatomic) NSInputStream *stream; +@property (weak, nonatomic ) id delegate; + +- (void)open; +- (void)close; + +@end + + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m new file mode 100644 index 0000000..e7a65e7 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketDecoder.m @@ -0,0 +1,90 @@ +// +// MQTTCFSocketDecoder.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import "MQTTCFSocketDecoder.h" + +#import "MQTTLog.h" + +@interface MQTTCFSocketDecoder() + +@end + +@implementation MQTTCFSocketDecoder + +- (instancetype)init { + self = [super init]; + self.state = MQTTCFSocketDecoderStateInitializing; + + self.stream = nil; + return self; +} + +- (void)open { + if (self.state == MQTTCFSocketDecoderStateInitializing) { + (self.stream).delegate = self; + [self.stream open]; + } +} + +- (void)dealloc { + [self close]; +} + +- (void)close { + [self.stream close]; + [self.stream setDelegate:nil]; +} + +- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { + if (eventCode & NSStreamEventOpenCompleted) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventOpenCompleted"); + self.state = MQTTCFSocketDecoderStateReady; + [self.delegate decoderDidOpen:self]; + } + + if (eventCode & NSStreamEventHasBytesAvailable) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); + if (self.state == MQTTCFSocketDecoderStateInitializing) { + self.state = MQTTCFSocketDecoderStateReady; + } + + if (self.state == MQTTCFSocketDecoderStateReady) { + NSInteger n; + UInt8 buffer[768]; + + n = [self.stream read:buffer maxLength:sizeof(buffer)]; + if (n == -1) { + self.state = MQTTCFSocketDecoderStateError; + [self.delegate decoder:self didFailWithError:nil]; + } else { + NSData *data = [NSData dataWithBytes:buffer length:n]; + DDLogVerbose(@"[MQTTCFSocketDecoder] received (%lu)=%@...", (unsigned long)data.length, + [data subdataWithRange:NSMakeRange(0, MIN(256, data.length))]); + [self.delegate decoder:self didReceiveMessage:data]; + } + } + } + if (eventCode & NSStreamEventHasSpaceAvailable) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasSpaceAvailable"); + } + + if (eventCode & NSStreamEventEndEncountered) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventEndEncountered"); + self.state = MQTTCFSocketDecoderStateInitializing; + self.error = nil; + [self.delegate decoderdidClose:self]; + } + + if (eventCode & NSStreamEventErrorOccurred) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventErrorOccurred"); + self.state = MQTTCFSocketDecoderStateError; + self.error = self.stream.streamError; + [self.delegate decoder:self didFailWithError:self.error]; + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h new file mode 100644 index 0000000..eccdfee --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.h @@ -0,0 +1,38 @@ +// +// MQTTCFSocketEncoder.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import + +typedef NS_ENUM(NSInteger, MQTTCFSocketEncoderState) { + MQTTCFSocketEncoderStateInitializing, + MQTTCFSocketEncoderStateReady, + MQTTCFSocketEncoderStateError +}; + +@class MQTTCFSocketEncoder; + +@protocol MQTTCFSocketEncoderDelegate + +- (void)encoderDidOpen:(MQTTCFSocketEncoder *)sender; +- (void)encoder:(MQTTCFSocketEncoder *)sender didFailWithError:(NSError *)error; +- (void)encoderdidClose:(MQTTCFSocketEncoder *)sender; + +@end + +@interface MQTTCFSocketEncoder : NSObject + +@property (nonatomic) MQTTCFSocketEncoderState state; +@property (strong, nonatomic) NSError *error; +@property (strong, nonatomic) NSOutputStream *stream; +@property (weak, nonatomic ) id delegate; + +- (void)open; +- (void)close; +- (BOOL)send:(NSData *)data; + +@end + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m new file mode 100644 index 0000000..bd715ad --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketEncoder.m @@ -0,0 +1,115 @@ +// +// MQTTCFSocketEncoder.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import "MQTTCFSocketEncoder.h" + +#import "MQTTLog.h" + +@interface MQTTCFSocketEncoder() + +@property (strong, nonatomic) NSMutableData *buffer; + +@end + +@implementation MQTTCFSocketEncoder + +- (instancetype)init { + self = [super init]; + self.state = MQTTCFSocketEncoderStateInitializing; + self.buffer = [[NSMutableData alloc] init]; + self.stream = nil; + return self; +} + +- (void)dealloc { + [self close]; +} + +- (void)open { + (self.stream).delegate = self; + [self.stream open]; +} + +- (void)close { + [self.stream close]; + [self.stream setDelegate:nil]; +} + +- (void)setState:(MQTTCFSocketEncoderState)state { + DDLogVerbose(@"[MQTTCFSocketEncoder] setState %ld/%ld", (long)_state, (long)state); + _state = state; +} + +- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { + if (eventCode & NSStreamEventOpenCompleted) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventOpenCompleted"); + } + if (eventCode & NSStreamEventHasBytesAvailable) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasBytesAvailable"); + } + if (eventCode & NSStreamEventHasSpaceAvailable) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasSpaceAvailable"); + if (self.state == MQTTCFSocketEncoderStateInitializing) { + self.state = MQTTCFSocketEncoderStateReady; + [self.delegate encoderDidOpen:self]; + } + + if (self.state == MQTTCFSocketEncoderStateReady) { + if (self.buffer.length) { + [self send:nil]; + } + } + } + if (eventCode & NSStreamEventEndEncountered) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventEndEncountered"); + self.state = MQTTCFSocketEncoderStateInitializing; + self.error = nil; + [self.delegate encoderdidClose:self]; + } + if (eventCode & NSStreamEventErrorOccurred) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventErrorOccurred"); + self.state = MQTTCFSocketEncoderStateError; + self.error = self.stream.streamError; + [self.delegate encoder:self didFailWithError:self.error]; + } +} + +- (BOOL)send:(NSData *)data { + @synchronized(self) { + if (self.state != MQTTCFSocketEncoderStateReady) { + DDLogInfo(@"[MQTTCFSocketEncoder] not MQTTCFSocketEncoderStateReady"); + return NO; + } + + if (data) { + [self.buffer appendData:data]; + } + + if (self.buffer.length) { + DDLogVerbose(@"[MQTTCFSocketEncoder] buffer to write (%lu)=%@...", + (unsigned long)self.buffer.length, + [self.buffer subdataWithRange:NSMakeRange(0, MIN(256, self.buffer.length))]); + + NSInteger n = [self.stream write:self.buffer.bytes maxLength:self.buffer.length]; + + if (n == -1) { + DDLogVerbose(@"[MQTTCFSocketEncoder] streamError: %@", self.error); + self.state = MQTTCFSocketEncoderStateError; + self.error = self.stream.streamError; + return NO; + } else { + if (n < self.buffer.length) { + DDLogVerbose(@"[MQTTCFSocketEncoder] buffer partially written: %ld", (long)n); + } + [self.buffer replaceBytesInRange:NSMakeRange(0, n) withBytes:NULL length:0]; + } + } + return YES; + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h new file mode 100644 index 0000000..6b73904 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.h @@ -0,0 +1,79 @@ +// +// MQTTCFSocketTransport.h +// MQTTClient +// +// Created by Christoph Krey on 06.12.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTTransport.h" +#import "MQTTCFSocketDecoder.h" +#import "MQTTCFSocketEncoder.h" + +/** MQTTCFSocketTransport + * implements an MQTTTransport on top of CFNetwork + */ +@interface MQTTCFSocketTransport : MQTTTransport + +/** streamSSLLevel an NSString containing the security level for read and write streams + * For list of possible values see: + * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants + * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list + * and cannot be used as constant, but you can use it as a string value + * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL + */ +@property (strong, nonatomic) NSString *streamSSLLevel; + +/** host an NSString containing the hostName or IP address of the host to connect to + * defaults to @"localhost" + */ +@property (strong, nonatomic) NSString *host; + +/** port an unsigned 32 bit integer containing the IP port number to connect to + * defaults to 1883 + */ +@property (nonatomic) UInt32 port; + +/** tls a boolean indicating whether the transport should be using security + * defaults to NO + */ +@property (nonatomic) BOOL tls; + +/** Require for VoIP background service + * defaults to NO + */ +@property (nonatomic) BOOL voip; + +/** certificates An identity certificate used to reply to a server requiring client certificates according + * to the description given for SSLSetCertificate(). You may build the certificates array yourself or use the + * sundry method clientCertFromP12. + */ +@property (strong, nonatomic) NSArray *certificates; + +/** reads the content of a PKCS12 file and converts it to an certificates array for initWith... + @param path the path to a PKCS12 file + @param passphrase the passphrase to unlock the PKCS12 file + @returns a certificates array or nil if an error occured + + @code + NSString *path = [[NSBundle bundleForClass:[MQTTClientTests class]] pathForResource:@"filename" + ofType:@"p12"]; + + NSArray *myCerts = [MQTTCFSocketTransport clientCertsFromP12:path passphrase:@"passphrase"]; + if (myCerts) { + + self.session = [[MQTTSession alloc] init]; + ... + self.session.certificates = myCerts; + + [self.session connect]; + ... + } + + @endcode + + */ + ++ (NSArray *)clientCertsFromP12:(NSString *)path passphrase:(NSString *)passphrase; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m new file mode 100644 index 0000000..63a86b0 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCFSocketTransport.m @@ -0,0 +1,237 @@ +// +// MQTTCFSocketTransport.m +// MQTTClient +// +// Created by Christoph Krey on 06.12.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTCFSocketTransport.h" + +#import "MQTTLog.h" + +@interface MQTTCFSocketTransport() { + void *QueueIdentityKey; +} + +@property (strong, nonatomic) MQTTCFSocketEncoder *encoder; +@property (strong, nonatomic) MQTTCFSocketDecoder *decoder; + +@end + +@implementation MQTTCFSocketTransport + +@synthesize state; +@synthesize delegate; +@synthesize queue = _queue; +@synthesize streamSSLLevel; +@synthesize host; +@synthesize port; + +- (instancetype)init { + self = [super init]; + self.host = @"localhost"; + self.port = 1883; + self.tls = false; + self.voip = false; + self.certificates = nil; + self.queue = dispatch_get_main_queue(); + self.streamSSLLevel = (NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL; + return self; +} + +- (void)dealloc { + [self close]; +} + +- (void)setQueue:(dispatch_queue_t)queue { + _queue = queue; + + // We're going to use dispatch_queue_set_specific() to "mark" our queue. + // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. + // Later we can use dispatch_get_specific() to determine if we're executing on our queue. + // From the documentation: + // + // > Keys are only compared as pointers and are never dereferenced. + // > Thus, you can use a pointer to a static variable for a specific subsystem or + // > any other value that allows you to identify the value uniquely. + // + // So we're just going to use the memory address of an ivar. + + dispatch_queue_set_specific(_queue, &QueueIdentityKey, (__bridge void *)_queue, NULL); +} + +- (void)open { + DDLogVerbose(@"[MQTTCFSocketTransport] open"); + self.state = MQTTTransportOpening; + + NSError* connectError; + + CFReadStreamRef readStream; + CFWriteStreamRef writeStream; + + CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.host, self.port, &readStream, &writeStream); + + CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + + if (self.tls) { + NSMutableDictionary *sslOptions = [[NSMutableDictionary alloc] init]; + + sslOptions[(NSString *)kCFStreamSSLLevel] = self.streamSSLLevel; + + if (self.certificates) { + sslOptions[(NSString *)kCFStreamSSLCertificates] = self.certificates; + } + + if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))) { + connectError = [NSError errorWithDomain:@"MQTT" + code:errSSLInternal + userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl input stream!"}]; + } + if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))) { + connectError = [NSError errorWithDomain:@"MQTT" + code:errSSLInternal + userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl output stream!"}]; + } + } + + if (!connectError) { + self.encoder.delegate = nil; + self.encoder = [[MQTTCFSocketEncoder alloc] init]; + CFWriteStreamSetDispatchQueue(writeStream, self.queue); + self.encoder.stream = CFBridgingRelease(writeStream); + self.encoder.delegate = self; + if (self.voip) { + [self.encoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; + } + [self.encoder open]; + + self.decoder.delegate = nil; + self.decoder = [[MQTTCFSocketDecoder alloc] init]; + CFReadStreamSetDispatchQueue(readStream, self.queue); + self.decoder.stream = CFBridgingRelease(readStream); + self.decoder.delegate = self; + if (self.voip) { + [self.decoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; + } + [self.decoder open]; + } else { + [self close]; + } +} + +- (void)close { + // https://github.com/novastone-media/MQTT-Client-Framework/issues/325 + // We need to make sure that we are closing streams on their queue + // Otherwise, we end up with race condition where delegate is deallocated + // but still used by run loop event + if (self.queue != dispatch_get_specific(&QueueIdentityKey)) { + dispatch_sync(self.queue, ^{ + [self internalClose]; + }); + } else { + [self internalClose]; + } +} + +- (void)internalClose { + DDLogVerbose(@"[MQTTCFSocketTransport] close"); + self.state = MQTTTransportClosing; + + if (self.encoder) { + [self.encoder close]; + self.encoder.delegate = nil; + } + + if (self.decoder) { + [self.decoder close]; + self.decoder.delegate = nil; + } +} + +- (BOOL)send:(nonnull NSData *)data { + return [self.encoder send:data]; +} + +- (void)decoder:(MQTTCFSocketDecoder *)sender didReceiveMessage:(nonnull NSData *)data { + [self.delegate mqttTransport:self didReceiveMessage:data]; +} + +- (void)decoder:(MQTTCFSocketDecoder *)sender didFailWithError:(NSError *)error { + //self.state = MQTTTransportClosing; + //[self.delegate mqttTransport:self didFailWithError:error]; +} +- (void)encoder:(MQTTCFSocketEncoder *)sender didFailWithError:(NSError *)error { + self.state = MQTTTransportClosing; + [self.delegate mqttTransport:self didFailWithError:error]; +} + +- (void)decoderdidClose:(MQTTCFSocketDecoder *)sender { + self.state = MQTTTransportClosed; + [self.delegate mqttTransportDidClose:self]; +} +- (void)encoderdidClose:(MQTTCFSocketEncoder *)sender { + //self.state = MQTTTransportClosed; + //[self.delegate mqttTransportDidClose:self]; +} + +- (void)decoderDidOpen:(MQTTCFSocketDecoder *)sender { + //self.state = MQTTTransportOpen; + //[self.delegate mqttTransportDidOpen:self]; +} +- (void)encoderDidOpen:(MQTTCFSocketEncoder *)sender { + self.state = MQTTTransportOpen; + [self.delegate mqttTransportDidOpen:self]; +} + ++ (NSArray *)clientCertsFromP12:(NSString *)path passphrase:(NSString *)passphrase { + if (!path) { + DDLogWarn(@"[MQTTCFSocketTransport] no p12 path given"); + return nil; + } + + NSData *pkcs12data = [[NSData alloc] initWithContentsOfFile:path]; + if (!pkcs12data) { + DDLogWarn(@"[MQTTCFSocketTransport] reading p12 failed"); + return nil; + } + + if (!passphrase) { + DDLogWarn(@"[MQTTCFSocketTransport] no passphrase given"); + return nil; + } + CFArrayRef keyref = NULL; + OSStatus importStatus = SecPKCS12Import((__bridge CFDataRef)pkcs12data, + (__bridge CFDictionaryRef)@{(__bridge id)kSecImportExportPassphrase: passphrase}, + &keyref); + if (importStatus != noErr) { + DDLogWarn(@"[MQTTCFSocketTransport] Error while importing pkcs12 [%d]", (int)importStatus); + return nil; + } + + CFDictionaryRef identityDict = CFArrayGetValueAtIndex(keyref, 0); + if (!identityDict) { + DDLogWarn(@"[MQTTCFSocketTransport] could not CFArrayGetValueAtIndex"); + return nil; + } + + SecIdentityRef identityRef = (SecIdentityRef)CFDictionaryGetValue(identityDict, + kSecImportItemIdentity); + if (!identityRef) { + DDLogWarn(@"[MQTTCFSocketTransport] could not CFDictionaryGetValue"); + return nil; + }; + + SecCertificateRef cert = NULL; + OSStatus status = SecIdentityCopyCertificate(identityRef, &cert); + if (status != noErr) { + DDLogWarn(@"[MQTTCFSocketTransport] SecIdentityCopyCertificate failed [%d]", (int)status); + return nil; + } + + NSArray *clientCerts = @[(__bridge id)identityRef, (__bridge id)cert]; + return clientCerts; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h new file mode 100644 index 0000000..1eb28dc --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTClient.h @@ -0,0 +1,39 @@ +// +// MQTTClient.h +// MQTTClient +// +// Created by Christoph Krey on 13.01.14. +// Copyright © 2013-2017 Christoph Krey. All rights reserved. +// + +/** + Include this file to use MQTTClient classes in your application + + @author Christoph Krey c@ckrey.de + @see http://mqtt.org + */ + +#import + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import + +#if __has_include() +#import +#endif + +//! Project version number for MQTTClient. +FOUNDATION_EXPORT double MQTTClientVersionNumber; + +//! Project version string for MQTTClient<. +FOUNDATION_EXPORT const unsigned char MQTTClientVersionString[]; + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h new file mode 100644 index 0000000..9a35271 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.h @@ -0,0 +1,21 @@ +// +// MQTTCoreDataPersistence.h +// MQTTClient +// +// Created by Christoph Krey on 22.03.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import +#import +#import "MQTTPersistence.h" + +@interface MQTTCoreDataPersistence : NSObject + +@end + +@interface MQTTFlow : NSManagedObject +@end + +@interface MQTTCoreDataFlow : NSObject +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m new file mode 100755 index 0000000..93354f9 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTCoreDataPersistence.m @@ -0,0 +1,513 @@ +// +// MQTTCoreDataPersistence.m +// MQTTClient +// +// Created by Christoph Krey on 22.03.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTCoreDataPersistence.h" +#import "MQTTLog.h" + +@implementation MQTTFlow +@dynamic clientId; +@dynamic incomingFlag; +@dynamic retainedFlag; +@dynamic commandType; +@dynamic qosLevel; +@dynamic messageId; +@dynamic topic; +@dynamic data; +@dynamic deadline; + +@end + +@interface MQTTCoreDataFlow () + +- (MQTTCoreDataFlow *)initWithContext:(NSManagedObjectContext *)context andObject:(id)object; +@property NSManagedObjectContext *context; +@property id object; + +@end + +@implementation MQTTCoreDataFlow + +@synthesize context; +@synthesize object; + +- (MQTTCoreDataFlow *)initWithContext:(NSManagedObjectContext *)c andObject:(id)o { + self = [super init]; + self.context = c; + self.object = o; + return self; +} + +- (NSString *)clientId { + __block NSString *_clientId; + [context performBlockAndWait:^{ + _clientId = self.object.clientId; + }]; + return _clientId; +} + +- (void)setClientId:(NSString *)clientId { + [context performBlockAndWait:^{ + self.object.clientId = clientId; + }]; +} + +- (NSNumber *)incomingFlag { + __block NSNumber *_incomingFlag; + [context performBlockAndWait:^{ + _incomingFlag = self.object.incomingFlag; + }]; + return _incomingFlag; +} + +- (void)setIncomingFlag:(NSNumber *)incomingFlag { + [context performBlockAndWait:^{ + self.object.incomingFlag = incomingFlag; + }]; +} + + +- (NSNumber *)retainedFlag { + __block NSNumber *_retainedFlag; + [context performBlockAndWait:^{ + _retainedFlag = self.object.retainedFlag; + }]; + return _retainedFlag; +} + +- (void)setRetainedFlag:(NSNumber *)retainedFlag { + [context performBlockAndWait:^{ + self.object.retainedFlag = retainedFlag; + }]; +} + +- (NSNumber *)commandType { + __block NSNumber *_commandType; + [context performBlockAndWait:^{ + _commandType = self.object.commandType; + }]; + return _commandType; +} + +- (void)setCommandType:(NSNumber *)commandType { + [context performBlockAndWait:^{ + self.object.commandType = commandType; + }]; +} + +- (NSNumber *)qosLevel { + __block NSNumber *_qosLevel; + [context performBlockAndWait:^{ + _qosLevel = self.object.qosLevel; + }]; + return _qosLevel; +} + +- (void)setQosLevel:(NSNumber *)qosLevel { + [context performBlockAndWait:^{ + self.object.qosLevel = qosLevel; + }]; +} + +- (NSNumber *)messageId { + __block NSNumber *_messageId; + [context performBlockAndWait:^{ + _messageId = self.object.messageId; + }]; + return _messageId; +} + +- (void)setMessageId:(NSNumber *)messageId { + [context performBlockAndWait:^{ + self.object.messageId = messageId; + }]; +} + +- (NSString *)topic { + __block NSString *_topic; + [context performBlockAndWait:^{ + _topic = self.object.topic; + }]; + return _topic; +} + +- (void)setTopic:(NSString *)topic { + [context performBlockAndWait:^{ + self.object.topic = topic; + }]; +} + +- (NSData *)data { + __block NSData *_data; + [context performBlockAndWait:^{ + _data = self.object.data; + }]; + return _data; +} + +- (void)setData:(NSData *)data { + [context performBlockAndWait:^{ + self.object.data = data; + }]; +} + +- (NSDate *)deadline { + __block NSDate *_deadline; + [context performBlockAndWait:^{ + _deadline = self.object.deadline; + }]; + return _deadline; +} + +- (void)setDeadline:(NSDate *)deadline { + [context performBlockAndWait:^{ + self.object.deadline = deadline; + }]; +} + +@end + +@interface MQTTCoreDataPersistence () + +@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; +@property (assign, nonatomic) unsigned long long fileSize; +@property (assign, nonatomic) unsigned long long fileSystemFreeSize; + +@end + +@implementation MQTTCoreDataPersistence +@synthesize persistent; +@synthesize maxSize; +@synthesize maxMessages; +@synthesize maxWindowSize; + +- (MQTTCoreDataPersistence *)init { + self = [super init]; + self.persistent = MQTT_PERSISTENT; + self.maxSize = MQTT_MAX_SIZE; + self.maxMessages = MQTT_MAX_MESSAGES; + self.maxWindowSize = MQTT_MAX_WINDOW_SIZE; + + return self; +} + +- (NSManagedObjectContext *)managedObjectContext { + if (!_managedObjectContext) { + NSPersistentStoreCoordinator *coordinator = [self createPersistentStoreCoordinator]; + _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + _managedObjectContext.persistentStoreCoordinator = coordinator; + } + return _managedObjectContext; +} + +- (NSUInteger)windowSize:(NSString *)clientId { + NSUInteger windowSize = 0; + NSArray *flows = [self allFlowsforClientId:clientId + incomingFlag:NO]; + for (MQTTCoreDataFlow *flow in flows) { + if ((flow.commandType).unsignedIntegerValue != MQTT_None) { + windowSize++; + } + } + return windowSize; +} + +- (MQTTCoreDataFlow *)storeMessageForClientId:(NSString *)clientId + topic:(NSString *)topic + data:(NSData *)data + retainFlag:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + msgId:(UInt16)msgId + incomingFlag:(BOOL)incomingFlag + commandType:(UInt8)commandType + deadline:(NSDate *)deadline { + if (([self allFlowsforClientId:clientId incomingFlag:incomingFlag].count <= self.maxMessages) && + (self.fileSize <= self.maxSize)) { + MQTTCoreDataFlow *flow = [self createFlowforClientId:clientId + incomingFlag:incomingFlag + messageId:msgId]; + flow.topic = topic; + flow.data = data; + flow.retainedFlag = @(retainFlag); + flow.qosLevel = @(qos); + flow.commandType = [NSNumber numberWithUnsignedInteger:commandType]; + flow.deadline = deadline; + return flow; + } else { + return nil; + } +} + +- (void)deleteFlow:(MQTTCoreDataFlow *)flow { + [self.managedObjectContext performBlockAndWait:^{ + [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; + }]; + [self sync]; +} + +- (void)deleteAllFlowsForClientId:(NSString *)clientId { + DDLogInfo(@"[MQTTCoreDataPersistence] deleteAllFlowsForClientId %@", clientId); + + [self.managedObjectContext performBlockAndWait:^{ + for (MQTTCoreDataFlow *flow in [self allFlowsforClientId:clientId incomingFlag:TRUE]) { + [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; + } + for (MQTTCoreDataFlow *flow in [self allFlowsforClientId:clientId incomingFlag:FALSE]) { + [self.managedObjectContext deleteObject:(NSManagedObject *)flow.object]; + } + }]; + [self sync]; +} + +- (void)sync { + [self.managedObjectContext performBlockAndWait:^{ + [self internalSync]; + }]; +} + +- (void)internalSync { + if (self.managedObjectContext.hasChanges) { + DDLogVerbose(@"[MQTTPersistence] pre-sync: i%lu u%lu d%lu", + (unsigned long)self.managedObjectContext.insertedObjects.count, + (unsigned long)self.managedObjectContext.updatedObjects.count, + (unsigned long)self.managedObjectContext.deletedObjects.count + ); + NSError *error = nil; + if (![self.managedObjectContext save:&error]) { + DDLogError(@"[MQTTPersistence] sync error %@", error); + } + if (self.managedObjectContext.hasChanges) { + DDLogError(@"[MQTTPersistence] sync not complete"); + } + DDLogVerbose(@"[MQTTPersistence] postsync: i%lu u%lu d%lu", + (unsigned long)self.managedObjectContext.insertedObjects.count, + (unsigned long)self.managedObjectContext.updatedObjects.count, + (unsigned long)self.managedObjectContext.deletedObjects.count + ); + [self sizes]; + } +} + +- (NSArray *)allFlowsforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag { + NSMutableArray *flows = [NSMutableArray array]; + __block NSArray *rows; + [self.managedObjectContext performBlockAndWait:^{ + + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MQTTFlow"]; + fetchRequest.predicate = [NSPredicate predicateWithFormat: + @"clientId = %@ and incomingFlag = %@", + clientId, + @(incomingFlag) + ]; + fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"deadline" ascending:YES]]; + NSError *error = nil; + rows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (!rows) { + DDLogError(@"[MQTTPersistence] allFlowsforClientId %@", error); + } + }]; + for (idrow in rows) { + [flows addObject:[[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:row]]; + } + return flows; +} + +- (MQTTCoreDataFlow *)flowforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId { + __block MQTTCoreDataFlow *flow = nil; + + DDLogVerbose(@"flowforClientId requestingPerform"); + [self.managedObjectContext performBlockAndWait:^{ + flow = [self internalFlowForClientId:clientId + incomingFlag:incomingFlag + messageId:messageId]; + }]; + DDLogVerbose(@"flowforClientId performed"); + return flow; +} + +- (MQTTCoreDataFlow *)internalFlowForClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId { + MQTTCoreDataFlow *flow = nil; + + DDLogVerbose(@"flowforClientId performing"); + + NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MQTTFlow"]; + fetchRequest.predicate = [NSPredicate predicateWithFormat: + @"clientId = %@ and incomingFlag = %@ and messageId = %@", + clientId, + @(incomingFlag), + @(messageId) + ]; + NSArray *rows; + NSError *error = nil; + rows = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; + if (!rows) { + DDLogError(@"[MQTTPersistence] flowForClientId %@", error); + } else { + if (rows.count) { + flow = [[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:rows.lastObject]; + } + } + return flow; +} + +- (MQTTCoreDataFlow *)createFlowforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId { + MQTTCoreDataFlow *flow = (MQTTCoreDataFlow *)[self flowforClientId:clientId + incomingFlag:incomingFlag + messageId:messageId]; + if (!flow) { + __block id row; + [self.managedObjectContext performBlockAndWait:^{ + row = [NSEntityDescription insertNewObjectForEntityForName:@"MQTTFlow" + inManagedObjectContext:self.managedObjectContext]; + + row.clientId = clientId; + row.incomingFlag = @(incomingFlag); + row.messageId = @(messageId); + }]; + flow = [[MQTTCoreDataFlow alloc] initWithContext:self.managedObjectContext andObject:row]; + } + + return flow; +} + +#pragma mark - Core Data stack + +- (NSManagedObjectModel *)createManagedObjectModel { + NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] init]; + NSMutableArray *entities = [[NSMutableArray alloc] init]; + NSMutableArray *properties = [[NSMutableArray alloc] init]; + + NSAttributeDescription *attributeDescription; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"clientId"; + attributeDescription.attributeType = NSStringAttributeType; + attributeDescription.attributeValueClassName = @"NSString"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"incomingFlag"; + attributeDescription.attributeType = NSBooleanAttributeType; + attributeDescription.attributeValueClassName = @"NSNumber"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"retainedFlag"; + attributeDescription.attributeType = NSBooleanAttributeType; + attributeDescription.attributeValueClassName = @"NSNumber"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"commandType"; + attributeDescription.attributeType = NSInteger16AttributeType; + attributeDescription.attributeValueClassName = @"NSNumber"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"qosLevel"; + attributeDescription.attributeType = NSInteger16AttributeType; + attributeDescription.attributeValueClassName = @"NSNumber"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"messageId"; + attributeDescription.attributeType = NSInteger32AttributeType; + attributeDescription.attributeValueClassName = @"NSNumber"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"topic"; + attributeDescription.attributeType = NSStringAttributeType; + attributeDescription.attributeValueClassName = @"NSString"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"data"; + attributeDescription.attributeType = NSBinaryDataAttributeType; + attributeDescription.attributeValueClassName = @"NSData"; + [properties addObject:attributeDescription]; + + attributeDescription = [[NSAttributeDescription alloc] init]; + attributeDescription.name = @"deadline"; + attributeDescription.attributeType = NSDateAttributeType; + attributeDescription.attributeValueClassName = @"NSDate"; + [properties addObject:attributeDescription]; + + NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init]; + entityDescription.name = @"MQTTFlow"; + entityDescription.managedObjectClassName = @"MQTTFlow"; + entityDescription.abstract = FALSE; + entityDescription.properties = properties; + + [entities addObject:entityDescription]; + managedObjectModel.entities = entities; + + return managedObjectModel; +} + +- (NSPersistentStoreCoordinator *)createPersistentStoreCoordinator { + NSURL *persistentStoreURL = [[self applicationDocumentsDirectory] + URLByAppendingPathComponent:@"MQTTClient"]; + DDLogInfo(@"[MQTTPersistence] Persistent store: %@", persistentStoreURL.path); + + + NSError *error = nil; + NSManagedObjectModel *model = [self createManagedObjectModel]; + NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] + initWithManagedObjectModel:model]; + NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @YES, + NSInferMappingModelAutomaticallyOption: @YES, + NSSQLiteAnalyzeOption: @YES, + NSSQLiteManualVacuumOption: @YES + }; + + if (![persistentStoreCoordinator addPersistentStoreWithType:self.persistent ? NSSQLiteStoreType : NSInMemoryStoreType + configuration:nil + URL:self.persistent ? persistentStoreURL : nil + options:options + error:&error]) { + DDLogError(@"[MQTTPersistence] managedObjectContext save: %@", error); + persistentStoreCoordinator = nil; + } + return persistentStoreCoordinator; +} + +#pragma mark - Application's Documents directory + +- (NSURL *)applicationDocumentsDirectory +{ + return [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; +} + +- (void)sizes { + if (self.persistent) { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = paths[0]; + NSString *persistentStorePath = [documentsDirectory stringByAppendingPathComponent:@"MQTTClient"]; + + NSError *error = nil; + NSDictionary *fileAttributes = [[NSFileManager defaultManager] + attributesOfItemAtPath:persistentStorePath error:&error]; + NSDictionary *fileSystemAttributes = [[NSFileManager defaultManager] + attributesOfFileSystemForPath:persistentStorePath + error:&error]; + self.fileSize = [fileAttributes[NSFileSize] unsignedLongLongValue]; + self.fileSystemFreeSize = [fileSystemAttributes[NSFileSystemFreeSize] unsignedLongLongValue]; + } else { + self.fileSize = 0; + self.fileSystemFreeSize = 0; + } + DDLogVerbose(@"[MQTTPersistence] sizes %llu/%llu", self.fileSize, self.fileSystemFreeSize); +} +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h new file mode 100644 index 0000000..d943450 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.h @@ -0,0 +1,66 @@ +// +// MQTTDecoder.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// +// based on +// +// Copyright (c) 2011, 2013, 2lemetry LLC +// +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// Contributors: +// Kyle Roche - initial API and implementation and/or initial documentation +// + +#import +#import "MQTTMessage.h" + +typedef NS_ENUM(unsigned int, MQTTDecoderEvent) { + MQTTDecoderEventProtocolError, + MQTTDecoderEventConnectionClosed, + MQTTDecoderEventConnectionError +}; + +typedef NS_ENUM(unsigned int, MQTTDecoderState) { + MQTTDecoderStateInitializing, + MQTTDecoderStateDecodingHeader, + MQTTDecoderStateDecodingLength, + MQTTDecoderStateDecodingData, + MQTTDecoderStateConnectionClosed, + MQTTDecoderStateConnectionError, + MQTTDecoderStateProtocolError +}; + +@class MQTTDecoder; + +@protocol MQTTDecoderDelegate + +- (void)decoder:(MQTTDecoder *)sender didReceiveMessage:(NSData *)data; +- (void)decoder:(MQTTDecoder *)sender handleEvent:(MQTTDecoderEvent)eventCode error:(NSError *)error; + +@end + + +@interface MQTTDecoder: NSObject + +@property (nonatomic) MQTTDecoderState state; +@property (strong, nonatomic) dispatch_queue_t queue; +@property (nonatomic) UInt32 length; +@property (nonatomic) UInt32 lengthMultiplier; +@property (nonatomic) int offset; +@property (strong, nonatomic) NSMutableData *dataBuffer; + +@property (weak, nonatomic) id delegate; + +- (void)open; +- (void)close; +- (void)decodeMessage:(NSData *)data; + +@end + + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m new file mode 100644 index 0000000..224cd65 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTDecoder.m @@ -0,0 +1,215 @@ +// +// MQTTDecoder.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import "MQTTDecoder.h" + +#import "MQTTLog.h" + +@interface MQTTDecoder() { + void *QueueIdentityKey; +} + +@property (nonatomic) NSMutableArray *streams; + +@end + +@implementation MQTTDecoder + +- (instancetype)init { + self = [super init]; + self.state = MQTTDecoderStateInitializing; + self.streams = [NSMutableArray arrayWithCapacity:5]; + self.queue = dispatch_get_main_queue(); + return self; +} + +- (void)dealloc { + [self close]; +} + +- (void)setQueue:(dispatch_queue_t)queue { + _queue = queue; + + // We're going to use dispatch_queue_set_specific() to "mark" our queue. + // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. + // Later we can use dispatch_get_specific() to determine if we're executing on our queue. + // From the documentation: + // + // > Keys are only compared as pointers and are never dereferenced. + // > Thus, you can use a pointer to a static variable for a specific subsystem or + // > any other value that allows you to identify the value uniquely. + // + // So we're just going to use the memory address of an ivar. + + dispatch_queue_set_specific(_queue, &QueueIdentityKey, (__bridge void *)_queue, NULL); +} + +- (void)decodeMessage:(NSData *)data { + NSInputStream *stream = [NSInputStream inputStreamWithData:data]; + CFReadStreamRef readStream = (__bridge CFReadStreamRef)stream; + CFReadStreamSetDispatchQueue(readStream, self.queue); + [self openStream:stream]; +} + +- (void)openStream:(NSInputStream *)stream { + [self.streams addObject:stream]; + stream.delegate = self; + DDLogVerbose(@"[MQTTDecoder] #streams=%lu", (unsigned long)self.streams.count); + if (self.streams.count == 1) { + [stream open]; + } +} + +- (void)open { + self.state = MQTTDecoderStateDecodingHeader; +} + +- (void)internalClose { + if (self.streams) { + for (NSInputStream *stream in self.streams) { + [stream close]; + [stream setDelegate:nil]; + } + [self.streams removeAllObjects]; + } +} + +- (void)close { + // https://github.com/novastone-media/MQTT-Client-Framework/issues/325 + // We need to make sure that we are closing streams on their queue + // Otherwise, we end up with race condition where delegate is deallocated + // but still used by run loop event + if (self.queue != dispatch_get_specific(&QueueIdentityKey)) { + dispatch_sync(self.queue, ^{ + [self internalClose]; + }); + } else { + [self internalClose]; + } +} + +- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { + // We contact our delegate, MQTTSession at some point in this method + // This call can cause MQTTSession to dealloc and thus, MQTTDecoder to dealloc + // So we end up with invalid object in the middle of the method + // To prevent this we retain self for duration of this method call + MQTTDecoder *strongDecoder = self; + (void)strongDecoder; + + NSInputStream *stream = (NSInputStream *)sender; + + if (eventCode & NSStreamEventOpenCompleted) { + DDLogVerbose(@"[MQTTDecoder] NSStreamEventOpenCompleted"); + } + + if (eventCode & NSStreamEventHasBytesAvailable) { + DDLogVerbose(@"[MQTTDecoder] NSStreamEventHasBytesAvailable"); + + if (self.state == MQTTDecoderStateDecodingHeader) { + UInt8 buffer; + NSInteger n = [stream read:&buffer maxLength:1]; + if (n == -1) { + self.state = MQTTDecoderStateConnectionError; + [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; + } else if (n == 1) { + self.length = 0; + self.lengthMultiplier = 1; + self.state = MQTTDecoderStateDecodingLength; + self.dataBuffer = [[NSMutableData alloc] init]; + [self.dataBuffer appendBytes:&buffer length:1]; + self.offset = 1; + DDLogVerbose(@"[MQTTDecoder] fixedHeader=0x%02x", buffer); + } + } + while (self.state == MQTTDecoderStateDecodingLength) { + // TODO: check max packet length(prevent evil server response) + UInt8 digit; + NSInteger n = [stream read:&digit maxLength:1]; + if (n == -1) { + self.state = MQTTDecoderStateConnectionError; + [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; + break; + } else if (n == 0) { + break; + } + DDLogVerbose(@"[MQTTDecoder] digit=0x%02x 0x%02x %d %d", digit, digit & 0x7f, (unsigned int)self.length, (unsigned int)self.lengthMultiplier); + [self.dataBuffer appendBytes:&digit length:1]; + self.offset++; + self.length += ((digit & 0x7f) * self.lengthMultiplier); + if ((digit & 0x80) == 0x00) { + self.state = MQTTDecoderStateDecodingData; + } else { + self.lengthMultiplier *= 128; + } + } + DDLogVerbose(@"[MQTTDecoder] remainingLength=%d", (unsigned int)self.length); + + if (self.state == MQTTDecoderStateDecodingData) { + if (self.length > 0) { + NSInteger n, toRead; + UInt8 buffer[768]; + toRead = self.length + self.offset - self.dataBuffer.length; + if (toRead > sizeof buffer) { + toRead = sizeof buffer; + } + n = [stream read:buffer maxLength:toRead]; + if (n == -1) { + self.state = MQTTDecoderStateConnectionError; + [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:stream.streamError]; + } else { + DDLogVerbose(@"[MQTTDecoder] read %ld %ld", (long)toRead, (long)n); + [self.dataBuffer appendBytes:buffer length:n]; + } + } + if (self.dataBuffer.length == self.length + self.offset) { + DDLogVerbose(@"[MQTTDecoder] received (%lu)=%@...", (unsigned long)self.dataBuffer.length, + [self.dataBuffer subdataWithRange:NSMakeRange(0, MIN(256, self.dataBuffer.length))]); + [self.delegate decoder:self didReceiveMessage:self.dataBuffer]; + self.dataBuffer = nil; + self.state = MQTTDecoderStateDecodingHeader; + } else { + DDLogWarn(@"[MQTTDecoder] oops received (%lu)=%@...", (unsigned long)self.dataBuffer.length, + [self.dataBuffer subdataWithRange:NSMakeRange(0, MIN(256, self.dataBuffer.length))]); + } + } + } + + if (eventCode & NSStreamEventHasSpaceAvailable) { + DDLogVerbose(@"[MQTTDecoder] NSStreamEventHasSpaceAvailable"); + } + + if (eventCode & NSStreamEventEndEncountered) { + DDLogVerbose(@"[MQTTDecoder] NSStreamEventEndEncountered"); + + if (self.streams) { + [stream setDelegate:nil]; + [stream close]; + [self.streams removeObject:stream]; + if (self.streams.count) { + NSInputStream *stream = (self.streams)[0]; + [stream open]; + } + } + } + + if (eventCode & NSStreamEventErrorOccurred) { + DDLogVerbose(@"[MQTTDecoder] NSStreamEventErrorOccurred"); + + self.state = MQTTDecoderStateConnectionError; + NSError *error = stream.streamError; + if (self.streams) { + [self.streams removeObject:stream]; + if (self.streams.count) { + NSInputStream *stream = (self.streams)[0]; + [stream open]; + } + } + [self.delegate decoder:self handleEvent:MQTTDecoderEventConnectionError error:error]; + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h new file mode 100644 index 0000000..c1374a7 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.h @@ -0,0 +1,16 @@ +// +// MQTTInMemoryPersistence.h +// MQTTClient +// +// Created by Christoph Krey on 22.03.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import +#import "MQTTPersistence.h" + +@interface MQTTInMemoryPersistence : NSObject +@end + +@interface MQTTInMemoryFlow : NSObject +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m new file mode 100755 index 0000000..ec95f1e --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTInMemoryPersistence.m @@ -0,0 +1,180 @@ +// +// MQTTInMemoryPersistence.m +// MQTTClient +// +// Created by Christoph Krey on 22.03.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTInMemoryPersistence.h" + +#import "MQTTLog.h" + +@implementation MQTTInMemoryFlow +@synthesize clientId; +@synthesize incomingFlag; +@synthesize retainedFlag; +@synthesize commandType; +@synthesize qosLevel; +@synthesize messageId; +@synthesize topic; +@synthesize data; +@synthesize deadline; + +@end + +@interface MQTTInMemoryPersistence() +@end + +static NSMutableDictionary *clientIds; + +@implementation MQTTInMemoryPersistence +@synthesize maxSize; +@synthesize persistent; +@synthesize maxMessages; +@synthesize maxWindowSize; + +- (MQTTInMemoryPersistence *)init { + self = [super init]; + self.maxMessages = MQTT_MAX_MESSAGES; + self.maxWindowSize = MQTT_MAX_WINDOW_SIZE; + @synchronized(clientIds) { + if (!clientIds) { + clientIds = [[NSMutableDictionary alloc] init]; + } + } + return self; +} + +- (NSUInteger)windowSize:(NSString *)clientId { + NSUInteger windowSize = 0; + NSArray *flows = [self allFlowsforClientId:clientId + incomingFlag:NO]; + for (MQTTInMemoryFlow *flow in flows) { + if ((flow.commandType).intValue != MQTT_None) { + windowSize++; + } + } + return windowSize; +} + +- (MQTTInMemoryFlow *)storeMessageForClientId:(NSString *)clientId + topic:(NSString *)topic + data:(NSData *)data + retainFlag:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + msgId:(UInt16)msgId + incomingFlag:(BOOL)incomingFlag + commandType:(UInt8)commandType + deadline:(NSDate *)deadline { + @synchronized(clientIds) { + + if (([self allFlowsforClientId:clientId incomingFlag:incomingFlag].count <= self.maxMessages)) { + MQTTInMemoryFlow *flow = (MQTTInMemoryFlow *)[self createFlowforClientId:clientId + incomingFlag:incomingFlag + messageId:msgId]; + flow.topic = topic; + flow.data = data; + flow.retainedFlag = @(retainFlag); + flow.qosLevel = @(qos); + flow.commandType = [NSNumber numberWithUnsignedInteger:commandType]; + flow.deadline = deadline; + return flow; + } else { + return nil; + } + } +} + +- (void)deleteFlow:(MQTTInMemoryFlow *)flow { + @synchronized(clientIds) { + + NSMutableDictionary *clientIdFlows = clientIds[flow.clientId]; + if (clientIdFlows) { + NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[flow.incomingFlag]; + if (clientIdDirectedFlow) { + [clientIdDirectedFlow removeObjectForKey:flow.messageId]; + } + } + } +} + +- (void)deleteAllFlowsForClientId:(NSString *)clientId { + @synchronized(clientIds) { + + DDLogInfo(@"[MQTTInMemoryPersistence] deleteAllFlowsForClientId %@", clientId); + [clientIds removeObjectForKey:clientId]; + } +} + +- (void)sync { + // +} + +- (NSArray *)allFlowsforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag { + @synchronized(clientIds) { + + NSMutableArray *flows = nil; + NSMutableDictionary *clientIdFlows = clientIds[clientId]; + if (clientIdFlows) { + NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; + if (clientIdDirectedFlow) { + flows = [NSMutableArray array]; + NSArray *keys = [clientIdDirectedFlow.allKeys sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]]; + for (id key in keys) { + [flows addObject:clientIdDirectedFlow[key]]; + } + } + } + return flows; + } +} + +- (MQTTInMemoryFlow *)flowforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId { + @synchronized(clientIds) { + + MQTTInMemoryFlow *flow = nil; + + NSMutableDictionary *clientIdFlows = clientIds[clientId]; + if (clientIdFlows) { + NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; + if (clientIdDirectedFlow) { + flow = clientIdDirectedFlow[[NSNumber numberWithUnsignedInteger:messageId]]; + } + } + + return flow; + } +} + +- (MQTTInMemoryFlow *)createFlowforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId { + @synchronized(clientIds) { + NSMutableDictionary *clientIdFlows = clientIds[clientId]; + if (!clientIdFlows) { + clientIdFlows = [[NSMutableDictionary alloc] init]; + clientIds[clientId] = clientIdFlows; + } + + NSMutableDictionary *clientIdDirectedFlow = clientIdFlows[@(incomingFlag)]; + if (!clientIdDirectedFlow) { + clientIdDirectedFlow = [[NSMutableDictionary alloc] init]; + clientIdFlows[@(incomingFlag)] = clientIdDirectedFlow; + } + + MQTTInMemoryFlow *flow = [[MQTTInMemoryFlow alloc] init]; + flow.clientId = clientId; + flow.incomingFlag = @(incomingFlag); + flow.messageId = [NSNumber numberWithUnsignedInteger:messageId]; + + clientIdDirectedFlow[[NSNumber numberWithUnsignedInteger:messageId]] = flow; + + return flow; + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h new file mode 100644 index 0000000..0f6f042 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.h @@ -0,0 +1,123 @@ +// +// MQTTLog.h +// MQTTClient +// +// Created by Christoph Krey on 10.02.16. +// Copyright © 2016-2017 Christoph Krey. All rights reserved. +// + +@import Foundation; + +#ifdef LUMBERJACK + +#define LOG_LEVEL_DEF ddLogLevel +#import + +#else /* LUMBERJACK */ + +typedef NS_OPTIONS(NSUInteger, DDLogFlag){ + /** + * 0...00001 DDLogFlagError + */ + DDLogFlagError = (1 << 0), + + /** + * 0...00010 DDLogFlagWarning + */ + DDLogFlagWarning = (1 << 1), + + /** + * 0...00100 DDLogFlagInfo + */ + DDLogFlagInfo = (1 << 2), + + /** + * 0...01000 DDLogFlagDebug + */ + DDLogFlagDebug = (1 << 3), + + /** + * 0...10000 DDLogFlagVerbose + */ + DDLogFlagVerbose = (1 << 4) +}; + + +typedef NS_ENUM(NSUInteger, DDLogLevel){ +DDLogLevelOff = 0, + +/** + * Error logs only + */ +DDLogLevelError = (DDLogFlagError), + +/** + * Error and warning logs + */ +DDLogLevelWarning = (DDLogLevelError | DDLogFlagWarning), + +/** + * Error, warning and info logs + */ +DDLogLevelInfo = (DDLogLevelWarning | DDLogFlagInfo), + +/** + * Error, warning, info and debug logs + */ +DDLogLevelDebug = (DDLogLevelInfo | DDLogFlagDebug), + +/** + * Error, warning, info, debug and verbose logs + */ +DDLogLevelVerbose = (DDLogLevelDebug | DDLogFlagVerbose), + +/** + * All logs (1...11111) + */ +DDLogLevelAll = NSUIntegerMax +}; + +#ifdef DEBUG + +#define DDLogVerbose if (ddLogLevel & DDLogFlagVerbose) NSLog +#define DDLogDebug if (ddLogLevel & DDLogFlagDebug) NSLog +#define DDLogWarn if (ddLogLevel & DDLogFlagWarning) NSLog +#define DDLogInfo if (ddLogLevel & DDLogFlagInfo) NSLog +#define DDLogError if (ddLogLevel & DDLogFlagError) NSLog + +#else + +#define DDLogVerbose(...) +#define DDLogDebug(...) +#define DDLogWarn(...) +#define DDLogInfo(...) +#define DDLogError(...) + +#endif /* DEBUG */ +#endif /* LUMBERJACK */ + +extern DDLogLevel ddLogLevel; + +/** MQTTLog lets you define the log level for MQTTClient + * independently of using CocoaLumberjack + */ +@interface MQTTLog: NSObject + +/** setLogLevel controls the log level for MQTTClient + * @param logLevel as follows: + * + * default for DEBUG builds is DDLogLevelVerbose + * default for RELEASE builds is DDLogLevelWarning + * + * Available log levels: + * DDLogLevelAll + * DDLogLevelVerbose + * DDLogLevelDebug + * DDLogLevelInfo + * DDLogLevelWarning + * DDLogLevelError + * DDLogLevelOff + */ ++ (void)setLogLevel:(DDLogLevel)logLevel; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m new file mode 100644 index 0000000..cc1c878 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTLog.m @@ -0,0 +1,27 @@ +// +// MQTTLog.m +// MQTTClient +// +// Created by Josip Cavar on 06/07/2017. +// +// + +#import "MQTTLog.h" + +@implementation MQTTLog + +#ifdef DEBUG + +DDLogLevel ddLogLevel = DDLogLevelVerbose; + +#else + +DDLogLevel ddLogLevel = DDLogLevelWarning; + +#endif + ++ (void)setLogLevel:(DDLogLevel)logLevel { + ddLogLevel = logLevel; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h new file mode 100644 index 0000000..e065355 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.h @@ -0,0 +1,233 @@ +// +// MQTTMessage.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// +// based on +// +// Copyright (c) 2011, 2013, 2lemetry LLC +// +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// Contributors: +// Kyle Roche - initial API and implementation and/or initial documentation +// + +#import +@class MQTTProperties; + +/** + Enumeration of MQTT Quality of Service levels + */ +typedef NS_ENUM(UInt8, MQTTQosLevel) { + MQTTQosLevelAtMostOnce = 0, + MQTTQosLevelAtLeastOnce = 1, + MQTTQosLevelExactlyOnce = 2 +}; + +/** + Enumeration of MQTT protocol version + */ +typedef NS_ENUM(UInt8, MQTTProtocolVersion) { + MQTTProtocolVersion0 = 0, + MQTTProtocolVersion31 = 3, + MQTTProtocolVersion311 = 4, + MQTTProtocolVersion50 = 5 +}; + +typedef NS_ENUM(UInt8, MQTTCommandType) { + MQTT_None = 0, + MQTTConnect = 1, + MQTTConnack = 2, + MQTTPublish = 3, + MQTTPuback = 4, + MQTTPubrec = 5, + MQTTPubrel = 6, + MQTTPubcomp = 7, + MQTTSubscribe = 8, + MQTTSuback = 9, + MQTTUnsubscribe = 10, + MQTTUnsuback = 11, + MQTTPingreq = 12, + MQTTPingresp = 13, + MQTTDisconnect = 14, + MQTTAuth = 15 +}; + +@interface MQTTMessage : NSObject + +@property (nonatomic) MQTTCommandType type; +@property (nonatomic) MQTTQosLevel qos; +@property (nonatomic) BOOL retainFlag; +@property (nonatomic) BOOL dupFlag; +@property (nonatomic) UInt16 mid; +@property (strong, nonatomic) NSData *data; +@property (strong, nonatomic) NSNumber *returnCode; +@property (strong, nonatomic) NSNumber *connectAcknowledgeFlags; +@property (strong, nonatomic) MQTTProperties *properties; + +/** + Enumeration of MQTT return codes + */ + +typedef NS_ENUM(NSUInteger, MQTTReturnCode) { + MQTTAccepted = 0, + MQTTRefusedUnacceptableProtocolVersion = 1, + MQTTRefusedIdentiferRejected = 2, + MQTTRefusedServerUnavailable = 3, + MQTTRefusedBadUserNameOrPassword = 4, + MQTTRefusedNotAuthorized = 5, + + MQTTSuccess = 0, + MQTTDisconnectWithWillMessage = 4, + MQTTNoSubscriptionExisted = 17, + MQTTContinueAuthentication = 24, + MQTTReAuthenticate = 25, + MQTTUnspecifiedError = 128, + MQTTMalformedPacket = 129, + MQTTProtocolError = 130, + MQTTImplementationSpecificError = 131, + MQTTUnsupportedProtocolVersion = 132, + MQTTClientIdentifierNotValid = 133, + MQTTBadUserNameOrPassword = 134, + MQTTNotAuthorized = 135, + MQTTServerUnavailable = 136, + MQTTServerBusy = 137, + MQTTBanned = 138, + MQTTServerShuttingDown = 139, + MQTTBadAuthenticationMethod = 140, + MQTTKeepAliveTimeout = 141, + MQTTSessionTakenOver = 142, + MQTTTopicFilterInvalid = 143, + MQTTTopicNameInvalid = 144, + MQTTPacketIdentifierInUse = 145, + MQTTPacketIdentifierNotFound = 146, + MQTTReceiveMaximumExceeded = 147, + MQTTPacketTooLarge = 149, + MQTTMessageRateTooHigh = 150, + MQTTQuotaExceeded = 151, + MQTTAdministrativeAction = 152, + MQTTPayloadFormatInvalid = 153, + MQTTRetainNotSupported = 154, + MQTTQoSNotSupported = 155, + MQTTUseAnotherServer = 156, + MQTTServerMoved = 157, + MQTTSharedSubscriptionNotSupported = 158, + MQTTConnectionRateExceeded = 159, + MQTTSubscriptionIdentifiersNotSupported = 161, + MQTTWildcardSubscriptionNotSupported = 162 +}; + +// factory methods ++ (MQTTMessage *)connectMessageWithClientId:(NSString*)clientId + userName:(NSString*)userName + password:(NSString*)password + keepAlive:(NSInteger)keeplive + cleanSession:(BOOL)cleanSessionFlag + will:(BOOL)will + willTopic:(NSString*)willTopic + willMsg:(NSData*)willData + willQoS:(MQTTQosLevel)willQoS + willRetain:(BOOL)willRetainFlag + protocolLevel:(MQTTProtocolVersion)protocolLevel + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + authMethod:(NSString *)authMethod + authData:(NSData *)authData + requestProblemInformation:(NSNumber *)requestProblemInformation + willDelayInterval:(NSNumber *)willDelayInterval + requestResponseInformation:(NSNumber *)requestResponseInformation + receiveMaximum:(NSNumber *)receiveMaximum + topicAliasMaximum:(NSNumber *)topicAliasMaximum + userProperty:(NSDictionary *)userProperty + maximumPacketSize:(NSNumber *)maximumPacketSize +; + ++ (MQTTMessage *)pingreqMessage; + ++ (MQTTMessage *)disconnectMessage:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + ++ (MQTTMessage *)subscribeMessageWithMessageId:(UInt16)msgId + topics:(NSDictionary *)topics + protocolLevel:(MQTTProtocolVersion)protocolLevel + subscriptionIdentifier:(NSNumber *)subscriptionIdentifier; + ++ (MQTTMessage *)unsubscribeMessageWithMessageId:(UInt16)msgId + topics:(NSArray *)topics + protocolLevel:(MQTTProtocolVersion)protocolLevel; + ++ (MQTTMessage *)publishMessageWithData:(NSData*)payload + onTopic:(NSString*)topic + qos:(MQTTQosLevel)qosLevel + msgId:(UInt16)msgId + retainFlag:(BOOL)retain + dupFlag:(BOOL)dup + protocolLevel:(MQTTProtocolVersion)protocolLevel + payloadFormatIndicator:(NSNumber *)payloadFormatIndicator + publicationExpiryInterval:(NSNumber *)publicationExpiryInterval + topicAlias:(NSNumber *)topicAlias + responseTopic:(NSString *)responseTopic + correlationData:(NSData *)correlationData + userProperty:(NSDictionary *)userProperty + contentType:(NSString *)contentType; + ++ (MQTTMessage *)pubackMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + ++ (MQTTMessage *)pubrecMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + ++ (MQTTMessage *)pubrelMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + ++ (MQTTMessage *)pubcompMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + ++ (MQTTMessage *)messageFromData:(NSData *)data protocolLevel:(MQTTProtocolVersion)protocolLevel; + +// instance methods +- (instancetype)initWithType:(MQTTCommandType)type; +- (instancetype)initWithType:(MQTTCommandType)type + data:(NSData *)data; +- (instancetype)initWithType:(MQTTCommandType)type + qos:(MQTTQosLevel)qos + data:(NSData *)data; +- (instancetype)initWithType:(MQTTCommandType)type + qos:(MQTTQosLevel)qos + retainFlag:(BOOL)retainFlag + dupFlag:(BOOL)dupFlag + data:(NSData *)data; + +@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSData *wireFormat; + + +@end + +@interface NSMutableData (MQTT) +- (void)appendByte:(UInt8)byte; +- (void)appendUInt16BigEndian:(UInt16)val; +- (void)appendUInt32BigEndian:(UInt32)val; +- (void)appendVariableLength:(unsigned long)length; +- (void)appendMQTTString:(NSString *)string; +- (void)appendBinaryData:(NSData *)data; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m new file mode 100644 index 0000000..a1c321f --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTMessage.m @@ -0,0 +1,762 @@ +// +// MQTTMessage.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// +// based on +// +// Copyright (c) 2011, 2013, 2lemetry LLC +// +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// Contributors: +// Kyle Roche - initial API and implementation and/or initial documentation +// + +#import "MQTTMessage.h" +#import "MQTTProperties.h" + +#import "MQTTLog.h" + +@implementation MQTTMessage + ++ (MQTTMessage *)connectMessageWithClientId:(NSString *)clientId + userName:(NSString *)userName + password:(NSString *)password + keepAlive:(NSInteger)keepAlive + cleanSession:(BOOL)cleanSessionFlag + will:(BOOL)will + willTopic:(NSString *)willTopic + willMsg:(NSData *)willMsg + willQoS:(MQTTQosLevel)willQoS + willRetain:(BOOL)willRetainFlag + protocolLevel:(MQTTProtocolVersion)protocolLevel + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + authMethod:(NSString *)authMethod + authData:(NSData *)authData + requestProblemInformation:(NSNumber *)requestProblemInformation + willDelayInterval:(NSNumber *)willDelayInterval + requestResponseInformation:(NSNumber *)requestResponseInformation + receiveMaximum:(NSNumber *)receiveMaximum + topicAliasMaximum:(NSNumber *)topicAliasMaximum + userProperty:(NSDictionary *)userProperty + maximumPacketSize:(NSNumber *)maximumPacketSize { + /* + * setup flags w/o basic plausibility checks + * + */ + UInt8 flags = 0x00; + + if (cleanSessionFlag) { + flags |= 0x02; + } + + if (userName) { + flags |= 0x80; + } + if (password) { + flags |= 0x40; + } + + if (will) { + flags |= 0x04; + } + + flags |= ((willQoS & 0x03) << 3); + + if (willRetainFlag) { + flags |= 0x20; + } + + NSMutableData* data = [NSMutableData data]; + + switch (protocolLevel) { + case MQTTProtocolVersion50: + [data appendMQTTString:@"MQTT"]; + [data appendByte:MQTTProtocolVersion50]; + break; + + case MQTTProtocolVersion311: + [data appendMQTTString:@"MQTT"]; + [data appendByte:MQTTProtocolVersion311]; + break; + + case MQTTProtocolVersion31: + [data appendMQTTString:@"MQIsdp"]; + [data appendByte:MQTTProtocolVersion31]; + break; + + case MQTTProtocolVersion0: + [data appendMQTTString:@""]; + [data appendByte:protocolLevel]; + break; + + default: + [data appendMQTTString:@"MQTT"]; + [data appendByte:protocolLevel]; + break; + } + [data appendByte:flags]; + [data appendUInt16BigEndian:keepAlive]; + + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (sessionExpiryInterval) { + [properties appendByte:MQTTSessionExpiryInterval]; + [properties appendUInt32BigEndian:sessionExpiryInterval.unsignedIntValue]; + } + if (authMethod) { + [properties appendByte:MQTTAuthMethod]; + [properties appendMQTTString:authMethod]; + } + if (authData) { + [properties appendByte:MQTTAuthData]; + [properties appendBinaryData:authData]; + } + if (requestProblemInformation) { + [properties appendByte:MQTTRequestProblemInformation]; + [properties appendByte:requestProblemInformation.unsignedIntValue]; + } + if (willDelayInterval) { + [properties appendByte:MQTTWillDelayInterval]; + [properties appendUInt32BigEndian:willDelayInterval.unsignedIntValue]; + } + if (requestResponseInformation) { + [properties appendByte:MQTTRequestResponseInformation]; + [properties appendByte:requestResponseInformation.unsignedIntValue]; + } + if (receiveMaximum) { + [properties appendByte:MQTTReceiveMaximum]; + [properties appendUInt16BigEndian:receiveMaximum.unsignedIntValue]; + } + if (topicAliasMaximum) { + [properties appendByte:MQTTTopicAliasMaximum]; + [properties appendUInt16BigEndian:topicAliasMaximum.unsignedIntValue]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + if (maximumPacketSize) { + [properties appendByte:MQTTMaximumPacketSize]; + [properties appendUInt32BigEndian:maximumPacketSize.unsignedIntValue]; + } + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + + [data appendMQTTString:clientId]; + if (willTopic) { + [data appendMQTTString:willTopic]; + } + if (willMsg) { + [data appendUInt16BigEndian:willMsg.length]; + [data appendData:willMsg]; + } + if (userName) { + [data appendMQTTString:userName]; + } + if (password) { + [data appendMQTTString:password]; + } + + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTConnect + data:data]; + return msg; +} + ++ (MQTTMessage *)pingreqMessage { + return [[MQTTMessage alloc] initWithType:MQTTPingreq]; +} + ++ (MQTTMessage *)disconnectMessage:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + NSMutableData* data = [NSMutableData data]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (sessionExpiryInterval) { + [properties appendByte:MQTTSessionExpiryInterval]; + [properties appendUInt32BigEndian:sessionExpiryInterval.unsignedIntValue]; + } + if (reasonString) { + [properties appendByte:MQTTReasonString]; + [properties appendMQTTString:reasonString]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + if (returnCode != MQTTSuccess || properties.length > 0) { + [data appendByte:returnCode]; + } + if (properties.length > 0) { + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + } + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTDisconnect + data:data]; + return msg; +} + ++ (MQTTMessage *)subscribeMessageWithMessageId:(UInt16)msgId + topics:(NSDictionary *)topics + protocolLevel:(MQTTProtocolVersion)protocolLevel + subscriptionIdentifier:(NSNumber *)subscriptionIdentifier { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (subscriptionIdentifier) { + [properties appendByte:MQTTSubscriptionIdentifier]; + [properties appendVariableLength:subscriptionIdentifier.unsignedLongValue]; + } + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + + for (NSString *topic in topics.allKeys) { + [data appendMQTTString:topic]; + [data appendByte:[topics[topic] intValue]]; + } + MQTTMessage* msg = [[MQTTMessage alloc] initWithType:MQTTSubscribe + qos:1 + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)unsubscribeMessageWithMessageId:(UInt16)msgId + topics:(NSArray *)topics + protocolLevel:(MQTTProtocolVersion)protocolLevel { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + for (NSString *topic in topics) { + [data appendMQTTString:topic]; + } + MQTTMessage* msg = [[MQTTMessage alloc] initWithType:MQTTUnsubscribe + qos:1 + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)publishMessageWithData:(NSData *)payload + onTopic:(NSString *)topic + qos:(MQTTQosLevel)qosLevel + msgId:(UInt16)msgId + retainFlag:(BOOL)retain + dupFlag:(BOOL)dup + protocolLevel:(MQTTProtocolVersion)protocolLevel + payloadFormatIndicator:(NSNumber *)payloadFormatIndicator + publicationExpiryInterval:(NSNumber *)publicationExpiryInterval + topicAlias:(NSNumber *)topicAlias + responseTopic:(NSString *)responseTopic + correlationData:(NSData *)correlationData + userProperty:(NSDictionary *)userProperty + contentType:(NSString *)contentType { + NSMutableData *data = [[NSMutableData alloc] init]; + [data appendMQTTString:topic]; + if (msgId) [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (payloadFormatIndicator) { + [properties appendByte:MQTTPayloadFormatIndicator]; + [properties appendByte:payloadFormatIndicator.unsignedIntValue]; + } + if (publicationExpiryInterval) { + [properties appendByte:MQTTPublicationExpiryInterval]; + [properties appendUInt32BigEndian:publicationExpiryInterval.unsignedIntValue]; + } + if (topicAlias) { + [properties appendByte:MQTTTopicAlias]; + [properties appendUInt16BigEndian:topicAlias.unsignedIntValue]; + } + if (responseTopic) { + [properties appendByte:MQTTResponseTopic]; + [properties appendMQTTString:responseTopic]; + } + if (correlationData) { + [properties appendByte:MQTTCorrelationData]; + [properties appendBinaryData:correlationData]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + if (contentType) { + [properties appendByte:MQTTContentType]; + [properties appendMQTTString:contentType]; + } + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + [data appendData:payload]; + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPublish + qos:qosLevel + retainFlag:retain + dupFlag:dup + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)pubackMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (reasonString) { + [properties appendByte:MQTTReasonString]; + [properties appendMQTTString:reasonString]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + [data appendByte:returnCode]; + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPuback + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)pubrecMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (reasonString) { + [properties appendByte:MQTTReasonString]; + [properties appendMQTTString:reasonString]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + [data appendByte:returnCode]; + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubrec + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)pubrelMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (reasonString) { + [properties appendByte:MQTTReasonString]; + [properties appendMQTTString:reasonString]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + [data appendByte:returnCode]; + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubrel + qos:1 + data:data]; + msg.mid = msgId; + return msg; +} + ++ (MQTTMessage *)pubcompMessageWithMessageId:(UInt16)msgId + protocolLevel:(MQTTProtocolVersion)protocolLevel + returnCode:(MQTTReturnCode)returnCode + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + NSMutableData* data = [NSMutableData data]; + [data appendUInt16BigEndian:msgId]; + if (protocolLevel == MQTTProtocolVersion50) { + NSMutableData *properties = [[NSMutableData alloc] init]; + if (reasonString) { + [properties appendByte:MQTTReasonString]; + [properties appendMQTTString:reasonString]; + } + if (userProperty) { + for (NSString *key in userProperty.allKeys) { + [properties appendByte:MQTTUserProperty]; + [properties appendMQTTString:key]; + [properties appendMQTTString:userProperty[key]]; + } + } + [data appendByte:returnCode]; + [data appendVariableLength:properties.length]; + [data appendData:properties]; + } + MQTTMessage *msg = [[MQTTMessage alloc] initWithType:MQTTPubcomp + data:data]; + msg.mid = msgId; + return msg; +} + +- (instancetype)init { + self = [super init]; + self.type = 0; + self.qos = MQTTQosLevelAtMostOnce; + self.retainFlag = false; + self.mid = 0; + self.data = nil; + return self; +} + +- (instancetype)initWithType:(MQTTCommandType)type { + self = [self init]; + self.type = type; + return self; +} + +- (instancetype)initWithType:(MQTTCommandType)type + data:(NSData *)data { + self = [self init]; + self.type = type; + self.data = data; + return self; +} + +- (instancetype)initWithType:(MQTTCommandType)type + qos:(MQTTQosLevel)qos + data:(NSData *)data { + self = [self init]; + self.type = type; + self.qos = qos; + self.data = data; + return self; +} + +- (instancetype)initWithType:(MQTTCommandType)type + qos:(MQTTQosLevel)qos + retainFlag:(BOOL)retainFlag + dupFlag:(BOOL)dupFlag + data:(NSData *)data { + self = [self init]; + self.type = type; + self.qos = qos; + self.retainFlag = retainFlag; + self.dupFlag = dupFlag; + self.data = data; + return self; +} + +- (NSData *)wireFormat { + NSMutableData *buffer = [[NSMutableData alloc] init]; + + // encode fixed header + UInt8 header; + header = (self.type & 0x0f) << 4; + if (self.dupFlag) { + header |= 0x08; + } + header |= (self.qos & 0x03) << 1; + if (self.retainFlag) { + header |= 0x01; + } + [buffer appendBytes:&header length:1]; + [buffer appendVariableLength:self.data.length]; + + // encode message data + if (self.data != nil) { + [buffer appendData:self.data]; + } + + DDLogVerbose(@"[MQTTMessage] wireFormat(%lu)=%@...", + (unsigned long)buffer.length, + [buffer subdataWithRange:NSMakeRange(0, MIN(256, buffer.length))]); + + return buffer; +} + ++ (MQTTMessage *)messageFromData:(NSData *)data protocolLevel:(MQTTProtocolVersion)protocolLevel { + MQTTMessage *message = nil; + if (data.length >= 2) { + UInt8 header; + [data getBytes:&header length:sizeof(header)]; + UInt8 type = (header >> 4) & 0x0f; + UInt8 dupFlag = (header >> 3) & 0x01; + UInt8 qos = (header >> 1) & 0x03; + UInt8 retainFlag = header & 0x01; + UInt32 remainingLength = 0; + UInt32 multiplier = 1; + UInt8 offset = 1; + UInt8 digit; + do { + if (data.length < offset) { + DDLogWarn(@"[MQTTMessage] message data incomplete remaining length"); + offset = -1; + break; + } + [data getBytes:&digit range:NSMakeRange(offset, 1)]; + offset++; + remainingLength += (digit & 0x7f) * multiplier; + multiplier *= 128; + if (multiplier > 128*128*128) { + DDLogWarn(@"[MQTTMessage] message data too long remaining length"); + multiplier = -1; + break; + } + } while ((digit & 0x80) != 0); + + if (type >= MQTTConnect && + type <= MQTTDisconnect) { + if (offset > 0 && + multiplier > 0 && + data.length == remainingLength + offset) { + if ((type == MQTTPublish && (qos >= MQTTQosLevelAtMostOnce && qos <= MQTTQosLevelExactlyOnce)) || + (type == MQTTConnect && qos == 0) || + (type == MQTTConnack && qos == 0) || + (type == MQTTPuback && qos == 0) || + (type == MQTTPubrec && qos == 0) || + (type == MQTTPubrel && qos == 1) || + (type == MQTTPubcomp && qos == 0) || + (type == MQTTSubscribe && qos == 1) || + (type == MQTTSuback && qos == 0) || + (type == MQTTUnsubscribe && qos == 1) || + (type == MQTTUnsuback && qos == 0) || + (type == MQTTPingreq && qos == 0) || + (type == MQTTPingresp && qos == 0) || + (type == MQTTDisconnect && qos == 0)) { + message = [[MQTTMessage alloc] init]; + message.type = type; + message.dupFlag = dupFlag == 1; + message.retainFlag = retainFlag == 1; + message.qos = qos; + message.data = [data subdataWithRange:NSMakeRange(offset, remainingLength)]; + if ((type == MQTTPublish && + (qos == MQTTQosLevelAtLeastOnce || + qos == MQTTQosLevelExactlyOnce) + ) || + type == MQTTPuback || + type == MQTTPubrec || + type == MQTTPubrel || + type == MQTTPubcomp || + type == MQTTSubscribe || + type == MQTTSuback || + type == MQTTUnsubscribe || + type == MQTTUnsuback) { + if (message.data.length >= 2) { + [message.data getBytes:&digit range:NSMakeRange(0, 1)]; + message.mid = digit * 256; + [message.data getBytes:&digit range:NSMakeRange(1, 1)]; + message.mid += digit; + } else { + DDLogWarn(@"[MQTTMessage] missing packet identifier"); + message = nil; + } + } + if (type == MQTTPuback || + type == MQTTPubrec || + type == MQTTPubrel || + type == MQTTPubcomp) { + if (protocolLevel != MQTTProtocolVersion50) { + if (message.data.length > 2) { + DDLogWarn(@"[MQTTMessage] unexpected payload after packet identifier"); + message = nil; + } + } else { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] no returncode"); + message = nil; + } else { + const UInt8 *bytes = message.data.bytes; + message.returnCode = [NSNumber numberWithInt:bytes[2]]; + if (message.data.length >= 3) { + message.properties = [[MQTTProperties alloc] initFromData: + [message.data subdataWithRange:NSMakeRange(3, message.data.length - 3)]]; + } + } + + } + } + if (type == MQTTUnsuback ) { + if (message.data.length > 2) { + DDLogWarn(@"[MQTTMessage] unexpected payload after packet identifier"); + message = nil; + } + } + if (type == MQTTPingreq || + type == MQTTPingresp) { + if (message.data.length > 0) { + DDLogWarn(@"[MQTTMessage] unexpected payload"); + message = nil; + } + } + if (type == MQTTDisconnect) { + if (protocolLevel == MQTTProtocolVersion50) { + if (message.data.length == 0) { + message.properties = nil; + message.returnCode = @(MQTTSuccess); + } else if (message.data.length == 1) { + message.properties = nil; + const UInt8 *bytes = message.data.bytes; + message.returnCode = [NSNumber numberWithUnsignedInt:bytes[0]]; + } else if (message.data.length > 1) { + const UInt8 *bytes = message.data.bytes; + message.returnCode = [NSNumber numberWithUnsignedInt:bytes[0]]; + message.properties = [[MQTTProperties alloc] initFromData: + [message.data subdataWithRange:NSMakeRange(1, message.data.length - 1)]]; + } + } else { + if (message.data.length != 2) { + DDLogWarn(@"[MQTTMessage] unexpected payload"); + message = nil; + } + } + } + if (type == MQTTConnect) { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] missing connect variable header"); + message = nil; + } + } + if (type == MQTTConnack) { + if (protocolLevel == MQTTProtocolVersion50) { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] missing connack variable header"); + message = nil; + } + } else { + if (message.data.length != 2) { + DDLogWarn(@"[MQTTMessage] missing connack variable header"); + message = nil; + } + } + if (message) { + const UInt8 *bytes = message.data.bytes; + message.connectAcknowledgeFlags = [NSNumber numberWithUnsignedInt:bytes[0]]; + message.returnCode = [NSNumber numberWithUnsignedInt:bytes[1]]; + if (protocolLevel == MQTTProtocolVersion50) { + message.properties = [[MQTTProperties alloc] initFromData: + [message.data subdataWithRange:NSMakeRange(2, message.data.length - 2)]]; + } + } + } + if (type == MQTTSubscribe) { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] missing subscribe variable header"); + message = nil; + } + } + if (type == MQTTSuback) { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] missing suback variable header"); + message = nil; + } + } + if (type == MQTTUnsubscribe) { + if (message.data.length < 3) { + DDLogWarn(@"[MQTTMessage] missing unsubscribe variable header"); + message = nil; + } + } + } else { + DDLogWarn(@"[MQTTMessage] illegal header flags"); + } + } else { + DDLogWarn(@"[MQTTMessage] remaining data wrong length"); + } + } else { + DDLogWarn(@"[MQTTMessage] illegal message type"); + } + } else { + DDLogWarn(@"[MQTTMessage] message data length < 2"); + } + return message; +} + +@end + +@implementation NSMutableData (MQTT) + +- (void)appendByte:(UInt8)byte { + [self appendBytes:&byte length:1]; +} + +- (void)appendUInt16BigEndian:(UInt16)val { + [self appendByte:val / 256]; + [self appendByte:val % 256]; +} + +- (void)appendUInt32BigEndian:(UInt32)val { + [self appendByte:(val / (256 * 256 * 256))]; + [self appendByte:(val / (256 * 256)) & 0xff]; + [self appendByte:(val / 256) & 0xff]; + [self appendByte:val % 256]; +} + +- (void)appendVariableLength:(unsigned long)length { + do { + UInt8 digit = length % 128; + length /= 128; + if (length > 0) { + digit |= 0x80; + } + [self appendBytes:&digit length:1]; + } + while (length > 0); +} + +- (void)appendMQTTString:(NSString *)string { + if (string) { + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + [self appendUInt16BigEndian:data.length]; + [self appendData:data]; + } +} + +- (void)appendBinaryData:(NSData *)data { + if (data) { + [self appendUInt16BigEndian:data.length]; + [self appendData:data]; + } +} + +@end + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h new file mode 100644 index 0000000..30e5073 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTPersistence.h @@ -0,0 +1,124 @@ +// +// MQTTPersistence.h +// MQTTClient +// +// Created by Christoph Krey on 22.03.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import +#import "MQTTMessage.h" + +static BOOL const MQTT_PERSISTENT = NO; +static NSInteger const MQTT_MAX_SIZE = 64 * 1024 * 1024; +static NSInteger const MQTT_MAX_WINDOW_SIZE = 16; +static NSInteger const MQTT_MAX_MESSAGES = 1024; + +/** MQTTFlow is an abstraction of the entity to be stored for persistence */ + +@protocol MQTTFlow +/** The clientID of the flow element */ +@property (strong, nonatomic) NSString *clientId; + +/** The flag indicating incoming or outgoing flow element */ +@property (strong, nonatomic) NSNumber *incomingFlag; + +/** The flag indicating if the flow element is retained*/ +@property (strong, nonatomic) NSNumber *retainedFlag; + +/** The MQTTCommandType of the flow element, might be MQTT_None for offline queueing */ +@property (strong, nonatomic) NSNumber *commandType; + +/** The MQTTQosLevel of the flow element */ +@property (strong, nonatomic) NSNumber *qosLevel; + +/** The messageId of the flow element */ +@property (strong, nonatomic) NSNumber *messageId; + +/** The topic of the flow element */ +@property (strong, nonatomic) NSString *topic; + +/** The data of the flow element */ +@property (strong, nonatomic) NSData *data; + +/** The deadline of the flow elelment before (re)trying transmission */ +@property (strong, nonatomic) NSDate *deadline; + +@end + +/** The MQTTPersistence protocol is an abstraction of persistence classes for MQTTSession */ + +@protocol MQTTPersistence + +/** The maximum Window Size for outgoing inflight messages per clientID. Defaults to 16 */ +@property (nonatomic) NSUInteger maxWindowSize; + +/** The maximum number of messages kept per clientID and direction. Defaults to 1024 */ +@property (nonatomic) NSUInteger maxMessages; + +/** Indicates if the persistence implementation should make the information permannent. Defaults to NO */ +@property (nonatomic) BOOL persistent; + +/** The maximum size of the storage used for persistence in total in bytes. Defaults to 1024*1024 bytes */ +@property (nonatomic) NSUInteger maxSize; + +/** The current Window Size for outgoing inflight messages per clientID. + * @param clientId identifying the session + * @return the current size of the outgoing inflight window + */ +- (NSUInteger)windowSize:(NSString *)clientId; + +/** Stores one new message + * @param clientId identifying the session + * @param topic the topic of the message + * @param data the message's data + * @param retainFlag the retain flag of the message + * @param qos the quality of service of the message + * @param msgId the id of the message or zero for qos zero + * @param incomingFlag the direction of the message + * @param commandType the command of the message + * @param deadline the deadline of the message for repetitions + * @return the created MQTTFlow element or nil if the maxWindowSize has been exceeded + */ +- (id)storeMessageForClientId:(NSString *)clientId + topic:(NSString *)topic + data:(NSData *)data + retainFlag:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + msgId:(UInt16)msgId + incomingFlag:(BOOL)incomingFlag + commandType:(UInt8)commandType + deadline:(NSDate *)deadline; + +/** Deletes an MQTTFlow element + * @param flow the MQTTFlow to delete + */ +- (void)deleteFlow:(id)flow; + +/** Deletes all MQTTFlow elements of a clientId + * @param clientId the client Id identifying all MQTTFlows to be deleted + */ +- (void)deleteAllFlowsForClientId:(NSString *)clientId; + +/** Retrieves all MQTTFlow elements of a clientId and direction + * @param clientId whos MQTTFlows should be retrieved + * @param incomingFlag specifies the wether incoming or outgoing flows should be retrieved + * @return an NSArray of the retrieved MQTTFlow elements + */ +- (NSArray *)allFlowsforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag; + +/** Retrieves an MQTTFlow element + * @param clientId to which the MQTTFlow belongs to + * @param incomingFlag specifies the direction of the flow + * @param messageId specifies the message Id of the flow + * @return the retrieved MQTTFlow element or nil if the elememt was not found + */ +- (id)flowforClientId:(NSString *)clientId + incomingFlag:(BOOL)incomingFlag + messageId:(UInt16)messageId; + +/** sync is called to allow the MQTTPersistence implemetation to save data permanently */ +- (void)sync; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h new file mode 100644 index 0000000..cd45531 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.h @@ -0,0 +1,76 @@ +// +// MQTTProperties.h +// MQTTClient +// +// Created by Christoph Krey on 04.04.17. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import + +typedef NS_ENUM(UInt8, MQTTPropertyIdentifier) { + MQTTPayloadFormatIndicator = 1, + MQTTPublicationExpiryInterval = 2, + MQTTContentType = 3, + MQTTResponseTopic = 8, + MQTTCorrelationData = 9, + MQTTSubscriptionIdentifier = 11, + MQTTSessionExpiryInterval = 17, + MQTTAssignedClientIdentifier = 18, + MQTTServerKeepAlive = 19, + MQTTAuthMethod = 21, + MQTTAuthData = 22, + MQTTRequestProblemInformation = 23, + MQTTWillDelayInterval = 24, + MQTTRequestResponseInformation = 25, + MQTTResponseInformation = 26, + MQTTServerReference = 28, + MQTTReasonString = 31, + MQTTReceiveMaximum = 33, + MQTTTopicAliasMaximum = 34, + MQTTTopicAlias = 35, + MQTTMaximumQoS = 36, + MQTTRetainAvailable = 37, + MQTTUserProperty = 38, + MQTTMaximumPacketSize = 39, + MQTTWildcardSubscriptionAvailable = 40, + MQTTSubscriptionIdentifiersAvailable = 41, + MQTTSharedSubscriptionAvailable = 42 +}; + + +@interface MQTTProperties : NSObject + +@property (strong, nonatomic) NSNumber *payloadFormatIndicator; +@property (strong, nonatomic) NSNumber *publicationExpiryInterval; +@property (strong, nonatomic) NSString *contentType; +@property (strong, nonatomic) NSString *responseTopic; +@property (strong, nonatomic) NSData *correlationData; +@property (strong, nonatomic) NSNumber *subscriptionIdentifier; +@property (strong, nonatomic) NSNumber *sessionExpiryInterval; +@property (strong, nonatomic) NSString *assignedClientIdentifier; +@property (strong, nonatomic) NSNumber *serverKeepAlive; +@property (strong, nonatomic) NSString *authMethod; +@property (strong, nonatomic) NSData *authData; +@property (strong, nonatomic) NSNumber *requestProblemInformation; +@property (strong, nonatomic) NSNumber *willDelayInterval; +@property (strong, nonatomic) NSNumber *requestResponseInformation; +@property (strong, nonatomic) NSString *responseInformation; +@property (strong, nonatomic) NSString *serverReference; +@property (strong, nonatomic) NSString *reasonString; +@property (strong, nonatomic) NSNumber *receiveMaximum; +@property (strong, nonatomic) NSNumber *topicAliasMaximum; +@property (strong, nonatomic) NSNumber *topicAlias; +@property (strong, nonatomic) NSNumber *maximumQoS; +@property (strong, nonatomic) NSNumber *retainAvailable; +@property (strong, nonatomic) NSMutableDictionary *userProperty; +@property (strong, nonatomic) NSNumber *maximumPacketSize; +@property (strong, nonatomic) NSNumber *wildcardSubscriptionAvailable; +@property (strong, nonatomic) NSNumber *subscriptionIdentifiersAvailable; +@property (strong, nonatomic) NSNumber *sharedSubscriptionAvailable; + +- (instancetype)initFromData:(NSData *)data NS_DESIGNATED_INITIALIZER; ++ (int)getVariableLength:(NSData *)data; ++ (int)variableIntLength:(int)length; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m new file mode 100644 index 0000000..c27ae66 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTProperties.m @@ -0,0 +1,336 @@ +// +// MQTTProperties.m +// MQTTClient +// +// Created by Christoph Krey on 04.04.17. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import "MQTTProperties.h" + +@implementation MQTTProperties + +- (instancetype)init { + return [self initFromData:[[NSData alloc] init]]; +} +- (instancetype)initFromData:(NSData *)data { + self = [super init]; + + int propertyLength = [MQTTProperties getVariableLength:data]; + int offset = [MQTTProperties variableIntLength:propertyLength]; + NSData *remainingData = [data subdataWithRange:NSMakeRange(offset, data.length - offset)]; + offset = 0; + if (remainingData.length >= propertyLength) { + while (propertyLength - offset > 0) { + const UInt8 *bytes = remainingData.bytes; + UInt8 propertyType = bytes[offset]; + switch (propertyType) { + case MQTTPayloadFormatIndicator: + if (propertyLength - offset > 1) { + self.payloadFormatIndicator = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + case MQTTPublicationExpiryInterval: + if (propertyLength - offset > 4) { + self.publicationExpiryInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 5; + } + break; + case MQTTContentType: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.contentType = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + case MQTTResponseTopic: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.responseTopic = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + case MQTTCorrelationData: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.correlationData = [MQTTProperties getBinaryData:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + case MQTTSubscriptionIdentifier: + if (propertyLength - offset > 1) { + int subscriptionIdentifier = [MQTTProperties getVariableLength:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + int l = [MQTTProperties variableIntLength:subscriptionIdentifier]; + self.subscriptionIdentifier = @(subscriptionIdentifier); + offset += 1 + l; + + } + break; + + case MQTTSessionExpiryInterval: + if (propertyLength - offset > 4) { + self.sessionExpiryInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 5; + } + break; + case MQTTAssignedClientIdentifier: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.assignedClientIdentifier = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTServerKeepAlive: + if (propertyLength - offset > 2) { + self.serverKeepAlive = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 3; + } + break; + + case MQTTAuthMethod: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.authMethod = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTAuthData: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.authData = [MQTTProperties getBinaryData:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTRequestProblemInformation: + if (propertyLength - offset > 1) { + self.requestProblemInformation = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTWillDelayInterval: + if (propertyLength - offset > 4) { + self.willDelayInterval = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 5; + } + break; + + case MQTTRequestResponseInformation: + if (propertyLength - offset > 1) { + self.requestResponseInformation = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTResponseInformation: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.responseInformation = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTServerReference: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.serverReference = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTReasonString: + if (propertyLength - offset > 2) { + int l = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + self.reasonString = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + offset += 1 + 2 + l; + } + break; + + + case MQTTReceiveMaximum: + if (propertyLength - offset > 2) { + self.receiveMaximum = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 3; + } + break; + + case MQTTTopicAliasMaximum: + if (propertyLength - offset > 2) { + self.topicAliasMaximum = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 3; + } + break; + + case MQTTTopicAlias: + if (propertyLength - offset > 2) { + self.topicAlias = @([MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 3; + } + break; + + case MQTTMaximumQoS: + if (propertyLength - offset > 1) { + self.maximumQoS = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTRetainAvailable: + if (propertyLength - offset > 1) { + self.retainAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTUserProperty: + if (propertyLength - offset > 4) { + int keyL = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + NSString *key = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]; + + int valueL = [MQTTProperties getTwoByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1 + 2 + keyL, remainingData.length - (offset + 1))]]; + + NSString *value = [MQTTProperties getUtf8String:[remainingData subdataWithRange:NSMakeRange(offset + 1 + 2 + keyL, remainingData.length - (offset + 1))]]; + + if (!self.userProperty) { + self.userProperty = [[NSMutableDictionary alloc] init]; + } + self.userProperty[key] = value; + offset += 1 + 2 + keyL + 2 + valueL; + } + break; + + case MQTTMaximumPacketSize: + if (propertyLength - offset > 4) { + self.maximumPacketSize = @([MQTTProperties getFourByteInt:[remainingData subdataWithRange:NSMakeRange(offset + 1, remainingData.length - (offset + 1))]]); + offset += 5; + } + break; + + case MQTTWildcardSubscriptionAvailable: + if (propertyLength - offset > 1) { + self.wildcardSubscriptionAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTSubscriptionIdentifiersAvailable: + if (propertyLength - offset > 1) { + self.subscriptionIdentifiersAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + case MQTTSharedSubscriptionAvailable: + if (propertyLength - offset > 1) { + self.sharedSubscriptionAvailable = [NSNumber numberWithInt:bytes[offset + 1]]; + offset += 2; + } + break; + + default: + return self; + } + } + } + return self; +} + ++ (int)getVariableLength:(NSData *)data { + int length = 0; + int offset = 0; + int multiplier = 1; + UInt8 digit; + + do { + if (data.length < offset) { + return -1; + } + [data getBytes:&digit range:NSMakeRange(offset, 1)]; + offset++; + length += (digit & 0x7f) * multiplier; + multiplier *= 128; + if (multiplier > 128 * 128 * 128) { + return -2; + } + } while ((digit & 0x80) != 0); + return length; +} + ++ (int)getTwoByteInt:(NSData *)data { + int i = 0; + if (data.length >= 2) { + const UInt8 *bytes = data.bytes; + i = bytes[0] * 256 + + bytes[1]; + } + return i; +} + ++ (int)getFourByteInt:(NSData *)data { + int i = 0; + if (data.length >= 4) { + const UInt8 *bytes = data.bytes; + i = bytes[0] * 256 * 256 * 256 + + bytes[1] * 256 * 256 + + bytes[2] * 256 + + bytes[3]; + } + return i; +} + ++ (NSString *)getUtf8String:(NSData *)data { + NSString *s; + int l = [MQTTProperties getTwoByteInt:data]; + if (data.length >= l + 2) { + s = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(2, l)] encoding:NSUTF8StringEncoding]; + } + return s; +} + ++ (NSData *)getBinaryData:(NSData *)data { + NSData *d; + int l = [MQTTProperties getTwoByteInt:data]; + if (data.length >= l + 2) { + d = [data subdataWithRange:NSMakeRange(2, l)]; + } + return d; +} + ++ (int)variableIntLength:(int)length { + int l = 0; + if (length <= 127) { + l = 1; + } else if (length <= 16383) { + l = 2; + } else if (length <= 2097151) { + l = 3; + } else if (length <= 268435455) { + l = 4; + } + return l; +} +@end + + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h new file mode 100644 index 0000000..a12475c --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h @@ -0,0 +1,158 @@ +// +// MQTTSSLSecurityPolicy.h +// MQTTClient.framework +// +// Created by @bobwenx on 15/6/1. +// +// based on +// +// Copyright (c) 2011–2015 AFNetwork (http://alamofire.org/) +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE 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. + +#import +#import + +/** +## SSL Pinning Modes + +The following constants are provided by `MQTTSSLPinningModeNone` as possible SSL pinning modes. + +enum { +MQTTSSLPinningModeNone, +MQTTSSLPinningModePublicKey, +MQTTSSLPinningModeCertificate, +} + +`MQTTSSLPinningModeNone` +Do not used pinned certificates to validate servers. + +`MQTTSSLPinningModePublicKey` +Validate host certificates against public keys of pinned certificates. + +`MQTTSSLPinningModeCertificate` +Validate host certificates against pinned certificates. +*/ +typedef NS_ENUM(NSUInteger, MQTTSSLPinningMode) { + // Do not used pinned certificates to validate servers. + MQTTSSLPinningModeNone, + // Validate host certificates against public keys of pinned certificates. + MQTTSSLPinningModePublicKey, + // Validate host certificates against pinned certificates. + MQTTSSLPinningModeCertificate, +}; + +/** +`MQTTSSLSecurityPolicy` evaluates server trust against pinned X.509 certificates and public keys over secure connections. + +If your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks +and other vulnerabilities. you need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). + +NOTE: about self-signed server certificates: +if your server using Self-signed certificates to establish SSL/TLS connection, you need to set property: +MQTTSSLSecurityPolicy.allowInvalidCertificates=YES. + +If SSL is enabled, by default it only evaluate server's certificates using CA infrastructure, and for most case, this type of check is enough. +However, if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks +and other vulnerabilities. you may need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). + +NOTE: about self-signed server certificates: +In CA infrastructure, you may establish a SSL/TLS connection with server which using self-signed certificates +by install the certificates into OS keychain(either programmatically or manually). however, this method has some disadvantages: +1. every socket you app created will trust certificates you added. +2. if user choice to remove certificates from keychain, you app need to handling certificates re-adding. + +If you only want to verify the cert for the socket you are creating and for no other sockets in your app, you need to use +MQTTSSLSecurityPolicy. +And if you use self-signed server certificates, your need to set property: MQTTSSLSecurityPolicy.allowInvalidCertificates=YES + +Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. +Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication +over an SSL/TLS connection with SSL pinning configured and enabled. +*/ +@interface MQTTSSLSecurityPolicy : NSObject +/** +The criteria by which server trust should be evaluated against the pinned SSL certificates. Defaults to `MQTTSSLPinningMode`. +*/ +@property (readonly, nonatomic, assign) MQTTSSLPinningMode SSLPinningMode; + +/** +Whether to evaluate an entire SSL certificate chain, or just the leaf certificate. Defaults to `YES`. +*/ +@property (nonatomic, assign) BOOL validatesCertificateChain; + +/** +The certificates used to evaluate server trust according to the SSL pinning mode. By default, this property is set to any (`.cer`) certificates included in the app bundle. +Note: Array item type: NSData - Bytes of X.509 certificate file in der format. +Note that if you create an array with duplicate certificates, the duplicate certificates will be removed. +*/ +@property (nonatomic, strong) NSArray *pinnedCertificates; + +/** +Whether or not to trust servers with an invalid or expired SSL certificates. Defaults to `NO`. +Note: If your server-certificates are self signed, your should set this property to 'YES'. +*/ +@property (nonatomic, assign) BOOL allowInvalidCertificates; + +/** +Whether or not to validate the domain name in the certificate's CN field. Defaults to `YES`. +*/ +@property (nonatomic, assign) BOOL validatesDomainName; + +///----------------------------------------- +/// @name Getting Specific Security Policies +///----------------------------------------- + +/** +Returns the shared default security policy, which does not allow invalid certificates, validates domain name, and does not validate against pinned certificates or public keys. + +@return The default security policy. +*/ ++ (instancetype)defaultPolicy; + +///--------------------- +/// @name Initialization +///--------------------- + +/** +Creates and returns a security policy with the specified pinning mode. + +@param pinningMode The SSL pinning mode. + +@return A new security policy. +*/ ++ (instancetype)policyWithPinningMode:(MQTTSSLPinningMode)pinningMode; + +///------------------------------ +/// @name Evaluating Server Trust +///------------------------------ + +/** +Whether or not the specified server trust should be accepted, based on the security policy. + +This method should be used when responding to an authentication challenge from a server. + +@param serverTrust The X.509 certificate trust of the server. +@param domain The domain of serverTrust. If `nil`, the domain will not be validated. + +@return Whether or not to trust the server. +*/ +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain; +@end \ No newline at end of file diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m new file mode 100644 index 0000000..e62156e --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m @@ -0,0 +1,297 @@ +// +// MQTTSSLSecurityPolicy.m +// MQTTClient.framework +// +// Created by @bobwenx on 15/6/1. +// +// based on +// +// Copyright (c) 2011–2015 AFNetwork (http://alamofire.org/) +// +// Permission 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: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE 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. + +#import "MQTTSSLSecurityPolicy.h" +#import + +#import "MQTTLog.h" + +static BOOL SSLSecKeyIsEqualToKey(SecKeyRef key1, SecKeyRef key2) { + return [(__bridge id) key1 isEqual:(__bridge id) key2]; +} + +static id SSLPublicKeyForCertificate(NSData *certificate) { + id allowedPublicKey = nil; + SecCertificateRef allowedCertificate; + SecCertificateRef allowedCertificates[1]; + CFArrayRef tempCertificates = nil; + SecPolicyRef policy = nil; + SecTrustRef allowedTrust = nil; + SecTrustResultType result; + + allowedCertificate = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificate); + __Require_Quiet(allowedCertificate != NULL, _out); + + allowedCertificates[0] = allowedCertificate; + tempCertificates = CFArrayCreate(NULL, (const void **)allowedCertificates, 1, NULL); + + policy = SecPolicyCreateBasicX509(); + __Require_noErr_Quiet(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out); + __Require_noErr_Quiet(SecTrustEvaluate(allowedTrust, &result), _out); + + allowedPublicKey = (__bridge_transfer id)SecTrustCopyPublicKey(allowedTrust); + + _out: + if (allowedTrust) { + CFRelease(allowedTrust); + } + + if (policy) { + CFRelease(policy); + } + + if (tempCertificates) { + CFRelease(tempCertificates); + } + + if (allowedCertificate) { + CFRelease(allowedCertificate); + } + + return allowedPublicKey; +} + +static BOOL SSLServerTrustIsValid(SecTrustRef serverTrust) { + BOOL isValid = NO; + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(serverTrust, &result), _out); + + isValid = (result == kSecTrustResultUnspecified // The OS trusts this certificate implicitly. + || result == kSecTrustResultProceed); // The user explicitly told the OS to trust it. + + // else? It's somebody else's key. Fall immediately. + + _out: + return isValid; +} + +static NSArray * SSLCertificateTrustChainForServerTrust(SecTrustRef serverTrust) { + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + [trustChain addObject:(__bridge_transfer NSData *)SecCertificateCopyData(certificate)]; + } + + return [NSArray arrayWithArray:trustChain]; +} + +static NSArray * SSLPublicKeyTrustChainForServerTrust(SecTrustRef serverTrust) { + SecPolicyRef policy = SecPolicyCreateBasicX509(); + CFIndex certificateCount = SecTrustGetCertificateCount(serverTrust); + NSMutableArray *trustChain = [NSMutableArray arrayWithCapacity:(NSUInteger)certificateCount]; + for (CFIndex i = 0; i < certificateCount; i++) { + SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, i); + + SecCertificateRef someCertificates[] = {certificate}; + CFArrayRef certificates = CFArrayCreate(NULL, (const void **)someCertificates, 1, NULL); + + SecTrustRef trust; + __Require_noErr_Quiet(SecTrustCreateWithCertificates(certificates, policy, &trust), _out); + + SecTrustResultType result; + __Require_noErr_Quiet(SecTrustEvaluate(trust, &result), _out); + + [trustChain addObject:(__bridge_transfer id)SecTrustCopyPublicKey(trust)]; + + _out: + if (trust) { + CFRelease(trust); + } + + if (certificates) { + CFRelease(certificates); + } + + continue; + } + CFRelease(policy); + + return [NSArray arrayWithArray:trustChain]; +} + +@interface MQTTSSLSecurityPolicy() +@property (readwrite, nonatomic, assign) MQTTSSLPinningMode SSLPinningMode; +@property (readwrite, nonatomic, strong) NSArray *pinnedPublicKeys; +@end + +@implementation MQTTSSLSecurityPolicy + +#pragma mark - SSL Security Policy + ++ (NSArray *)defaultPinnedCertificates { + static NSArray *_defaultPinnedCertificates = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSArray *paths = [bundle pathsForResourcesOfType:@"cer" inDirectory:@"."]; + + NSMutableArray *certificates = [NSMutableArray arrayWithCapacity:paths.count]; + for (NSString *path in paths) { + NSData *certificateData = [NSData dataWithContentsOfFile:path]; + [certificates addObject:certificateData]; + } + + _defaultPinnedCertificates = [[NSArray alloc] initWithArray:certificates]; + }); + + return _defaultPinnedCertificates; +} + ++ (instancetype)defaultPolicy { + MQTTSSLSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = MQTTSSLPinningModeNone; + + return securityPolicy; +} + ++ (instancetype)policyWithPinningMode:(MQTTSSLPinningMode)pinningMode { + MQTTSSLSecurityPolicy *securityPolicy = [[self alloc] init]; + securityPolicy.SSLPinningMode = pinningMode; + + securityPolicy.pinnedCertificates = [self defaultPinnedCertificates]; + + return securityPolicy; +} + +- (instancetype)init { + self = [super init]; + if (!self) { + return nil; + } + + self.validatesCertificateChain = YES; + self.validatesDomainName = YES; + + return self; +} + +- (void)setPinnedCertificates:(NSArray *)pinnedCertificates { + _pinnedCertificates = [NSOrderedSet orderedSetWithArray:pinnedCertificates].array; + + if (self.pinnedCertificates) { + NSMutableArray *mutablePinnedPublicKeys = [NSMutableArray arrayWithCapacity:(self.pinnedCertificates).count]; + for (NSData *certificate in self.pinnedCertificates) { + id publicKey = SSLPublicKeyForCertificate(certificate); + if (!publicKey) { + continue; + } + [mutablePinnedPublicKeys addObject:publicKey]; + } + self.pinnedPublicKeys = [NSArray arrayWithArray:mutablePinnedPublicKeys]; + } else { + self.pinnedPublicKeys = nil; + } +} + +- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust + forDomain:(NSString *)domain +{ + NSMutableArray *policies = [NSMutableArray array]; + if (self.validatesDomainName) { + [policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)domain)]; + } else { + [policies addObject:(__bridge_transfer id)SecPolicyCreateBasicX509()]; + } + + SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies); + + if (self.SSLPinningMode == MQTTSSLPinningModeNone) { + return self.allowInvalidCertificates || SSLServerTrustIsValid(serverTrust); + } + // if client didn't allow invalid certs, it must pass CA infrastructure + // TODO: Can we change order here? + else if (!SSLServerTrustIsValid(serverTrust) && !self.allowInvalidCertificates) { + return NO; + } + + NSArray *serverCertificates = SSLCertificateTrustChainForServerTrust(serverTrust); + switch (self.SSLPinningMode) { + case MQTTSSLPinningModeNone: + default: + return NO; + case MQTTSSLPinningModeCertificate: { + NSMutableArray *pinnedCertificates = [NSMutableArray array]; + for (NSData *certificateData in self.pinnedCertificates) { + @try { + [pinnedCertificates addObject:(__bridge_transfer id)SecCertificateCreateWithData(NULL, (__bridge CFDataRef)certificateData)]; + } @catch (NSException *exception) { + //fix issue #151, if the pinnedCertification is not a valid DER-encoded X.509 certificate, for example it is the PEM format, SecCertificateCreateWithData will return nil, and application will crash + if ([exception.name isEqual:NSInvalidArgumentException]) { + return NO; + } + } + } + SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates); + + if (!SSLServerTrustIsValid(serverTrust)) { + return NO; + } + + if (!self.validatesCertificateChain) { + return YES; + } + + NSUInteger trustedCertificateCount = 0; + for (NSData *trustChainCertificate in serverCertificates) { + if ([self.pinnedCertificates containsObject:trustChainCertificate]) { + trustedCertificateCount++; + } + } + + return trustedCertificateCount == serverCertificates.count; + } + case MQTTSSLPinningModePublicKey: { + NSUInteger trustedPublicKeyCount = 0; + NSArray *publicKeys = SSLPublicKeyTrustChainForServerTrust(serverTrust); + if (!self.validatesCertificateChain && publicKeys.count > 0) { + publicKeys = @[publicKeys.firstObject]; + } + + for (id trustChainPublicKey in publicKeys) { + for (id pinnedPublicKey in self.pinnedPublicKeys) { + if (SSLSecKeyIsEqualToKey((__bridge SecKeyRef)trustChainPublicKey, (__bridge SecKeyRef)pinnedPublicKey)) { + trustedPublicKeyCount += 1; + } + } + } + + return trustedPublicKeyCount > 0 && ((self.validatesCertificateChain && trustedPublicKeyCount == serverCertificates.count) || (!self.validatesCertificateChain && trustedPublicKeyCount >= 1)); + } + } + + return NO; +} + +#pragma mark - NSKeyValueObserving + ++ (NSSet *)keyPathsForValuesAffectingPinnedPublicKeys { + return [NSSet setWithObject:@"pinnedCertificates"]; +} +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h new file mode 100644 index 0000000..f14be3e --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h @@ -0,0 +1,19 @@ +// +// MQTTSSLSecurityPolicyDecoder.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import +#import "MQTTSSLSecurityPolicy.h" +#import "MQTTCFSocketDecoder.h" + +@interface MQTTSSLSecurityPolicyDecoder : MQTTCFSocketDecoder + +@property(strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; +@property(strong, nonatomic) NSString *securityDomain; + +@end + + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m new file mode 100644 index 0000000..a45e25b --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m @@ -0,0 +1,60 @@ +// +// MQTTSSLSecurityPolicyDecoder.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import "MQTTSSLSecurityPolicyDecoder.h" + +#import "MQTTLog.h" + +@interface MQTTSSLSecurityPolicyDecoder() +@property (nonatomic) BOOL securityPolicyApplied; + +@end + +@implementation MQTTSSLSecurityPolicyDecoder + +- (instancetype)init { + self = [super init]; + self.securityPolicy = nil; + self.securityDomain = nil; + + return self; +} + +- (BOOL)applySSLSecurityPolicy:(NSStream *)readStream withEvent:(NSStreamEvent)eventCode{ + if (!self.securityPolicy) { + return YES; + } + + if (self.securityPolicyApplied) { + return YES; + } + + SecTrustRef serverTrust = (__bridge SecTrustRef) [readStream propertyForKey: (__bridge NSString *)kCFStreamPropertySSLPeerTrust]; + if (!serverTrust) { + return NO; + } + + self.securityPolicyApplied = [self.securityPolicy evaluateServerTrust:serverTrust forDomain:self.securityDomain]; + return self.securityPolicyApplied; +} + +- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { + if (eventCode & NSStreamEventHasBytesAvailable) { + DDLogVerbose(@"[MQTTCFSocketDecoder] NSStreamEventHasBytesAvailable"); + if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){ + self.state = MQTTCFSocketDecoderStateError; + self.error = [NSError errorWithDomain:@"MQTT" + code:errSSLXCertChainInvalid + userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}]; + [self.delegate decoder:self didFailWithError:self.error]; + return; + } + } + [super stream:sender handleEvent:eventCode]; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h new file mode 100644 index 0000000..341e39d --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h @@ -0,0 +1,18 @@ +// +// MQTTSSLSecurityPolicyEncoder.h +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import +#import "MQTTSSLSecurityPolicy.h" +#import "MQTTCFSocketEncoder.h" + +@interface MQTTSSLSecurityPolicyEncoder : MQTTCFSocketEncoder + +@property(strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; +@property(strong, nonatomic) NSString *securityDomain; + +@end + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m new file mode 100644 index 0000000..dd0470e --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m @@ -0,0 +1,60 @@ +// +// MQTTSSLSecurityPolicyEncoder.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +#import "MQTTSSLSecurityPolicyEncoder.h" + +#import "MQTTLog.h" + +@interface MQTTSSLSecurityPolicyEncoder() +@property (nonatomic) BOOL securityPolicyApplied; + +@end + +@implementation MQTTSSLSecurityPolicyEncoder + +- (instancetype)init { + self = [super init]; + self.securityPolicy = nil; + self.securityDomain = nil; + + return self; +} + +- (BOOL)applySSLSecurityPolicy:(NSStream *)writeStream withEvent:(NSStreamEvent)eventCode { + if (!self.securityPolicy) { + return YES; + } + + if (self.securityPolicyApplied) { + return YES; + } + + SecTrustRef serverTrust = (__bridge SecTrustRef)[writeStream propertyForKey:(__bridge NSString *)kCFStreamPropertySSLPeerTrust]; + if (!serverTrust) { + return NO; + } + + self.securityPolicyApplied = [self.securityPolicy evaluateServerTrust:serverTrust forDomain:self.securityDomain]; + return self.securityPolicyApplied; +} + +- (void)stream:(NSStream *)sender handleEvent:(NSStreamEvent)eventCode { + if (eventCode & NSStreamEventHasSpaceAvailable) { + DDLogVerbose(@"[MQTTCFSocketEncoder] NSStreamEventHasSpaceAvailable"); + if (![self applySSLSecurityPolicy:sender withEvent:eventCode]){ + self.state = MQTTCFSocketEncoderStateError; + self.error = [NSError errorWithDomain:@"MQTT" + code:errSSLXCertChainInvalid + userInfo:@{NSLocalizedDescriptionKey: @"Unable to apply security policy, the SSL connection is insecure!"}]; + [self.delegate encoder:self didFailWithError:self.error]; + return; + } + } + [super stream:sender handleEvent:eventCode]; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h new file mode 100644 index 0000000..9e9b9ae --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h @@ -0,0 +1,30 @@ +// +// MQTTSSLSecurityPolicyTransport.h +// MQTTClient +// +// Created by Christoph Krey on 06.12.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTTransport.h" +#import "MQTTSSLSecurityPolicy.h" +#import "MQTTCFSocketTransport.h" + +/** MQTTSSLSecurityPolicyTransport + * implements an extension of the MQTTCFSocketTransport by replacing the OS's certificate chain evaluation + */ +@interface MQTTSSLSecurityPolicyTransport : MQTTCFSocketTransport + +/** + * The security policy used to evaluate server trust for secure connections. + * + * if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks + * and other vulnerabilities. you need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). + * + * NOTE: about self-signed server certificates: + * if your server using Self-signed certificates to establish SSL/TLS connection, you need to set property: + * MQTTSSLSecurityPolicy.allowInvalidCertificates=YES. + */ +@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m new file mode 100644 index 0000000..6698efb --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m @@ -0,0 +1,98 @@ +// +// MQTTSSLSecurityPolicyTransport.m +// MQTTClient +// +// Created by Christoph Krey on 06.12.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTSSLSecurityPolicyTransport.h" +#import "MQTTSSLSecurityPolicyEncoder.h" +#import "MQTTSSLSecurityPolicyDecoder.h" + +#import "MQTTLog.h" + +@interface MQTTSSLSecurityPolicyTransport() +@property (strong, nonatomic) MQTTSSLSecurityPolicyEncoder *encoder; +@property (strong, nonatomic) MQTTSSLSecurityPolicyDecoder *decoder; + +@end + +@implementation MQTTSSLSecurityPolicyTransport +@synthesize state; +@synthesize delegate; + +- (instancetype)init { + self = [super init]; + self.securityPolicy = nil; + return self; +} + +- (void)open { + DDLogVerbose(@"[MQTTSSLSecurityPolicyTransport] open"); + self.state = MQTTTransportOpening; + + NSError* connectError; + + CFReadStreamRef readStream; + CFWriteStreamRef writeStream; + + CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.host, self.port, &readStream, &writeStream); + + CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue); + + if (self.tls) { + NSMutableDictionary *sslOptions = [[NSMutableDictionary alloc] init]; + + // Delegate certificates verify operation to our secure policy. + // by disabling chain validation, it becomes our responsibility to verify that the host at the other end can be trusted. + // the server's certificates will be verified during MQTT encoder/decoder processing. + sslOptions[(NSString *)kCFStreamSSLValidatesCertificateChain] = @NO; + sslOptions[(NSString *)kCFStreamSSLLevel] = self.streamSSLLevel; + + if (self.certificates) { + sslOptions[(NSString *)kCFStreamSSLCertificates] = self.certificates; + } + + if (!CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))){ + connectError = [NSError errorWithDomain:@"MQTT" + code:errSSLInternal + userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl input stream!"}]; + } + if (!CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)(sslOptions))){ + connectError = [NSError errorWithDomain:@"MQTT" + code:errSSLInternal + userInfo:@{NSLocalizedDescriptionKey : @"Fail to init ssl output stream!"}]; + } + } + + if (!connectError) { + self.encoder = [[MQTTSSLSecurityPolicyEncoder alloc] init]; + CFWriteStreamSetDispatchQueue(writeStream, self.queue); + self.encoder.stream = CFBridgingRelease(writeStream); + self.encoder.securityPolicy = self.tls ? self.securityPolicy : nil; + self.encoder.securityDomain = self.tls ? self.host : nil; + self.encoder.delegate = self; + if (self.voip) { + [self.encoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; + } + [self.encoder open]; + + self.decoder = [[MQTTSSLSecurityPolicyDecoder alloc] init]; + CFReadStreamSetDispatchQueue(readStream, self.queue); + self.decoder.stream = CFBridgingRelease(readStream); + self.decoder.securityPolicy = self.tls ? self.securityPolicy : nil; + self.decoder.securityDomain = self.tls ? self.host : nil; + self.decoder.delegate = self; + if (self.voip) { + [self.decoder.stream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType]; + } + [self.decoder open]; + + } else { + [self close]; + } +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h new file mode 100644 index 0000000..61b627a --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.h @@ -0,0 +1,886 @@ +// +// MQTTSession.h +// MQTTClient.framework +// + +/** + Using MQTT in your Objective-C application + + @author Christoph Krey c@ckrey.de + @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. + + based on Copyright (c) 2011, 2013, 2lemetry LLC + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + @see http://mqtt.org + */ + + +#import + +#import "MQTTMessage.h" +#import "MQTTPersistence.h" +#import "MQTTTransport.h" + +@class MQTTSession; +@class MQTTSSLSecurityPolicy; + +/** + Enumeration of MQTTSession states + */ +typedef NS_ENUM(NSInteger, MQTTSessionStatus) { + MQTTSessionStatusCreated, + MQTTSessionStatusConnecting, + MQTTSessionStatusConnected, + MQTTSessionStatusDisconnecting, + MQTTSessionStatusClosed, + MQTTSessionStatusError +}; + +/** + Enumeration of MQTTSession events + */ +typedef NS_ENUM(NSInteger, MQTTSessionEvent) { + MQTTSessionEventConnected, + MQTTSessionEventConnectionRefused, + MQTTSessionEventConnectionClosed, + MQTTSessionEventConnectionError, + MQTTSessionEventProtocolError, + MQTTSessionEventConnectionClosedByBroker +}; + +/** + The error domain used for all errors created by MQTTSession + */ +extern NSString * const MQTTSessionErrorDomain; + +/** + The error codes used for all errors created by MQTTSession + */ +typedef NS_ENUM(NSInteger, MQTTSessionError) { + MQTTSessionErrorConnectionRefused = -8, // Sent if the server closes the connection without sending an appropriate error CONNACK + MQTTSessionErrorIllegalMessageReceived = -7, + MQTTSessionErrorDroppingOutgoingMessage = -6, // For some reason the value is the same as for MQTTSessionErrorNoResponse + MQTTSessionErrorNoResponse = -6, // For some reason the value is the same as for MQTTSessionErrorDroppingOutgoingMessage + MQTTSessionErrorEncoderNotReady = -5, + MQTTSessionErrorInvalidConnackReceived = -2, // Sent if the message received from server was an invalid connack message + MQTTSessionErrorNoConnackReceived = -1, // Sent if first message received from server was no connack message + + MQTTSessionErrorConnackUnacceptableProtocolVersion = 1, // Value as defined by MQTT Protocol + MQTTSessionErrorConnackIdentifierRejected = 2, // Value as defined by MQTT Protocol + MQTTSessionErrorConnackServeUnavailable = 3, // Value as defined by MQTT Protocol + MQTTSessionErrorConnackBadUsernameOrPassword = 4, // Value as defined by MQTT Protocol + MQTTSessionErrorConnackNotAuthorized = 5, // Value as defined by MQTT Protocol + MQTTSessionErrorConnackReserved = 6, // Should be value 6-255, as defined by MQTT Protocol +}; + +/** Session delegate gives your application control over the MQTTSession + @note all callback methods are optional + */ + +@protocol MQTTSessionDelegate + +@optional + +/** gets called when a new message was received + @param session the MQTTSession reporting the new message + @param data the data received, might be zero length + @param topic the topic the data was published to + @param qos the qos of the message + @param retained indicates if the data retransmitted from server storage + @param mid the Message Identifier of the message if qos = 1 or 2, zero otherwise + */ +- (void)newMessage:(MQTTSession *)session + data:(NSData *)data + onTopic:(NSString *)topic + qos:(MQTTQosLevel)qos + retained:(BOOL)retained + mid:(unsigned int)mid; + +/** gets called when a new message was received + @param session the MQTTSession reporting the new message + @param data the data received, might be zero length + @param topic the topic the data was published to + @param qos the qos of the message + @param retained indicates if the data retransmitted from server storage + @param mid the Message Identifier of the message if qos = 1 or 2, zero otherwise + @return true if the message was or will be processed, false if the message shall not be ack-ed + */ +- (BOOL)newMessageWithFeedback:(MQTTSession *)session + data:(NSData *)data + onTopic:(NSString *)topic + qos:(MQTTQosLevel)qos + retained:(BOOL)retained + mid:(unsigned int)mid; + +/** for mqttio-OBJC backward compatibility + @param session see newMessage for description + @param data see newMessage for description + @param topic see newMessage for description + */ +- (void)session:(MQTTSession*)session newMessage:(NSData*)data onTopic:(NSString*)topic; + +/** gets called when a connection is established, closed or a problem occurred + @param session the MQTTSession reporting the event + @param eventCode the code of the event + @param error an optional additional error object with additional information + */ +- (void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error; + +/** for mqttio-OBJC backward compatibility + @param session the MQTTSession reporting the event + @param eventCode the code of the event + */ +- (void)session:(MQTTSession*)session handleEvent:(MQTTSessionEvent)eventCode; + +/** gets called when a connection has been successfully established + @param session the MQTTSession reporting the connect + + */ +- (void)connected:(MQTTSession *)session; + +/** gets called when a connection has been successfully established + @param session the MQTTSession reporting the connect + @param sessionPresent represents the Session Present flag sent by the broker + + */ +- (void)connected:(MQTTSession *)session sessionPresent:(BOOL)sessionPresent; + +/** gets called when a connection has been refused + @param session the MQTTSession reporting the refusal + @param error an optional additional error object with additional information + */ +- (void)connectionRefused:(MQTTSession *)session error:(NSError *)error; + +/** gets called when a connection has been closed + @param session the MQTTSession reporting the close + + */ +- (void)connectionClosed:(MQTTSession *)session; + +/** gets called when a connection error happened + @param session the MQTTSession reporting the connect error + @param error an optional additional error object with additional information + */ +- (void)connectionError:(MQTTSession *)session error:(NSError *)error; + +/** gets called when an MQTT protocol error happened + @param session the MQTTSession reporting the protocol error + @param error an optional additional error object with additional information + */ +- (void)protocolError:(MQTTSession *)session error:(NSError *)error; + +/** gets called when a published message was actually delivered + @param session the MQTTSession reporting the delivery + @param msgID the Message Identifier of the delivered message + @note this method is called after a publish with qos 1 or 2 only + */ +- (void)messageDelivered:(MQTTSession *)session msgID:(UInt16)msgID; + +/** gets called when a published message was actually delivered + @param session the MQTTSession reporting the delivery + @param msgID the Message Identifier of the delivered message + @param topic the topic of the delivered message + @param data the data Identifier of the delivered message + @param qos the QoS level of the delivered message + @param retainFlag the retain Flag of the delivered message + @note this method is called after a publish with qos 1 or 2 only + */ +- (void)messageDelivered:(MQTTSession *)session + msgID:(UInt16)msgID + topic:(NSString *)topic + data:(NSData *)data + qos:(MQTTQosLevel)qos + retainFlag:(BOOL)retainFlag; + +/** gets called when a subscription is acknowledged by the MQTT broker + @param session the MQTTSession reporting the acknowledge + @param msgID the Message Identifier of the SUBSCRIBE message + @param qoss an array containing the granted QoS(s) related to the SUBSCRIBE message + (see subscribeTopic, subscribeTopics) + */ +- (void)subAckReceived:(MQTTSession *)session msgID:(UInt16)msgID grantedQoss:(NSArray *)qoss; + +/** gets called when an unsubscribe is acknowledged by the MQTT broker + @param session the MQTTSession reporting the acknowledge + @param msgID the Message Identifier of the UNSUBSCRIBE message + */ +- (void)unsubAckReceived:(MQTTSession *)session msgID:(UInt16)msgID; + +/** gets called when a command is sent to the MQTT broker + use this for low level monitoring of the MQTT connection + @param session the MQTTSession reporting the sent command + @param type the MQTT command type + @param qos the Quality of Service of the command + @param retained the retained status of the command + @param duped the duplication status of the command + @param mid the Message Identifier of the command + @param data the payload data of the command if any, might be zero length + */ +- (void)sending:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; + +/** gets called when a command is received from the MQTT broker + use this for low level monitoring of the MQTT connection + @param session the MQTTSession reporting the received command + @param type the MQTT command type + @param qos the Quality of Service of the command + @param retained the retained status of the command + @param duped the duplication status of the command + @param mid the Message Identifier of the command + @param data the payload data of the command if any, might be zero length + */ +- (void)received:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; + +/** gets called when a command is received from the MQTT broker + use this for low level control of the MQTT connection + @param session the MQTTSession reporting the received command + @param type the MQTT command type + @param qos the Quality of Service of the command + @param retained the retained status of the command + @param duped the duplication status of the command + @param mid the Message Identifier of the command + @param data the payload data of the command if any, might be zero length + @return true if the sessionmanager should ignore the received message + */ +- (BOOL)ignoreReceived:(MQTTSession *)session type:(MQTTCommandType)type qos:(MQTTQosLevel)qos retained:(BOOL)retained duped:(BOOL)duped mid:(UInt16)mid data:(NSData *)data; + +/** gets called when the content of MQTTClients internal buffers change + use for monitoring the completion of transmitted and received messages + @param session the MQTTSession reporting the change + @param queued for backward compatibility only: MQTTClient does not queue messages anymore except during QoS protocol + @param flowingIn the number of incoming messages not acknowledged by the MQTTClient yet + @param flowingOut the number of outgoing messages not yet acknowledged by the MQTT broker + */ +- (void)buffered:(MQTTSession *)session + queued:(NSUInteger)queued + flowingIn:(NSUInteger)flowingIn + flowingOut:(NSUInteger)flowingOut; + +/** gets called when the content of MQTTClients internal buffers change + use for monitoring the completion of transmitted and received messages + @param session the MQTTSession reporting the change + @param flowingIn the number of incoming messages not acknowledged by the MQTTClient yet + @param flowingOut the number of outgoing messages not yet acknowledged by the MQTT broker + */ +- (void)buffered:(MQTTSession *)session + flowingIn:(NSUInteger)flowingIn + flowingOut:(NSUInteger)flowingOut; + +@end + +typedef void (^MQTTConnectHandler)(NSError *error); +typedef void (^MQTTDisconnectHandler)(NSError *error); +typedef void (^MQTTSubscribeHandler)(NSError *error, NSArray *gQoss); +typedef void (^MQTTUnsubscribeHandler)(NSError *error); +typedef void (^MQTTPublishHandler)(NSError *error); + +/** Session implements the MQTT protocol for your application + * + */ + +@interface MQTTSession : NSObject + +/** set this member variable to receive delegate messages + @code + #import "MQTTClient.h" + + @interface MyClass : NSObject + ... + @end + + ... + MQTTSession *session = [[MQTTSession alloc] init]; + session.delegate = self; + ... + - (void)handleEvent:(MQTTSession *)session + event:(MQTTSessionEvent)eventCode + error:(NSError *)error { + ... + } + - (void)newMessage:(MQTTSession *)session + data:(NSData *)data + onTopic:(NSString *)topic + qos:(MQTTQosLevel)qos + retained:(BOOL)retained + mid:(unsigned int)mid { + ... + } + @endcode + + */ +@property (weak, nonatomic) id delegate; + +/** Control MQTT persistence by setting the properties of persistence before connecting to an MQTT broker. + The settings are specific to a clientId. + + persistence.persistent = YES or NO (default) to establish file or in memory persistence. IMPORTANT: set immediately after creating the MQTTSession before calling any other method. Otherwise the default value (NO) will be used + for this session. + + persistence.maxWindowSize (a positive number, default is 16) to control the number of messages sent before waiting for acknowledgement in Qos 1 or 2. Additional messages are + stored and transmitted later. + + persistence.maxSize (a positive number of bytes, default is 64 MB) to limit the size of the persistence file. Messages published after the limit is reached are dropped. + + persistence.maxMessages (a positive number, default is 1024) to limit the number of messages stored. Additional messages published are dropped. + + Messages are deleted after they have been acknowledged. +*/ +@property (strong, nonatomic) id persistence; + +/** block called once when connection is established + */ +@property (copy, nonatomic) MQTTConnectHandler connectHandler; + +/** block called when connection is established + */ +@property (strong) void (^connectionHandler)(MQTTSessionEvent event); + +/** block called when message is received + */ +@property (strong) void (^messageHandler)(NSData* message, NSString* topic); + +/** Session status + */ +@property (nonatomic, readonly) MQTTSessionStatus status; + +/** Indicates if the broker found a persistent session when connecting with cleanSession:FALSE + */ +@property (nonatomic, readonly) BOOL sessionPresent; + +/** streamSSLLevel an NSString containing the security level for read and write streams + * For list of possible values see: + * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants + * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list + * and cannot be used as constant, but you can use it as a string value + * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL + */ +@property (strong, nonatomic) NSString *streamSSLLevel; + +/** host an NSString containing the hostName or IP address of the Server + */ +@property (readonly) NSString *host; + +/** port an unsigned 32 bit integer containing the IP port number of the Server + */ +@property (readonly) UInt32 port; + +/** The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. + */ +@property (strong, nonatomic) NSString *clientId; + +/** see userName an NSString object containing the user's name (or ID) for authentication. May be nil. */ +@property (strong, nonatomic) NSString *userName; + +/** see password an NSString object containing the user's password. If userName is nil, password must be nil as well.*/ +@property (strong, nonatomic) NSString *password; + +/** see keepAliveInterval The Keep Alive is a time interval measured in seconds. + * The MQTTClient ensures that the interval between Control Packets being sent does not exceed + * the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. + */ +@property (nonatomic) UInt16 keepAliveInterval; + +/** The serverKeepAlive is a time interval measured in seconds. + * This value may be set by the broker and overrides keepAliveInterval if present + * Zero means the broker does not perform any keep alive checks + */ +@property (readonly, strong, nonatomic) NSNumber *serverKeepAlive; + +/** effectiveKeepAlive is a time interval measured in seconds + * It indicates the effective keep alive interval after a successfull connect + * where keepAliveInterval might have been overridden by the broker. + */ +@property (readonly, nonatomic) UInt16 effectiveKeepAlive; + + +/** + * dupTimeout If PUBACK or PUBREC not received, message will be resent after this interval + */ +@property (nonatomic) double dupTimeout; + +/** leanSessionFlag specifies if the server should discard previous session information. */ +@property (nonatomic) BOOL cleanSessionFlag; + +/** willFlag If the Will Flag is set to YES this indicates that + * a Will Message MUST be published by the Server when the Server detects + * that the Client is disconnected for any reason other than the Client flowing a DISCONNECT Packet. + */ +@property (nonatomic) BOOL willFlag; + +/** willTopic If the Will Flag is set to YES, the Will Topic is a string, nil otherwise. */ +@property (strong, nonatomic) NSString *willTopic; + +/** willMsg If the Will Flag is set to YES the Will Message must be specified, nil otherwise. */ +@property (strong, nonatomic) NSData *willMsg; + +/** willQoS specifies the QoS level to be used when publishing the Will Message. + * If the Will Flag is set to NO, then the Will QoS MUST be set to 0. + * If the Will Flag is set to YES, the Will QoS MUST be a valid MQTTQosLevel. + */ +@property (nonatomic) MQTTQosLevel willQoS; + +/** willRetainFlag indicates if the server should publish the Will Messages with retainFlag. + * If the Will Flag is set to NO, then the Will Retain Flag MUST be set to NO . + * If the Will Flag is set to YES: If Will Retain is set to NO, the Serve + * MUST publish the Will Message as a non-retained publication [MQTT-3.1.2-14]. + * If Will Retain is set to YES, the Server MUST publish the Will Message as a retained publication [MQTT-3.1.2-15]. + */ +@property (nonatomic) BOOL willRetainFlag; + +/** protocolLevel specifies the protocol to be used */ +@property (nonatomic) MQTTProtocolVersion protocolLevel; + +/** sessionExpiryInterval specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *sessionExpiryInterval; + +/** authMethod specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSString *authMethod; + +/** authData specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSData *authData; + +/** requestProblemInformation specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *requestProblemInformation; + +/** willDelayInterval specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *willDelayInterval; + +/** requestResponseInformation specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *requestResponseInformation; + +/** receiveMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *receiveMaximum; + +/** topicAliasMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *topicAliasMaximum; + +/** topicAliasMaximum specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSDictionary *userProperty; + +/** maximumPacketSize specifies the number of seconds after which a session should expire MQTT v5.0*/ +@property (strong, nonatomic) NSNumber *maximumPacketSize; + +/** queue The queue where the streams are scheduled. */ +@property (strong, nonatomic) dispatch_queue_t queue; + + +/** for mqttio-OBJC backward compatibility + the connect message used is stored here + */ +@property (strong, nonatomic) MQTTMessage *connectMessage; + +/** the transport provider for MQTTClient + * + * assign an in instance of a class implementing the MQTTTransport protocol e.g. + * MQTTCFSocketTransport before connecting. + */ +@property (strong, nonatomic) id transport; + +/** certificates an NSArray holding client certificates or nil */ +@property (strong, nonatomic) NSArray *certificates; + +/** Require for VoIP background service + * defaults to NO + */ +@property (nonatomic) BOOL voip; + +/** connect to the given host through the given transport with the given + * MQTT session parameters asynchronously + * + */ + + +- (void)connect; + +/** connects to the specified MQTT server + + @param connectHandler identifies a block which is executed on successfull or unsuccessfull connect. Might be nil + error is nil in the case of a successful connect + sessionPresent indicates in MQTT 3.1.1 if persistent session data was present at the server + returns nothing and returns immediately. To check the connect results, register as an MQTTSessionDelegate and + - watch for events + - watch for connect or connectionRefused messages + - watch for error messages + or use the connectHandler block + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connectWithConnectHandler:^(NSError *error, BOOL sessionPresent) { + if (error) { + NSLog(@"Error Connect %@", error.localizedDescription); + } else { + NSLog(@"Connected sessionPresent:%d", sessionPresent); + } + }]; + @endcode + + */ + +- (void)connectWithConnectHandler:(MQTTConnectHandler)connectHandler; + + +/** disconnect gracefully + * + */ +- (void)disconnect; + +/** disconnect V5 + * @param returnCode the returncode send to the broker + * @param sessionExpiryInterval the time in seconds before the session can be deleted + * @param reasonString a string explaining the reason + * @param userProperty additional dictionary of user key/value combinations + */ +- (void)disconnectWithReturnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty; + + +/** initialises the MQTT session with default values + @return the initialised MQTTSession object + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + @endcode + */ +- (MQTTSession *)init; + + + +/** subscribes to a topic at a specific QoS level + + @param topic see subscribeToTopic:atLevel:subscribeHandler: for description + @param qosLevel see subscribeToTopic:atLevel:subscribeHandler: for description + @return the Message Identifier of the SUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + ... + [session subscribeToTopic:@"example/#" atLevel:2]; + + @endcode + + */ + +- (UInt16)subscribeToTopic:(NSString *)topic + atLevel:(MQTTQosLevel)qosLevel; +/** subscribes to a topic at a specific QoS level + + @param topic the Topic Filter to subscribe to. + + @param qosLevel specifies the QoS Level of the subscription. + qosLevel can be 0, 1, or 2. + @param subscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. + Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an + array of grantes Qos + + + @return the Message Identifier of the SUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + ... + [session subscribeToTopic:@"example/#" atLevel:2 subscribeHandler:^(NSError *error, NSArray *gQoss){ + if (error) { + NSLog(@"Subscription failed %@", error.localizedDescription); + } else { + NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); + } + }]; + + @endcode + + */ + +- (UInt16)subscribeToTopic:(NSString *)topic + atLevel:(MQTTQosLevel)qosLevel + subscribeHandler:(MQTTSubscribeHandler)subscribeHandler; + +/** subscribes a number of topics + + @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and + the corresponding QoS as NSNumber values + + @return the Message Identifier of the SUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session subscribeToTopics:@{ + @"example/#": @(0), + @"example/status": @(2), + @"other/#": @(1) + }]; + + @endcode + */ + + +- (UInt16)subscribeToTopics:(NSDictionary *)topics; + +/** subscribes a number of topics + + @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and + the corresponding QoS as NSNumber values + @param subscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. + Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an + array of grantes Qos + + @return the Message Identifier of the SUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session subscribeToTopics:@{ + @"example/#": @(0), + @"example/status": @(2), + @"other/#": @(1) + } subscribeHandler:^(NSError *error, NSArray *gQoss){ + if (error) { + NSLog(@"Subscription failed %@", error.localizedDescription); + } else { + NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); + } + }]; + + + @endcode + */ + + +- (UInt16)subscribeToTopics:(NSDictionary *)topics + subscribeHandler:(MQTTSubscribeHandler)subscribeHandler; + +/** unsubscribes from a topic + + @param topic the Topic Filter to unsubscribe from. + + @return the Message Identifier of the UNSUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session unsubscribeTopic:@"example/#"]; + + @endcode + */ + +- (UInt16)unsubscribeTopic:(NSString *)topic; + +/** unsubscribes from a topic + + @param topic the Topic Filter to unsubscribe from. + @param unsubscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. + Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an + array of grantes Qos + + @return the Message Identifier of the UNSUBSCRIBE message. + + @note returns immediately. + + */ + + +- (UInt16)unsubscribeTopic:(NSString *)topic + unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler; + +/** unsubscribes from a number of topics + + @param topics an NSArray of topics to unsubscribe from + + @return the Message Identifier of the UNSUBSCRIBE message. + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session unsubscribeTopics:@[ + @"example/#", + @"example/status", + @"other/#" + ]]; + + @endcode + + */ + +- (UInt16)unsubscribeTopics:(NSArray *)topics; + +/** unsubscribes from a number of topics + + @param topics an NSArray of topics to unsubscribe from + + @param unsubscribeHandler identifies a block which is executed on successfull or unsuccessfull subscription. + Might be nil. error is nil in the case of a successful subscription. In this case gQoss represents an + array of grantes Qos + + @return the Message Identifier of the UNSUBSCRIBE message. + + @note returns immediately. + + */ +- (UInt16)unsubscribeTopics:(NSArray *)topics + unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler; + +/** publishes data on a given topic at a specified QoS level and retain flag + + @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. + @param topic the Topic to identify the data + @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES + @param qos specifies the Quality of Service for the publish + qos can be 0, 1, or 2. + @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session publishData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] + topic:@"example/data" + retain:YES + qos:1]; + @endcode + + */ + +- (UInt16)publishData:(NSData *)data + onTopic:(NSString *)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos; + +/** publishes data on a given topic at a specified QoS level and retain flag + + @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. + @param topic the Topic to identify the data + @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES + @param qos specifies the Quality of Service for the publish + qos can be 0, 1, or 2. + + + @param publishHandler identifies a block which is executed on successfull or unsuccessfull publsh. Might be nil + error is nil in the case of a successful connect + sessionPresent indicates in MQTT 3.1.1 if persistent session data was present at the server + + + @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped + + @note returns immediately. To check results, register as an MQTTSessionDelegate and watch for events. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + [session publishData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] + topic:@"example/data" + retain:YES + qos:1 + publishHandler:^(NSError *error){ + if (error) { + DDLogVerbose(@"error: %@ %@", error.localizedDescription, payload); + } else { + DDLogVerbose(@"delivered:%@", payload); + delivered++; + } + }]; + @endcode + + */ + +- (UInt16)publishData:(NSData *)data + onTopic:(NSString *)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + publishHandler:(MQTTPublishHandler)publishHandler; + +/** closes an MQTTSession gracefully + + If the connection was successfully established before, a DISCONNECT is sent. + + @param disconnectHandler identifies a block which is executed on successfull or unsuccessfull disconnect. Might be nil. error is nil in the case of a successful disconnect + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + ... + [session connect]; + + ... + + [session closeWithDisconnectHandler^(NSError *error) { + if (error) { + NSLog(@"Error Disconnect %@", error.localizedDescription); + } + NSLog(@"Session closed"); + }]; + + + @endcode + + */ +- (void)closeWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler; + +/** close V5 + * @param returnCode the returncode send to the broker + * @param sessionExpiryInterval the time in seconds before the session can be deleted + * @param reasonString a string explaining the reason + * @param userProperty additional dictionary of user key/value combinations + * @param disconnectHandler will be called when the disconnect finished + */ +- (void)closeWithReturnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty + disconnectHandler:(MQTTDisconnectHandler)disconnectHandler; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m new file mode 100644 index 0000000..87828a7 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSession.m @@ -0,0 +1,1641 @@ +// +// MQTTSession.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + + +#import "MQTTSession.h" +#import "MQTTDecoder.h" +#import "MQTTStrict.h" +#import "MQTTProperties.h" +#import "MQTTMessage.h" +#import "MQTTCoreDataPersistence.h" +#import "GCDTimer.h" + +@class MQTTSSLSecurityPolicy; + +#import "MQTTLog.h" + +NSString * const MQTTSessionErrorDomain = @"MQTT"; + +@interface MQTTSession() + +@property (nonatomic, readwrite) MQTTSessionStatus status; +@property (nonatomic, readwrite) BOOL sessionPresent; + +@property (strong, nonatomic) GCDTimer *keepAliveTimer; +@property (strong, nonatomic) NSNumber *serverKeepAlive; +@property (nonatomic) UInt16 effectiveKeepAlive; +@property (strong, nonatomic) GCDTimer *checkDupTimer; + +@property (strong, nonatomic) MQTTDecoder *decoder; + +@property (copy, nonatomic) MQTTDisconnectHandler disconnectHandler; +@property (nonatomic, strong) NSMutableDictionary *subscribeHandlers; +@property (nonatomic, strong) NSMutableDictionary *unsubscribeHandlers; +@property (nonatomic, strong) NSMutableDictionary *publishHandlers; + +@property (nonatomic) UInt16 txMsgId; + +@property (nonatomic) BOOL synchronPub; +@property (nonatomic) UInt16 synchronPubMid; +@property (nonatomic) BOOL synchronUnsub; +@property (nonatomic) UInt16 synchronUnsubMid; +@property (nonatomic) BOOL synchronSub; +@property (nonatomic) UInt16 synchronSubMid; +@property (nonatomic) BOOL synchronConnect; +@property (nonatomic) BOOL synchronDisconnect; + +@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; + +@end + +#define DUPLOOP 1.0 + +@implementation MQTTSession +@synthesize certificates; + +- (void)setCertificates:(NSArray *)newCertificates { + certificates = newCertificates; + if (self.transport) { + if ([self.transport respondsToSelector:@selector(setCertificates:)]) { + [self.transport performSelector:@selector(setCertificates:) withObject:certificates]; + } + } +} + +- (instancetype)init { + DDLogVerbose(@"[MQTTSession] init"); + self = [super init]; + self.txMsgId = 1; + self.persistence = [[MQTTCoreDataPersistence alloc] init]; + self.subscribeHandlers = [[NSMutableDictionary alloc] init]; + self.unsubscribeHandlers = [[NSMutableDictionary alloc] init]; + self.publishHandlers = [[NSMutableDictionary alloc] init]; + + self.clientId = nil; + self.userName = nil; + self.password = nil; + self.keepAliveInterval = 60; + self.dupTimeout = 20.0; + self.cleanSessionFlag = true; + self.willFlag = false; + self.willTopic = nil; + self.willMsg = nil; + self.willQoS = MQTTQosLevelAtMostOnce; + self.willRetainFlag = false; + self.protocolLevel = MQTTProtocolVersion311; + self.queue = dispatch_get_main_queue(); + self.status = MQTTSessionStatusCreated; + self.streamSSLLevel = (NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL; + return self; +} + +- (void)dealloc { + [self.keepAliveTimer invalidate]; + [self.checkDupTimer invalidate]; +} + +- (NSString *)host { + return _transport.host; +} + +- (UInt32)port { + return _transport.port; +} + +- (void)setClientId:(NSString *)clientId { + if (!clientId) { + clientId = [NSString stringWithFormat:@"MQTTClient%.0f",fmod([NSDate date].timeIntervalSince1970, 1.0) * 1000000.0]; + } + + _clientId = clientId; +} + +- (void)setStreamSSLLevel:(NSString *)streamSSLLevel { + _streamSSLLevel = streamSSLLevel; + self.transport.streamSSLLevel = self.streamSSLLevel; +} + +- (UInt16)subscribeToTopic:(NSString *)topic + atLevel:(MQTTQosLevel)qosLevel { + return [self subscribeToTopic:topic atLevel:qosLevel subscribeHandler:nil]; +} + +- (UInt16)subscribeToTopic:(NSString *)topic + atLevel:(MQTTQosLevel)qosLevel + subscribeHandler:(MQTTSubscribeHandler)subscribeHandler { + return [self subscribeToTopics:topic ? @{topic: @(qosLevel)} : @{} subscribeHandler:subscribeHandler]; +} + +- (UInt16)subscribeToTopics:(NSDictionary *)topics { + return [self subscribeToTopics:topics subscribeHandler:nil]; +} + +- (void)checkTopicFilters:(NSArray *)topicFilters { + if (MQTTStrict.strict && + topicFilters.count == 0) { + NSException* myException = [NSException + exceptionWithName:@"topicFilter array in SUBSCRIBE or UNSUBSRIBE must not be empty" + reason:[NSString stringWithFormat:@"%@", topicFilters] + userInfo:nil]; + @throw myException; + } + + for (NSString *topicFilter in topicFilters) { + if (MQTTStrict.strict && + topicFilter.length < 1) { + NSException* myException = [NSException + exceptionWithName:@"topicFilter must be at least 1 characters long" + reason:[NSString stringWithFormat:@"%@", topicFilter] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + [topicFilter dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { + NSException* myException = [NSException + exceptionWithName:@"topicFilter may not be longer than 65535 bytes in UTF8 representation" + reason:[NSString stringWithFormat:@"topicFilter length = %lu", + (unsigned long)[topicFilter dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + ![topicFilter dataUsingEncoding:NSUTF8StringEncoding]) { + NSException* myException = [NSException + exceptionWithName:@"topicFilter must not contain non-UTF8 characters" + reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict) { + NSArray *components = [topicFilter componentsSeparatedByString:@"/"]; + for (int level = 0; level < components.count; level++) { + if ([components[level] rangeOfString:@"+"].location != NSNotFound && + components[level].length > 1) { + NSException* myException = [NSException + exceptionWithName:@"singlelevel wildcard must be alone on a level of a topic filter" + reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] + userInfo:nil]; + @throw myException; + } + } + + for (int level = 0; level < components.count - 1; level++) { + if ([components[level] rangeOfString:@"#"].location != NSNotFound) { + NSException* myException = [NSException + exceptionWithName:@"multilevel wildcard must be on the last level of a topic filter" + reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] + userInfo:nil]; + @throw myException; + } + } + if ([components[components.count - 1] rangeOfString:@"#"].location != NSNotFound && + components[components.count - 1].length > 1) { + NSException* myException = [NSException + exceptionWithName:@"multilevel wildcard must be alone on a level of a topic filter" + reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] + userInfo:nil]; + @throw myException; + } + } + + if (MQTTStrict.strict && + [topicFilter rangeOfString:@"#"].location != NSNotFound && + [topicFilter rangeOfString:@"#"].location != topicFilter.length && + (topicFilter.length == 1 || [[topicFilter substringWithRange:NSMakeRange(topicFilter.length - 2, 1)] isEqualToString:@"/"]) + ) { + NSException* myException = [NSException + exceptionWithName:@"multilevel wildcard must alone on the last level of a topic filter" + reason:[NSString stringWithFormat:@"topicFilter = %@", topicFilter] + userInfo:nil]; + @throw myException; + } + + } +} + +- (UInt16)subscribeToTopics:(NSDictionary *)topics subscribeHandler:(MQTTSubscribeHandler)subscribeHandler { + DDLogVerbose(@"[MQTTSession] subscribeToTopics:%@]", topics); + + [self checkTopicFilters:topics.allKeys]; + + for (NSNumber *qos in topics.allValues) { + if (MQTTStrict.strict && + qos.intValue != MQTTQosLevelAtMostOnce && + qos.intValue != MQTTQosLevelAtLeastOnce && + qos.intValue != MQTTQosLevelExactlyOnce) { + NSException* myException = [NSException + exceptionWithName:@"Illegal QoS level" + reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", qos.intValue] + userInfo:nil]; + @throw myException; + } + } + + UInt16 mid = [self nextMsgId]; + if (subscribeHandler) { + (self.subscribeHandlers)[@(mid)] = [subscribeHandler copy]; + } else { + [self.subscribeHandlers removeObjectForKey:@(mid)]; + } + (void)[self encode:[MQTTMessage subscribeMessageWithMessageId:mid + topics:topics + protocolLevel:self.protocolLevel + subscriptionIdentifier:nil]]; + + return mid; +} + +- (UInt16)unsubscribeTopic:(NSString*)topic { + return [self unsubscribeTopic:topic unsubscribeHandler:nil]; +} + +- (UInt16)unsubscribeTopic:(NSString *)topic unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler { + return [self unsubscribeTopics:topic ? @[topic] : @[] unsubscribeHandler:unsubscribeHandler]; +} + +- (UInt16)unsubscribeTopics:(NSArray *)topics { + return [self unsubscribeTopics:topics unsubscribeHandler:nil]; +} + +- (UInt16)unsubscribeTopics:(NSArray *)topics unsubscribeHandler:(MQTTUnsubscribeHandler)unsubscribeHandler { + DDLogVerbose(@"[MQTTSession] unsubscribeTopics:%@", topics); + + [self checkTopicFilters:topics]; + + UInt16 mid = [self nextMsgId]; + if (unsubscribeHandler) { + (self.unsubscribeHandlers)[@(mid)] = [unsubscribeHandler copy]; + } else { + [self.unsubscribeHandlers removeObjectForKey:@(mid)]; + } + (void)[self encode:[MQTTMessage unsubscribeMessageWithMessageId:mid + topics:topics + protocolLevel:self.protocolLevel]]; + return mid; +} + +- (UInt16)publishData:(NSData*)data + onTopic:(NSString*)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos { + return [self publishData:data onTopic:topic retain:retainFlag qos:qos publishHandler:nil]; +} + +- (UInt16)publishData:(NSData *)data + onTopic:(NSString *)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + publishHandler:(MQTTPublishHandler)publishHandler +{ + DDLogVerbose(@"[MQTTSession] publishData:%@... onTopic:%@ retain:%d qos:%ld publishHandler:%p", + [data subdataWithRange:NSMakeRange(0, MIN(256, data.length))], + [topic substringWithRange:NSMakeRange(0, MIN(256, topic.length))], + retainFlag, + (long)qos, + publishHandler); + + if (MQTTStrict.strict && + !topic) { + NSException* myException = [NSException + exceptionWithName:@"topic must not be nil" + reason:[NSString stringWithFormat:@"%@", topic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + topic && + topic.length < 1) { + NSException* myException = [NSException + exceptionWithName:@"topic must not at least 1 character long" + reason:[NSString stringWithFormat:@"%@", topic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + topic && + [topic dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { + NSException* myException = [NSException + exceptionWithName:@"topic may not be longer than 65535 bytes in UTF8 representation" + reason:[NSString stringWithFormat:@"topic length = %lu", + (unsigned long)[topic dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + topic && + ![topic dataUsingEncoding:NSUTF8StringEncoding]) { + NSException* myException = [NSException + exceptionWithName:@"topic must not contain non-UTF8 characters" + reason:[NSString stringWithFormat:@"topic = %@", topic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willTopic && + ([self.willTopic containsString:@"+"] || + [self.willTopic containsString:@"#"]) + ) { + NSException* myException = [NSException + exceptionWithName:@"willTopic must not contain wildcards" + reason:[NSString stringWithFormat:@"willTopic = %@", self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + qos != MQTTQosLevelAtMostOnce && + qos != MQTTQosLevelAtLeastOnce && + qos != MQTTQosLevelExactlyOnce) { + NSException* myException = [NSException + exceptionWithName:@"Illegal QoS level" + reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", qos] + userInfo:nil]; + @throw myException; + } + + UInt16 msgId = 0; + if (!qos) { + MQTTMessage *msg = [MQTTMessage publishMessageWithData:data + onTopic:topic + qos:qos + msgId:msgId + retainFlag:retainFlag + dupFlag:FALSE + protocolLevel:self.protocolLevel + payloadFormatIndicator:nil + publicationExpiryInterval:nil + topicAlias:nil + responseTopic:nil + correlationData:nil + userProperty:nil + contentType:nil]; + NSError *error = nil; + if (![self encode:msg]) { + error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorEncoderNotReady + userInfo:@{NSLocalizedDescriptionKey : @"Encoder not ready"}]; + } + if (publishHandler) { + [self onPublish:publishHandler error:error]; + } + } else { + msgId = [self nextMsgId]; + MQTTMessage *msg = nil; + + id flow; + if (self.status == MQTTSessionStatusConnected) { + NSArray *flows = [self.persistence allFlowsforClientId:self.clientId + incomingFlag:NO]; + + BOOL unprocessedMessageNotExists = TRUE; + NSUInteger windowSize = 0; + for (id flow in flows) { + if ((flow.commandType).intValue != MQTT_None) { + windowSize++; + } else { + unprocessedMessageNotExists = FALSE; + } + } + if (unprocessedMessageNotExists && windowSize <= self.persistence.maxWindowSize) { + msg = [MQTTMessage publishMessageWithData:data + onTopic:topic + qos:qos + msgId:msgId + retainFlag:retainFlag + dupFlag:FALSE + protocolLevel:self.protocolLevel + payloadFormatIndicator:nil + publicationExpiryInterval:nil + topicAlias:nil + responseTopic:nil + correlationData:nil + userProperty:nil + contentType:nil]; + flow = [self.persistence storeMessageForClientId:self.clientId + topic:topic + data:data + retainFlag:retainFlag + qos:qos + msgId:msgId + incomingFlag:NO + commandType:MQTTPublish + deadline:[NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]]; + } + } + if (!msg) { + flow = [self.persistence storeMessageForClientId:self.clientId + topic:topic + data:data + retainFlag:retainFlag + qos:qos + msgId:msgId + incomingFlag:NO + commandType:MQTT_None + deadline:[NSDate date]]; + } + if (!flow) { + DDLogWarn(@"[MQTTSession] dropping outgoing message %d", msgId); + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorDroppingOutgoingMessage + userInfo:@{NSLocalizedDescriptionKey : @"Dropping outgoing Message"}]; + if (publishHandler) { + [self onPublish:publishHandler error:error]; + } + msgId = 0; + } else { + [self.persistence sync]; + if (publishHandler) { + (self.publishHandlers)[@(msgId)] = [publishHandler copy]; + } else { + [self.publishHandlers removeObjectForKey:@(msgId)]; + } + + if ((flow.commandType).intValue == MQTTPublish) { + DDLogVerbose(@"[MQTTSession] PUBLISH %d", msgId); + if (![self encode:msg]) { + DDLogInfo(@"[MQTTSession] queueing message %d after unsuccessfull attempt", msgId); + flow.commandType = [NSNumber numberWithUnsignedInt:MQTT_None]; + flow.deadline = [NSDate date]; + [self.persistence sync]; + } + } else { + DDLogInfo(@"[MQTTSession] queueing message %d", msgId); + } + } + } + [self tell]; + return msgId; +} + +- (void)closeWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler { + [self closeWithReturnCode:MQTTSuccess + sessionExpiryInterval:nil + reasonString:nil + userProperty:nil + disconnectHandler:disconnectHandler]; +} + +- (void)closeWithReturnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty + disconnectHandler:(MQTTDisconnectHandler)disconnectHandler { + DDLogVerbose(@"[MQTTSession] closeWithDisconnectHandler:%p ", disconnectHandler); + self.disconnectHandler = disconnectHandler; + + if (self.status == MQTTSessionStatusConnected) { + [self disconnectWithReturnCode:returnCode + sessionExpiryInterval:sessionExpiryInterval + reasonString:reasonString + userProperty:userProperty]; + } else { + [self closeInternal]; + } +} + +- (void)disconnect { + [self disconnectWithReturnCode:MQTTSuccess + sessionExpiryInterval:nil + reasonString:nil + userProperty:nil]; +} + +- (void)disconnectWithReturnCode:(MQTTReturnCode)returnCode + sessionExpiryInterval:(NSNumber *)sessionExpiryInterval + reasonString:(NSString *)reasonString + userProperty:(NSDictionary *)userProperty { + DDLogVerbose(@"[MQTTSession] sending DISCONNECT"); + self.status = MQTTSessionStatusDisconnecting; + + [self encode:[MQTTMessage disconnectMessage:self.protocolLevel + returnCode:returnCode + sessionExpiryInterval:sessionExpiryInterval + reasonString:reasonString + userProperty:userProperty]]; + [self closeInternal]; +} + +- (void)closeInternal { + DDLogVerbose(@"[MQTTSession] closeInternal"); + + if (self.checkDupTimer) { + [self.checkDupTimer invalidate]; + self.checkDupTimer = nil; + } + + if (self.keepAliveTimer) { + [self.keepAliveTimer invalidate]; + self.keepAliveTimer = nil; + } + + if (self.transport) { + [self.transport close]; + self.transport.delegate = nil; + } + + if(self.decoder){ + [self.decoder close]; + self.decoder.delegate = nil; + } + + NSArray *flows = [self.persistence allFlowsforClientId:self.clientId + incomingFlag:NO]; + for (id flow in flows) { + switch ((flow.commandType).intValue) { + case MQTTPublish: + case MQTTPubrel: + flow.deadline = [flow.deadline dateByAddingTimeInterval:-self.dupTimeout]; + [self.persistence sync]; + break; + } + } + + self.status = MQTTSessionStatusClosed; + if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { + [self.delegate handleEvent:self event:MQTTSessionEventConnectionClosed error:nil]; + } + if ([self.delegate respondsToSelector:@selector(connectionClosed:)]) { + [self.delegate connectionClosed:self]; + } + + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorNoResponse + userInfo:@{NSLocalizedDescriptionKey : @"No response"}]; + + NSArray *allSubscribeHandlers = self.subscribeHandlers.allValues; + [self.subscribeHandlers removeAllObjects]; + for (MQTTSubscribeHandler subscribeHandler in allSubscribeHandlers) { + subscribeHandler(error, nil); + } + + NSArray *allUnsubscribeHandlers = self.unsubscribeHandlers.allValues; + [self.unsubscribeHandlers removeAllObjects]; + for (MQTTUnsubscribeHandler unsubscribeHandler in allUnsubscribeHandlers) { + unsubscribeHandler(error); + } + + MQTTDisconnectHandler disconnectHandler = self.disconnectHandler; + if (disconnectHandler) { + self.disconnectHandler = nil; + disconnectHandler(nil); + } + + [self tell]; + self.synchronPub = FALSE; + self.synchronPubMid = 0; + self.synchronSub = FALSE; + self.synchronSubMid = 0; + self.synchronUnsub = FALSE; + self.synchronUnsubMid = 0; +} + + +- (void)keepAlive { + DDLogVerbose(@"[MQTTSession] keepAlive %@ @%.0f", self.clientId, [[NSDate date] timeIntervalSince1970]); + (void)[self encode:[MQTTMessage pingreqMessage]]; +} + +- (void)checkDup { + DDLogVerbose(@"[MQTTSession] checkDup %@ @%.0f", self.clientId, [[NSDate date] timeIntervalSince1970]); + [self checkTxFlows]; +} + +- (void)checkTxFlows { + NSUInteger windowSize; + MQTTMessage *message; + if (self.status != MQTTSessionStatusConnected) { + return; + } + + NSArray *flows = [self.persistence allFlowsforClientId:self.clientId + incomingFlag:NO]; + windowSize = 0; + message = nil; + + for (id flow in flows) { + if ((flow.commandType).intValue != MQTT_None) { + windowSize++; + } + } + for (id flow in flows) { + DDLogVerbose(@"[MQTTSession] %@ flow %@ %@ %@", self.clientId, flow.deadline, flow.commandType, flow.messageId); + if ([flow.deadline compare:[NSDate date]] == NSOrderedAscending) { + switch ((flow.commandType).intValue) { + case 0: + if (windowSize <= self.persistence.maxWindowSize) { + DDLogVerbose(@"[MQTTSession] PUBLISH queued message %@", flow.messageId); + message = [MQTTMessage publishMessageWithData:flow.data + onTopic:flow.topic + qos:(flow.qosLevel).intValue + msgId:(flow.messageId).intValue + retainFlag:(flow.retainedFlag).boolValue + dupFlag:NO + protocolLevel:self.protocolLevel + payloadFormatIndicator:nil + publicationExpiryInterval:nil + topicAlias:nil + responseTopic:nil + correlationData:nil + userProperty:nil + contentType:nil]; + if ([self encode:message]) { + flow.commandType = @(MQTTPublish); + flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; + [self.persistence sync]; + windowSize++; + } + } + break; + case MQTTPublish: + DDLogInfo(@"[MQTTSession] resend PUBLISH %@", flow.messageId); + message = [MQTTMessage publishMessageWithData:flow.data + onTopic:flow.topic + qos:(flow.qosLevel).intValue + msgId:(flow.messageId).intValue + retainFlag:(flow.retainedFlag).boolValue + dupFlag:YES + protocolLevel:self.protocolLevel + payloadFormatIndicator:nil + publicationExpiryInterval:nil + topicAlias:nil + responseTopic:nil + correlationData:nil + userProperty:nil + contentType:nil]; + if ([self encode:message]) { + flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; + [self.persistence sync]; + } + break; + case MQTTPubrel: + DDLogInfo(@"[MQTTSession] resend PUBREL %@", flow.messageId); + message = [MQTTMessage pubrelMessageWithMessageId:(flow.messageId).intValue + protocolLevel:self.protocolLevel + returnCode:MQTTSuccess + reasonString:nil + userProperty:nil]; + if ([self encode:message]) { + flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; + [self.persistence sync]; + } + break; + default: + break; + } + } + } +} + +- (void)decoder:(MQTTDecoder *)sender handleEvent:(MQTTDecoderEvent)eventCode error:(NSError *)error { + __unused NSArray *events = @[ + @"MQTTDecoderEventProtocolError", + @"MQTTDecoderEventConnectionClosed", + @"MQTTDecoderEventConnectionError" + ]; + DDLogVerbose(@"[MQTTSession] decoder handleEvent: %@ (%d) %@", + events[eventCode % [events count]], + eventCode, + [error description]); + + switch (eventCode) { + case MQTTDecoderEventConnectionClosed: + [self error:MQTTSessionEventConnectionClosedByBroker error:error]; + break; + case MQTTDecoderEventConnectionError: + [self connectionError:error]; + break; + case MQTTDecoderEventProtocolError: + [self protocolError:error]; + break; + } + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } +} + +- (void)decoder:(MQTTDecoder *)sender didReceiveMessage:(NSData *)data { + MQTTMessage *message = [MQTTMessage messageFromData:data protocolLevel:self.protocolLevel]; + if (!message) { + DDLogError(@"[MQTTSession] MQTT illegal message received"); + NSError * error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorIllegalMessageReceived + userInfo:@{NSLocalizedDescriptionKey : @"MQTT illegal message received"}]; + [self protocolError:error]; + + return; + } + + @synchronized(sender) { + if ([self.delegate respondsToSelector:@selector(received:type:qos:retained:duped:mid:data:)]) { + [self.delegate received:self + type:message.type + qos:message.qos + retained:message.retainFlag + duped:message.dupFlag + mid:message.mid + data:message.data]; + } + if ([self.delegate respondsToSelector:@selector(ignoreReceived:type:qos:retained:duped:mid:data:)]) { + if ([self.delegate ignoreReceived:self + type:message.type + qos:message.qos + retained:message.retainFlag + duped:message.dupFlag + mid:message.mid + data:message.data]) { + return; + } + } + switch (self.status) { + case MQTTSessionStatusConnecting: + switch (message.type) { + case MQTTConnack: + if ((self.protocolLevel == MQTTProtocolVersion50 && message.data.length < 3) || + (self.protocolLevel != MQTTProtocolVersion50 && message.data.length != 2)) { + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorInvalidConnackReceived + userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol CONNACK expected"}]; + + [self protocolError:error]; + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } + } else { + if (message.returnCode && (message.returnCode).intValue == MQTTSuccess) { + self.status = MQTTSessionStatusConnected; + if (message.connectAcknowledgeFlags && + ((message.connectAcknowledgeFlags).unsignedIntValue & 0x01) == 0x01) { + self.sessionPresent = true; + } else { + self.sessionPresent = false; + } + __weak typeof(self) weakSelf = self; + self.checkDupTimer = [GCDTimer scheduledTimerWithTimeInterval:DUPLOOP + repeats:YES + queue:self.queue + block:^{ + [weakSelf checkDup]; + }]; + [self checkDup]; + + if (message.properties) { + self.serverKeepAlive = message.properties.serverKeepAlive; + } + if (self.serverKeepAlive) { + self.effectiveKeepAlive = (self.serverKeepAlive).unsignedShortValue; + } else { + self.effectiveKeepAlive = self.keepAliveInterval; + } + + if (self.effectiveKeepAlive > 0) { + self.keepAliveTimer = [GCDTimer scheduledTimerWithTimeInterval:self.effectiveKeepAlive + repeats:YES + queue: self.queue + block:^() { + [weakSelf keepAlive]; + }]; + } + + if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { + [self.delegate handleEvent:self event:MQTTSessionEventConnected error:nil]; + } + if ([self.delegate respondsToSelector:@selector(connected:)]) { + [self.delegate connected:self]; + } + if ([self.delegate respondsToSelector:@selector(connected:sessionPresent:)]) { + [self.delegate connected:self sessionPresent:self.sessionPresent]; + } + + if (self.connectionHandler) { + self.connectionHandler(MQTTSessionEventConnected); + } + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:nil]; + } + + } else { + NSString *errorDescription = @"unknown"; + NSInteger errorCode = 0; + if (message.returnCode) { + switch ((message.returnCode).intValue) { + case 1: + errorDescription = @"MQTT CONNACK: unacceptable protocol version"; + errorCode = MQTTSessionErrorConnackUnacceptableProtocolVersion; + break; + case 2: + errorDescription = @"MQTT CONNACK: identifier rejected"; + errorCode = MQTTSessionErrorConnackIdentifierRejected; + break; + case 3: + errorDescription = @"MQTT CONNACK: server unavailable"; + errorCode = MQTTSessionErrorConnackServeUnavailable; + break; + case 4: + errorDescription = @"MQTT CONNACK: bad user name or password"; + errorCode = MQTTSessionErrorConnackBadUsernameOrPassword; + break; + case 5: + errorDescription = @"MQTT CONNACK: not authorized"; + errorCode = MQTTSessionErrorConnackNotAuthorized; + break; + default: + errorDescription = @"MQTT CONNACK: reserved for future use"; + errorCode = MQTTSessionErrorConnackReserved; + break; + } + } + + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:errorCode + userInfo:@{NSLocalizedDescriptionKey : errorDescription}]; + [self error:MQTTSessionEventConnectionRefused error:error]; + if ([self.delegate respondsToSelector:@selector(connectionRefused:error:)]) { + [self.delegate connectionRefused:self error:error]; + } + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } + } + + self.synchronConnect = FALSE; + } + break; + case MQTTDisconnect: { + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:(message.returnCode).intValue + userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol DISCONNECT instead of CONNACK"}]; + + [self protocolError:error]; + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } + break; + } + default: { + NSError * error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorNoConnackReceived + userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol no CONNACK"}]; + [self protocolError:error]; + MQTTConnectHandler connectHandler = self.connectHandler; + if (connectHandler) { + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } + break; + } + } + break; + case MQTTSessionStatusConnected: + switch (message.type) { + case MQTTPublish: + [self handlePublish:message]; + break; + case MQTTPuback: + [self handlePuback:message]; + break; + case MQTTPubrec: + [self handlePubrec:message]; + break; + case MQTTPubrel: + [self handlePubrel:message]; + break; + case MQTTPubcomp: + [self handlePubcomp:message]; + break; + case MQTTSuback: + [self handleSuback:message]; + break; + case MQTTUnsuback: + [self handleUnsuback:message]; + break; + case MQTTDisconnect: { + NSError *error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:(message.returnCode).intValue + userInfo:@{NSLocalizedDescriptionKey : @"MQTT protocol DISCONNECT received"}]; + + [self protocolError:error]; + } + + default: + break; + } + break; + default: + DDLogError(@"[MQTTSession] other state"); + break; + } + } +} + +- (void)handlePublish:(MQTTMessage*)msg { + NSData *data = msg.data; + if (data.length < 2) { + return; + } + UInt8 const *bytes = data.bytes; + UInt16 topicLength = 256 * bytes[0] + bytes[1]; + if (data.length < 2 + topicLength) { + return; + } + NSData *topicData = [data subdataWithRange:NSMakeRange(2, topicLength)]; + NSString *topic = [[NSString alloc] initWithData:topicData + encoding:NSUTF8StringEncoding]; + if (!topic) { + topic = [[NSString alloc] initWithData:topicData + encoding:NSISOLatin1StringEncoding]; + DDLogError(@"non UTF8 topic %@", topic); + } + NSRange range = NSMakeRange(2 + topicLength, data.length - topicLength - 2); + data = [data subdataWithRange:range]; + + if (msg.qos == 0) { + if (self.protocolLevel == MQTTProtocolVersion50) { + int propertiesLength = [MQTTProperties getVariableLength:data]; + int variableLength = [MQTTProperties variableIntLength:propertiesLength]; + msg.properties = [[MQTTProperties alloc] initFromData:data]; + NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); + data = [data subdataWithRange:range]; + } + if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { + [self.delegate newMessage:self + data:data + onTopic:topic + qos:msg.qos + retained:msg.retainFlag + mid:0]; + } + if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { + [self.delegate newMessageWithFeedback:self + data:data + onTopic:topic + qos:msg.qos + retained:msg.retainFlag + mid:0]; + } + if (self.messageHandler) { + self.messageHandler(data, topic); + } + } else { + if (data.length >= 2) { + bytes = data.bytes; + UInt16 msgId = 256 * bytes[0] + bytes[1]; + msg.mid = msgId; + data = [data subdataWithRange:NSMakeRange(2, data.length - 2)]; + if (msg.qos == 1) { + if (self.protocolLevel == MQTTProtocolVersion50) { + int propertiesLength = [MQTTProperties getVariableLength:data]; + int variableLength = [MQTTProperties variableIntLength:propertiesLength]; + msg.properties = [[MQTTProperties alloc] initFromData:data]; + NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); + data = [data subdataWithRange:range]; + } + + BOOL processed = true; + if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { + [self.delegate newMessage:self + data:data + onTopic:topic + qos:msg.qos + retained:msg.retainFlag + mid:msgId]; + } + if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { + processed = [self.delegate newMessageWithFeedback:self + data:data + onTopic:topic + qos:msg.qos + retained:msg.retainFlag + mid:msgId]; + } + if (self.messageHandler) { + self.messageHandler(data, topic); + } + if (processed) { + (void)[self encode:[MQTTMessage pubackMessageWithMessageId:msgId + protocolLevel:self.protocolLevel + returnCode:MQTTSuccess + reasonString:nil + userProperty:nil]]; + } + return; + } else { + if (![self.persistence storeMessageForClientId:self.clientId + topic:topic + data:data + retainFlag:msg.retainFlag + qos:msg.qos + msgId:msgId + incomingFlag:YES + commandType:MQTTPubrec + deadline:[NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]]) { + DDLogWarn(@"[MQTTSession] dropping incoming messages"); + } else { + [self.persistence sync]; + [self tell]; + (void)[self encode:[MQTTMessage pubrecMessageWithMessageId:msgId + protocolLevel:self.protocolLevel + returnCode:MQTTSuccess + reasonString:nil + userProperty:nil]]; + } + } + } + } +} + +- (void)handlePuback:(MQTTMessage*)msg { + id flow = [self.persistence flowforClientId:self.clientId + incomingFlag:NO + messageId:msg.mid]; + if (flow) { + if ((flow.commandType).intValue == MQTTPublish && (flow.qosLevel).intValue == MQTTQosLevelAtLeastOnce) { + if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:)]) { + [self.delegate messageDelivered:self msgID:msg.mid]; + } + if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:topic:data:qos:retainFlag:)]) { + [self.delegate messageDelivered:self + msgID:msg.mid + topic:flow.topic + data:flow.data + qos:(flow.qosLevel).intValue + retainFlag:(flow.retainedFlag).boolValue]; + } + if (self.synchronPub && self.synchronPubMid == msg.mid) { + self.synchronPub = FALSE; + } + MQTTPublishHandler publishHandler = (self.publishHandlers)[@(msg.mid)]; + if (publishHandler) { + [self.publishHandlers removeObjectForKey:@(msg.mid)]; + [self onPublish:publishHandler error:nil]; + } + [self.persistence deleteFlow:flow]; + [self.persistence sync]; + [self tell]; + } + } +} + +- (void)handleSuback:(MQTTMessage*)msg +{ + if (msg.data.length >= 3) { + UInt8 const *bytes = msg.data.bytes; + UInt16 messageId = (256 * bytes[0] + bytes[1]); + msg.mid = messageId; + NSMutableArray *qoss = [[NSMutableArray alloc] init]; + for (int i = 2; i < msg.data.length; i++) { + [qoss addObject:@(bytes[i])]; + } + if ([self.delegate respondsToSelector:@selector(subAckReceived:msgID:grantedQoss:)]) { + [self.delegate subAckReceived:self msgID:msg.mid grantedQoss:qoss]; + } + if (self.synchronSub && self.synchronSubMid == msg.mid) { + self.synchronSub = FALSE; + } + MQTTSubscribeHandler subscribeHandler = (self.subscribeHandlers)[@(msg.mid)]; + if (subscribeHandler) { + [self.subscribeHandlers removeObjectForKey:@(msg.mid)]; + [self onSubscribe:subscribeHandler error:nil gQoss:qoss]; + } + } +} + +- (void)handleUnsuback:(MQTTMessage *)message { + if ([self.delegate respondsToSelector:@selector(unsubAckReceived:msgID:)]) { + [self.delegate unsubAckReceived:self msgID:message.mid]; + } + if (self.synchronUnsub && self.synchronUnsubMid == message.mid) { + self.synchronUnsub = FALSE; + } + MQTTUnsubscribeHandler unsubscribeHandler = (self.unsubscribeHandlers)[@(message.mid)]; + if (unsubscribeHandler) { + [self.unsubscribeHandlers removeObjectForKey:@(message.mid)]; + [self onUnsubscribe:unsubscribeHandler error:nil]; + } +} + +- (void)handlePubrec:(MQTTMessage *)message { + MQTTMessage *pubrelmessage = [MQTTMessage pubrelMessageWithMessageId:message.mid + protocolLevel:self.protocolLevel + returnCode:MQTTSuccess + reasonString:nil + userProperty:nil]; + id flow = [self.persistence flowforClientId:self.clientId + incomingFlag:NO + messageId:message.mid]; + if (flow) { + if ((flow.commandType).intValue == MQTTPublish && (flow.qosLevel).intValue == MQTTQosLevelExactlyOnce) { + flow.commandType = @(MQTTPubrel); + flow.deadline = [NSDate dateWithTimeIntervalSinceNow:self.dupTimeout]; + [self.persistence sync]; + } + } + (void)[self encode:pubrelmessage]; +} + +- (void)handlePubrel:(MQTTMessage *)message { + id flow = [self.persistence flowforClientId:self.clientId + incomingFlag:YES + messageId:message.mid]; + if (flow) { + BOOL processed = true; + NSData *data = flow.data; + if (self.protocolLevel == MQTTProtocolVersion50) { + int propertiesLength = [MQTTProperties getVariableLength:data]; + int variableLength = [MQTTProperties variableIntLength:propertiesLength]; + NSRange range = NSMakeRange(variableLength + propertiesLength, data.length - variableLength - propertiesLength); + data = [data subdataWithRange:range]; + } + + + if ([self.delegate respondsToSelector:@selector(newMessage:data:onTopic:qos:retained:mid:)]) { + [self.delegate newMessage:self + data:data + onTopic:flow.topic + qos:(flow.qosLevel).intValue + retained:(flow.retainedFlag).boolValue + mid:(flow.messageId).intValue + ]; + } + if ([self.delegate respondsToSelector:@selector(newMessageWithFeedback:data:onTopic:qos:retained:mid:)]) { + processed = [self.delegate newMessageWithFeedback:self + data:data + onTopic:flow.topic + qos:(flow.qosLevel).intValue + retained:(flow.retainedFlag).boolValue + mid:(flow.messageId).intValue + ]; + } + if(self.messageHandler){ + self.messageHandler(flow.data, flow.topic); + } + if (processed) { + [self.persistence deleteFlow:flow]; + [self.persistence sync]; + [self tell]; + (void)[self encode:[MQTTMessage pubcompMessageWithMessageId:message.mid + protocolLevel:self.protocolLevel + returnCode:MQTTSuccess + reasonString:nil + userProperty:nil]]; + } + } +} + +- (void)handlePubcomp:(MQTTMessage *)message { + id flow = [self.persistence flowforClientId:self.clientId + incomingFlag:NO + messageId:message.mid]; + if (flow && (flow.commandType).intValue == MQTTPubrel) { + if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:)]) { + [self.delegate messageDelivered:self msgID:message.mid]; + } + if ([self.delegate respondsToSelector:@selector(messageDelivered:msgID:topic:data:qos:retainFlag:)]) { + [self.delegate messageDelivered:self + msgID:message.mid + topic:flow.topic + data:flow.data + qos:(flow.qosLevel).intValue + retainFlag:(flow.retainedFlag).boolValue]; + } + + if (self.synchronPub && self.synchronPubMid == message.mid) { + self.synchronPub = FALSE; + } + MQTTPublishHandler publishHandler = (self.publishHandlers)[@(message.mid)]; + if (publishHandler) { + [self.publishHandlers removeObjectForKey:@(message.mid)]; + [self onPublish:publishHandler error:nil]; + } + [self.persistence deleteFlow:flow]; + [self.persistence sync]; + [self tell]; + } +} + +- (void)connectionError:(NSError *)error { + [self error:MQTTSessionEventConnectionError error:error]; + if ([self.delegate respondsToSelector:@selector(connectionError:error:)]) { + [self.delegate connectionError:self error:error]; + } + if (self.connectHandler) { + MQTTConnectHandler connectHandler = self.connectHandler; + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } +} + +- (void)protocolError:(NSError *)error { + [self error:MQTTSessionEventProtocolError error:error]; + if ([self.delegate respondsToSelector:@selector(protocolError:error:)]) { + [self.delegate protocolError:self error:error]; + } +} + +- (void)error:(MQTTSessionEvent)eventCode error:(NSError *)error { + self.status = MQTTSessionStatusError; + if ([self.delegate respondsToSelector:@selector(handleEvent:event:error:)]) { + [self.delegate handleEvent:self event:eventCode error:error]; + } + [self closeInternal]; + + if(self.connectionHandler){ + self.connectionHandler(eventCode); + } + + if (eventCode == MQTTSessionEventConnectionClosedByBroker && self.connectHandler) { + error = [NSError errorWithDomain:MQTTSessionErrorDomain + code:MQTTSessionErrorConnectionRefused + userInfo:@{NSLocalizedDescriptionKey : @"Server has closed connection without connack."}]; + + MQTTConnectHandler connectHandler = self.connectHandler; + self.connectHandler = nil; + [self onConnect:connectHandler error:error]; + } + + self.synchronPub = FALSE; + self.synchronPubMid = 0; + self.synchronSub = FALSE; + self.synchronSubMid = 0; + self.synchronUnsub = FALSE; + self.synchronUnsubMid = 0; + self.synchronConnect = FALSE; + self.synchronDisconnect = FALSE; +} + +- (UInt16)nextMsgId { + DDLogVerbose(@"nextMsgId synchronizing"); + @synchronized(self) { + DDLogVerbose(@"nextMsgId synchronized"); + self.txMsgId++; + while (self.txMsgId == 0 || [self.persistence flowforClientId:self.clientId + incomingFlag:NO + messageId:self.txMsgId] != nil) { + self.txMsgId++; + } + DDLogVerbose(@"nextMsgId synchronized done"); + return self.txMsgId; + } +} + +- (void)tell { + NSUInteger incoming = [self.persistence allFlowsforClientId:self.clientId + incomingFlag:YES].count; + NSUInteger outflowing = [self.persistence allFlowsforClientId:self.clientId + incomingFlag:NO].count; + if ([self.delegate respondsToSelector:@selector(buffered:flowingIn:flowingOut:)]) { + [self.delegate buffered:self + flowingIn:incoming + flowingOut:outflowing]; + } + if ([self.delegate respondsToSelector:@selector(buffered:queued:flowingIn:flowingOut:)]) { + [self.delegate buffered:self + queued:0 + flowingIn:incoming + flowingOut:outflowing]; + } +} + +- (void)onConnect:(MQTTConnectHandler)connectHandler error:(NSError *)error { + connectHandler(error); +} + +- (void)onDisconnect:(MQTTDisconnectHandler)disconnectHandler error:(NSError *)error { + disconnectHandler(error); +} + +- (void)onSubscribe:(MQTTSubscribeHandler)subscribeHandler error:(NSError *)error gQoss:(NSArray *)gqoss { + subscribeHandler(error, gqoss); +} + +- (void)onUnsubscribe:(MQTTUnsubscribeHandler)unsubscribeHandler error:(NSError *)error { + unsubscribeHandler(error); +} + +- (void)onPublish:(MQTTPublishHandler)publishHandler error:(NSError *)error { + publishHandler(error); +} + +#pragma mark - MQTTTransport interface + +- (void)connect { + + if (MQTTStrict.strict && + self.clientId && self.clientId.length < 1 && + !self.cleanSessionFlag) { + NSException* myException = [NSException + exceptionWithName:@"clientId must be at least 1 character long if cleanSessionFlag is off" + reason:[NSString stringWithFormat:@"clientId length = %lu", + (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.clientId) { + NSException* myException = [NSException + exceptionWithName:@"clientId must not be nil" + reason:[NSString stringWithFormat:@"clientId length = %lu", + (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + [self.clientId dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { + NSException* myException = [NSException + exceptionWithName:@"clientId may not be longer than 65535 bytes in UTF8 representation" + reason:[NSString stringWithFormat:@"clientId length = %lu", + (unsigned long)[self.clientId dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + ![self.clientId dataUsingEncoding:NSUTF8StringEncoding]) { + NSException* myException = [NSException + exceptionWithName:@"clientId must not contain non-UTF8 characters" + reason:[NSString stringWithFormat:@"clientId = %@", self.clientId] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + [self.userName dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { + NSException* myException = [NSException + exceptionWithName:@"userName may not be longer than 65535 bytes in UTF8 representation" + reason:[NSString stringWithFormat:@"userName length = %lu", + (unsigned long)[self.userName dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + ![self.userName dataUsingEncoding:NSUTF8StringEncoding]) { + NSException* myException = [NSException + exceptionWithName:@"userName must not contain non-UTF8 characters" + reason:[NSString stringWithFormat:@"userName = %@", self.userName] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.userName) { + NSException* myException = [NSException + exceptionWithName:@"password specified without userName" + reason:[NSString stringWithFormat:@"password = %@", self.password] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.protocolLevel != MQTTProtocolVersion31 && + self.protocolLevel != MQTTProtocolVersion311 && + self.protocolLevel != MQTTProtocolVersion50) { + NSException* myException = [NSException + exceptionWithName:@"Illegal protocolLevel" + reason:[NSString stringWithFormat:@"%d is not 3, 4, or 5", self.protocolLevel] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.willFlag && + self.willTopic) { + NSException* myException = [NSException + exceptionWithName:@"Will topic must be nil if willFlag is false" + reason:[NSString stringWithFormat:@"%@", self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.willFlag && + self.willMsg) { + NSException* myException = [NSException + exceptionWithName:@"Will message must be nil if willFlag is false" + reason:[NSString stringWithFormat:@"%@", self.willMsg] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.willFlag && + self.willRetainFlag) { + NSException* myException = [NSException + exceptionWithName:@"Will retain must be false if willFlag is false" + reason:[NSString stringWithFormat:@"%d", self.willRetainFlag] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + !self.willFlag && + self.willQoS != MQTTQosLevelAtMostOnce) { + NSException* myException = [NSException + exceptionWithName:@"Will QoS Level must be 0 if willFlag is false" + reason:[NSString stringWithFormat:@"%d", self.willQoS] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willQoS != MQTTQosLevelAtMostOnce && + self.willQoS != MQTTQosLevelAtLeastOnce && + self.willQoS != MQTTQosLevelExactlyOnce) { + NSException* myException = [NSException + exceptionWithName:@"Illegal will QoS level" + reason:[NSString stringWithFormat:@"%d is not 0, 1, or 2", self.willQoS] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willFlag && + !self.willTopic) { + NSException* myException = [NSException + exceptionWithName:@"Will topic must not be nil if willFlag is true" + reason:[NSString stringWithFormat:@"%@", self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willTopic && + self.willTopic.length < 1) { + NSException* myException = [NSException + exceptionWithName:@"Will topic must be at least 1 character long" + reason:[NSString stringWithFormat:@"%@", self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willTopic && + [self.willTopic dataUsingEncoding:NSUTF8StringEncoding].length > 65535L) { + NSException* myException = [NSException + exceptionWithName:@"willTopic may not be longer than 65535 bytes in UTF8 representation" + reason:[NSString stringWithFormat:@"willTopic length = %lu", + (unsigned long)[self.willTopic dataUsingEncoding:NSUTF8StringEncoding].length] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willTopic && + ![self.willTopic dataUsingEncoding:NSUTF8StringEncoding]) { + NSException* myException = [NSException + exceptionWithName:@"willTopic must not contain non-UTF8 characters" + reason:[NSString stringWithFormat:@"willTopic = %@", self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willTopic && + ([self.willTopic containsString:@"+"] || + [self.willTopic containsString:@"#"]) + ) { + NSException* myException = [NSException + exceptionWithName:@"willTopic must not contain wildcards" + reason:[NSString stringWithFormat:@"willTopic = %@", self.self.willTopic] + userInfo:nil]; + @throw myException; + } + + if (MQTTStrict.strict && + self.willFlag && + !self.willMsg) { + NSException* myException = [NSException + exceptionWithName:@"Will message must not be nil if willFlag is true" + reason:[NSString stringWithFormat:@"%@", self.willMsg] + userInfo:nil]; + @throw myException; + } + + DDLogVerbose(@"[MQTTSession] connecting"); + if (self.cleanSessionFlag) { + [self.persistence deleteAllFlowsForClientId:self.clientId]; + [self.subscribeHandlers removeAllObjects]; + [self.unsubscribeHandlers removeAllObjects]; + [self.publishHandlers removeAllObjects]; + } + [self tell]; + + self.status = MQTTSessionStatusConnecting; + + self.decoder = [[MQTTDecoder alloc] init]; + self.decoder.queue = self.queue; + self.decoder.delegate = self; + [self.decoder open]; + + self.transport.delegate = self; + [self.transport open]; +} + +- (void)connectWithConnectHandler:(MQTTConnectHandler)connectHandler { + DDLogVerbose(@"[MQTTSession] connectWithConnectHandler:%p", connectHandler); + self.connectHandler = connectHandler; + [self connect]; +} + +- (BOOL)encode:(MQTTMessage *)message { + if (message) { + NSData *wireFormat = message.wireFormat; + if (wireFormat) { + if (self.delegate) { + if ([self.delegate respondsToSelector:@selector(sending:type:qos:retained:duped:mid:data:)]) { + [self.delegate sending:self + type:message.type + qos:message.qos + retained:message.retainFlag + duped:message.dupFlag + mid:message.mid + data:message.data]; + } + } + DDLogVerbose(@"[MQTTSession] mqttTransport send"); + return [self.transport send:wireFormat]; + } else { + DDLogError(@"[MQTTSession] trying to send message without wire format"); + return false; + } + } else { + DDLogError(@"[MQTTSession] trying to send nil message"); + return false; + } +} + +#pragma mark - MQTTTransport delegate +- (void)mqttTransport:(id)mqttTransport didReceiveMessage:(NSData *)message { + DDLogVerbose(@"[MQTTSession] mqttTransport didReceiveMessage"); + + [self.decoder decodeMessage:message]; + +} + +- (void)mqttTransportDidClose:(id)mqttTransport { + DDLogVerbose(@"[MQTTSession] mqttTransport mqttTransportDidClose"); + + [self error:MQTTSessionEventConnectionClosedByBroker error:nil]; + +} + +- (void)mqttTransportDidOpen:(id)mqttTransport { + DDLogVerbose(@"[MQTTSession] mqttTransportDidOpen"); + + DDLogVerbose(@"[MQTTSession] sending CONNECT"); + + if (!self.connectMessage) { + (void)[self encode:[MQTTMessage connectMessageWithClientId:self.clientId + userName:self.userName + password:self.password + keepAlive:self.keepAliveInterval + cleanSession:self.cleanSessionFlag + will:self.willFlag + willTopic:self.willTopic + willMsg:self.willMsg + willQoS:self.willQoS + willRetain:self.willRetainFlag + protocolLevel:self.protocolLevel + sessionExpiryInterval:self.sessionExpiryInterval + authMethod:self.authMethod + authData:self.authData + requestProblemInformation:self.requestProblemInformation + willDelayInterval:self.willDelayInterval + requestResponseInformation:self.requestResponseInformation + receiveMaximum:self.receiveMaximum + topicAliasMaximum:self.topicAliasMaximum + userProperty:self.userProperty + maximumPacketSize:self.maximumPacketSize]]; + } else { + (void)[self encode:self.connectMessage]; + } +} + +- (void)mqttTransport:(id)mqttTransport didFailWithError:(NSError *)error { + DDLogWarn(@"[MQTTSession] mqttTransport didFailWithError %@", error); + + [self connectionError:error]; +} +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h new file mode 100644 index 0000000..b0f075a --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.h @@ -0,0 +1,112 @@ +// +// MQTTSessionLegacy.h +// MQTTClient.framework +// + +/** + Using MQTT in your Objective-C application + This file contains definitions for mqttio-OBJC backward compatibility + + @author Christoph Krey c@ckrey.de + @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. + + based on Copyright (c) 2011, 2013, 2lemetry LLC + All rights reserved. This program and the accompanying materials + are made available under the terms of the Eclipse Public License v1.0 + which accompanies this distribution, and is available at + http://www.eclipse.org/legal/epl-v10.html + + @see http://mqtt.org + */ + + +#import +#import "MQTTSession.h" + +@interface MQTTSession(Create) + +/** initialises the MQTT session + * + * this constructor can specifies SSL securityPolicy. the default value of securityPolicy is nil(which do nothing). + * + * if SSL is enabled, by default it only evaluate server's certificates using CA infrastructure, and for most case, this type of check is enough. + * However, if your app using security model which require pinning SSL certificates to helps prevent man-in-the-middle attacks + * and other vulnerabilities. you may need to set securityPolicy to properly value(see MQTTSSLSecurityPolicy.h for more detail). + * + * NOTE: about self-signed server certificates: + * In CA infrastructure, you may establish a SSL/TLS connection with server which using self-signed certificates + * by install the certificates into OS keychain(either programmatically or manually). however, this method has some disadvantages: + * 1. every socket you app created will trust certificates you added. + * 2. if user choice to remove certificates from keychain, you app need to handling certificates re-adding. + * + * If you only want to verify the cert for the socket you are creating and for no other sockets in your app, you need to use + * MQTTSSLSecurityPolicy. + * And if you use self-signed server certificates, your need to set property: MQTTSSLSecurityPolicy.allowInvalidCertificates=YES + * (see MQTTSSLSecurityPolicy.h for more detail). + * + * @param clientId The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. + * @param userName an NSString object containing the user's name (or ID) for authentication. May be nil. + * @param password an NSString object containing the user's password. If userName is nil, password must be nil as well. + * @param keepAliveInterval The Keep Alive is a time interval measured in seconds. The MQTTClient ensures that the interval between Control Packets being sent does not exceed the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. + * @param cleanSessionFlag specifies if the server should discard previous session information. + * @param willFlag If the Will Flag is set to YES this indicates that a Will Message MUST be published by the Server when the Server detects that the Client is disconnected for any reason other than the Client flowing a DISCONNECT Packet. + * @param willTopic If the Will Flag is set to YES, the Will Topic is a string, nil otherwise. + * @param willMsg If the Will Flag is set to YES the Will Message must be specified, nil otherwise. + * @param willQoS specifies the QoS level to be used when publishing the Will Message. If the Will Flag is set to NO, then the Will QoS MUST be set to 0. If the Will Flag is set to YES, the value of Will QoS can be 0 (0x00), 1 (0x01), or 2 (0x02). + * @param willRetainFlag indicates if the server should publish the Will Messages with retainFlag. If the Will Flag is set to NO, then the Will Retain Flag MUST be set to NO . If the Will Flag is set to YES: If Will Retain is set to NO, the Server MUST publish the Will Message as a non-retained publication [MQTT-3.1.2-14]. If Will Retain is set to YES, the Server MUST publish the Will Message as a retained publication [MQTT-3.1.2-15]. + * @param protocolLevel specifies the protocol to be used. The value of the Protocol Level field for the version 3.1.1 of the protocol is 4. The value for the version 3.1 is 3. + * @param queue The queue where the streams are scheduled. + * @param securityPolicy The security policy used to evaluate server trust for secure connections. + * @param certificates An identity certificate used to reply to a server requiring client certificates according to the description given for SSLSetCertificate(). You may build the certificates array yourself or use the sundry method clientCertFromP12 + * @return the initialised MQTTSession object + * + * @code + #import "MQTTClient.h" + + NSString* certificate = [[NSBundle bundleForClass:[MQTTSession class]] pathForResource:@"certificate" ofType:@"cer"]; + MQTTSSLSecurityPolicy *securityPolicy = [MQTTSSLSecurityPolicy policyWithPinningMode:MQTTSSLPinningModeCertificate]; + securityPolicy.pinnedCertificates = @[ [NSData dataWithContentsOfFile:certificate] ]; + securityPolicy.allowInvalidCertificates = YES; // if your certificate is self-signed(which didn't coupled with CA infrastructure) + + MQTTSession *session = [[MQTTSession alloc] + initWithClientId:@"example-1234" + userName:@"user" + password:@"secret" + keepAlive:60 + cleanSession:YES + will:YES + willTopic:@"example/status" + willMsg:[[@"Client off-line"] dataUsingEncoding:NSUTF8StringEncoding] + willQoS:2 + willRetainFlag:YES + protocolLevel:4 + queue:dispatch_queue_get_main_queue() + securityPolicy:securityPolicy + certificates:certificates]; + + [session connectToHost:@"example-1234" port:1883 usingSSL:YES]; + @endcode + */ +- (MQTTSession *)initWithClientId:(NSString *)clientId + userName:(NSString *)userName + password:(NSString *)password + keepAlive:(UInt16)keepAliveInterval + connectMessage:(MQTTMessage *)theConnectMessage + cleanSession:(BOOL)cleanSessionFlag + will:(BOOL)willFlag + willTopic:(NSString *)willTopic + willMsg:(NSData *)willMsg + willQoS:(MQTTQosLevel)willQoS + willRetainFlag:(BOOL)willRetainFlag + protocolLevel:(UInt8)protocolLevel + queue:(dispatch_queue_t)queue + securityPolicy:(MQTTSSLSecurityPolicy *) securityPolicy + certificates:(NSArray *)certificates; + +/** for mqttio-OBJC backward compatibility + @param payload JSON payload is converted to NSData and then send. See publishData for description + @param theTopic see publishData for description + */ +- (void)publishJson:(id)payload onTopic:(NSString *)theTopic; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m new file mode 100644 index 0000000..ad3c18b --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionLegacy.m @@ -0,0 +1,86 @@ +// +// MQTTSessionLegacy.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// +// based on +// +// Copyright (c) 2011, 2013, 2lemetry LLC +// +// All rights reserved. This program and the accompanying materials +// are made available under the terms of the Eclipse Public License v1.0 +// which accompanies this distribution, and is available at +// http://www.eclipse.org/legal/epl-v10.html +// +// Contributors: +// Kyle Roche - initial API and implementation and/or initial documentation +// + +/** + Using MQTT in your Objective-C application + + This file contains implementation for mqttio-OBJC backward compatibility + + @author Christoph Krey c@ckrey.de + @see http://mqtt.org + */ + +#import "MQTTSession.h" +#import "MQTTSessionLegacy.h" +#import "MQTTCFSocketTransport.h" +#import "MQTTSSLSecurityPolicyTransport.h" + +#import "MQTTLog.h" + +@interface MQTTSession() +@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; + +@end + +@implementation MQTTSession(Legacy) + +- (MQTTSession *)initWithClientId:(NSString *)clientId + userName:(NSString *)userName + password:(NSString *)password + keepAlive:(UInt16)keepAliveInterval + connectMessage:(MQTTMessage *)theConnectMessage + cleanSession:(BOOL)cleanSessionFlag + will:(BOOL)willFlag + willTopic:(NSString *)willTopic + willMsg:(NSData *)willMsg + willQoS:(MQTTQosLevel)willQoS + willRetainFlag:(BOOL)willRetainFlag + protocolLevel:(UInt8)protocolLevel + queue:(dispatch_queue_t)queue + securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy + certificates:(NSArray *)certificates { + DDLogVerbose(@"[MQTTSessionLegacy] initWithClientId:%@ ", clientId); + + self = [self init]; + self.connectMessage = theConnectMessage; + self.clientId = clientId; + self.userName = userName; + self.password = password; + self.keepAliveInterval = keepAliveInterval; + self.cleanSessionFlag = cleanSessionFlag; + self.willFlag = willFlag; + self.willTopic = willTopic; + self.willMsg = willMsg; + self.willQoS = willQoS; + self.willRetainFlag = willRetainFlag; + self.protocolLevel = protocolLevel; + self.queue = queue; + self.securityPolicy = securityPolicy; + self.certificates = certificates; + + return self; +} + +- (void)publishJson:(id)payload onTopic:(NSString*)theTopic { + NSData *data = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil]; + if (data) { + [self publishData:data onTopic:theTopic retain:FALSE qos:MQTTQosLevelAtLeastOnce]; + } +} +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h new file mode 100644 index 0000000..dc2fafb --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.h @@ -0,0 +1,237 @@ +// +// MQTTSessionManager.h +// MQTTClient +// +// Created by Christoph Krey on 09.07.14. +// Copyright © 2013-2017 Christoph Krey. All rights reserved. +// + +#import +#if TARGET_OS_IPHONE == 1 +#import +#endif +#import "MQTTSession.h" +#import "MQTTSessionLegacy.h" +#import "MQTTSSLSecurityPolicy.h" + +@class MQTTSessionManager; + +/** delegate gives your application access to received messages + */ +@protocol MQTTSessionManagerDelegate + +/** + Enumeration of MQTTSessionManagerState values + */ +typedef NS_ENUM(int, MQTTSessionManagerState) { + MQTTSessionManagerStateStarting, + MQTTSessionManagerStateConnecting, + MQTTSessionManagerStateError, + MQTTSessionManagerStateConnected, + MQTTSessionManagerStateClosing, + MQTTSessionManagerStateClosed +}; + +@optional + +/** gets called when a new message was received + + @param data the data received, might be zero length + @param topic the topic the data was published to + @param retained indicates if the data retransmitted from server storage + */ +- (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained; + +/** gets called when a new message was received + @param sessionManager the instance of MQTTSessionManager whose state changed + @param data the data received, might be zero length + @param topic the topic the data was published to + @param retained indicates if the data retransmitted from server storage + */ +- (void)sessionManager:(MQTTSessionManager *)sessionManager + didReceiveMessage:(NSData *)data + onTopic:(NSString *)topic + retained:(BOOL)retained; + +/** gets called when a published message was actually delivered + @param msgID the Message Identifier of the delivered message + @note this method is called after a publish with qos 1 or 2 only + */ +- (void)messageDelivered:(UInt16)msgID; + +/** gets called when a published message was actually delivered + @param sessionManager the instance of MQTTSessionManager whose state changed + @param msgID the Message Identifier of the delivered message + @note this method is called after a publish with qos 1 or 2 only + */ +- (void)sessionManager:(MQTTSessionManager *)sessionManager didDeliverMessage:(UInt16)msgID; + +/** gets called when the connection status changes + @param sessionManager the instance of MQTTSessionManager whose state changed + @param newState the new connection state of the sessionManager. This will be identical to `sessionManager.state`. + */ +- (void)sessionManager:(MQTTSessionManager *)sessionManager didChangeState:(MQTTSessionManagerState)newState; + +@end + +/** SessionManager handles the MQTT session for your application + */ +@interface MQTTSessionManager : NSObject + +/** Underlying MQTTSession currently in use. + */ +@property (strong, nonatomic, readonly) MQTTSession *session; + +/** host an NSString containing the hostName or IP address of the Server + */ +@property (readonly) NSString *host; + +/** port an unsigned 32 bit integer containing the IP port number of the Server + */ +@property (readonly) UInt32 port; + +/** the delegate receiving incoming messages + */ +@property (weak, nonatomic) id delegate; + +/** indicates if manager requires tear down + */ +@property (readonly) BOOL requiresTearDown; + +/** subscriptions is a dictionary of NSNumber instances indicating the MQTTQoSLevel. + * The keys are topic filters. + * The SessionManager subscribes to the given subscriptions after successfull (re-)connect + * according to the cleansession parameter and the state of the session as indicated by the broker. + * Setting a new subscriptions dictionary initiates SUBSCRIBE or UNSUBSCRIBE messages by SessionManager + * by comparing the old and new subscriptions. + */ +@property (strong, nonatomic) NSDictionary *subscriptions; + +/** effectiveSubscriptions s a dictionary of NSNumber instances indicating the granted MQTTQoSLevel, or 0x80 for subscription failure. + * The keys are topic filters. + * effectiveSubscriptions is observable and is updated everytime subscriptions change + * @code + ... + MQTTSessionManager *manager = [[MQTTSessionManager alloc] init]; + manager.delegate = self; + + [manager addObserver:self + forKeyPath:@"effectiveSubscriptions" + options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew + context:nil]; + manager.subscriptions = [@{@"#": @(0)} mutableCopy]; + [manager connectTo: ... + ... + [manager removeObserver:self forKeyPath:@"effectiveSubscriptions"]; + ... + + - (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { + if ([keyPath isEqualToString:@"effectiveSubscriptions"]) { + MQTTSessionManager *manager = (MQTTSessionManager *)object; + DDLogVerbose(@"effectiveSubscriptions changed: %@", manager.effectiveSubscriptions); + } + } + * @endcode + */ +@property (readonly, strong, nonatomic) NSDictionary *effectiveSubscriptions; + +/** SessionManager status + */ +@property (nonatomic, readonly) MQTTSessionManagerState state; + +/** SessionManager last error code when state equals MQTTSessionManagerStateError + */ +@property (nonatomic, readonly) NSError *lastErrorCode; + +/** initWithPersistence sets the MQTTPersistence properties other than default + * @param persistent YES or NO (default) to establish file or in memory persistence. + * @param maxWindowSize (a positive number, default is 16) to control the number of messages sent before waiting for acknowledgement in Qos 1 or 2. Additional messages are stored and transmitted later. + * @param maxSize (a positive number of bytes, default is 64 MB) to limit the size of the persistence file. Messages published after the limit is reached are dropped. + * @param maxMessages (a positive number, default is 1024) to limit the number of messages stored. Additional messages published are dropped. + * @param maxRetryInterval The duration at which the connection-retry timer should be capped. When MQTTSessionManager receives a ClosedByBroker or an Error + event, it will attempt to reconnect to the broker. The time in between connection attempts is doubled each time, until it remains at maxRetryInterval. + Defaults to 64 seconds. + * @param connectInForeground Whether or not to connect the MQTTSession when the app enters the foreground, and disconnect when it becomes inactive. When NO, the caller is responsible for calling -connectTo: and -disconnect. Defaults to YES. + * @param streamSSLLevel an NSString containing the security level for read and write streams + * For list of possible values see: + * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants + * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list + * and cannot be used as constant, but you can use it as a string value + * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL + * @param queue Queue for MQTTSession. + * @return the initialized MQTTSessionManager object + */ + +- (MQTTSessionManager *)initWithPersistence:(BOOL)persistent + maxWindowSize:(NSUInteger)maxWindowSize + maxMessages:(NSUInteger)maxMessages + maxSize:(NSUInteger)maxSize + maxConnectionRetryInterval:(NSTimeInterval)maxRetryInterval + connectInForeground:(BOOL)connectInForeground + streamSSLLevel:(NSString *)streamSSLLevel + queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER; + +/** Connects to the MQTT broker and stores the parameters for subsequent reconnects + * @param host specifies the hostname or ip address to connect to. Defaults to @"localhost". + * @param port specifies the port to connect to + * @param tls specifies whether to use SSL or not + * @param keepalive The Keep Alive is a time interval measured in seconds. The MQTTClient ensures that the interval between Control Packets being sent does not exceed the Keep Alive value. In the absence of sending any other Control Packets, the Client sends a PINGREQ Packet. + * @param clean specifies if the server should discard previous session information. + * @param auth specifies the user and pass parameters should be used for authenthication + * @param user an NSString object containing the user's name (or ID) for authentication. May be nil. + * @param pass an NSString object containing the user's password. If userName is nil, password must be nil as well. + * @param will indicates whether a will shall be sent + * @param willTopic the Will Topic is a string, may be nil + * @param willMsg the Will Message, might be zero length or nil + * @param willQos specifies the QoS level to be used when publishing the Will Message. + * @param willRetainFlag indicates if the server should publish the Will Messages with retainFlag. + * @param clientId The Client Identifier identifies the Client to the Server. If nil, a random clientId is generated. + * @param securityPolicy A custom SSL security policy or nil. + * @param certificates An NSArray of the pinned certificates to use or nil. + * @param protocolLevel Protocol version of the connection. + * @param connectHandler Called when first connected or if error occurred. It is not called on subsequent internal reconnects. + */ + +- (void)connectTo:(NSString *)host + port:(NSInteger)port + tls:(BOOL)tls + keepalive:(NSInteger)keepalive + clean:(BOOL)clean + auth:(BOOL)auth + user:(NSString *)user + pass:(NSString *)pass + will:(BOOL)will + willTopic:(NSString *)willTopic + willMsg:(NSData *)willMsg + willQos:(MQTTQosLevel)willQos + willRetainFlag:(BOOL)willRetainFlag + withClientId:(NSString *)clientId + securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy + certificates:(NSArray *)certificates + protocolLevel:(MQTTProtocolVersion)protocolLevel + connectHandler:(MQTTConnectHandler)connectHandler; + +/** Re-Connects to the MQTT broker using the parameters for given in the connectTo method + */ +- (void)connectToLast:(MQTTConnectHandler)connectHandler; + +/** publishes data on a given topic at a specified QoS level and retain flag + + @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. + @param topic the Topic to identify the data + @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES + @param qos specifies the Quality of Service for the publish + qos can be 0, 1, or 2. + @return the Message Identifier of the PUBLISH message. Zero if qos 0. If qos 1 or 2, zero if message was dropped + @note returns immediately. + */ +- (UInt16)sendData:(NSData *)data topic:(NSString *)topic qos:(MQTTQosLevel)qos retain:(BOOL)retainFlag; + +/** Disconnects gracefully from the MQTT broker + */ +- (void)disconnectWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m new file mode 100644 index 0000000..dbefc5c --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionManager.m @@ -0,0 +1,420 @@ +// +// MQTTSessionManager.m +// MQTTClient +// +// Created by Christoph Krey on 09.07.14. +// Copyright © 2013-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTSessionManager.h" +#import "MQTTCoreDataPersistence.h" +#import "MQTTLog.h" +#import "ReconnectTimer.h" +#import "ForegroundReconnection.h" +#import "MQTTSSLSecurityPolicyTransport.h" + +@interface MQTTSessionManager() + +@property (nonatomic, readwrite) MQTTSessionManagerState state; +@property (nonatomic, readwrite) NSError *lastErrorCode; + +@property (strong, nonatomic) ReconnectTimer *reconnectTimer; +@property (nonatomic) BOOL reconnectFlag; + +@property (strong, nonatomic) MQTTSession *session; + +@property (strong, nonatomic) NSString *host; +@property (nonatomic) UInt32 port; +@property (nonatomic) BOOL tls; +@property (nonatomic) NSInteger keepalive; +@property (nonatomic) BOOL clean; +@property (nonatomic) BOOL auth; +@property (nonatomic) BOOL will; +@property (strong, nonatomic) NSString *user; +@property (strong, nonatomic) NSString *pass; +@property (strong, nonatomic) NSString *willTopic; +@property (strong, nonatomic) NSData *willMsg; +@property (nonatomic) NSInteger willQos; +@property (nonatomic) BOOL willRetainFlag; +@property (strong, nonatomic) NSString *clientId; +@property (strong, nonatomic) dispatch_queue_t queue; +@property (strong, nonatomic) MQTTSSLSecurityPolicy *securityPolicy; +@property (strong, nonatomic) NSArray *certificates; +@property (nonatomic) MQTTProtocolVersion protocolLevel; + +#if TARGET_OS_IPHONE == 1 +@property (strong, nonatomic) ForegroundReconnection *foregroundReconnection; +#endif + +@property (nonatomic) BOOL persistent; +@property (nonatomic) NSUInteger maxWindowSize; +@property (nonatomic) NSUInteger maxSize; +@property (nonatomic) NSUInteger maxMessages; +@property (strong, nonatomic) NSString *streamSSLLevel; + +@property (strong, nonatomic) NSDictionary *internalSubscriptions; +@property (strong, nonatomic) NSDictionary *effectiveSubscriptions; +@property (strong, nonatomic) NSLock *subscriptionLock; + +@end + +#define RECONNECT_TIMER 1.0 +#define RECONNECT_TIMER_MAX_DEFAULT 64.0 + +@implementation MQTTSessionManager + +- (instancetype)init { + self = [self initWithPersistence:MQTT_PERSISTENT + maxWindowSize:MQTT_MAX_WINDOW_SIZE + maxMessages:MQTT_MAX_MESSAGES + maxSize:MQTT_MAX_SIZE + maxConnectionRetryInterval:RECONNECT_TIMER_MAX_DEFAULT + connectInForeground:YES + streamSSLLevel:(NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL + queue:dispatch_get_main_queue()]; + return self; +} + +- (MQTTSessionManager *)initWithPersistence:(BOOL)persistent + maxWindowSize:(NSUInteger)maxWindowSize + maxMessages:(NSUInteger)maxMessages + maxSize:(NSUInteger)maxSize + maxConnectionRetryInterval:(NSTimeInterval)maxRetryInterval + connectInForeground:(BOOL)connectInForeground + streamSSLLevel:(NSString *)streamSSLLevel + queue:(dispatch_queue_t)queue { + self = [super init]; + self.streamSSLLevel = streamSSLLevel; + self.queue = queue; + [self updateState:MQTTSessionManagerStateStarting]; + self.internalSubscriptions = [[NSMutableDictionary alloc] init]; + self.effectiveSubscriptions = [[NSMutableDictionary alloc] init]; + self.persistent = persistent; + self.maxWindowSize = maxWindowSize; + self.maxSize = maxSize; + self.maxMessages = maxMessages; + + __weak MQTTSessionManager *weakSelf = self; + self.reconnectTimer = [[ReconnectTimer alloc] initWithRetryInterval:RECONNECT_TIMER + maxRetryInterval:maxRetryInterval + queue:self.queue + reconnectBlock:^{ + [weakSelf reconnect:nil]; + }]; +#if TARGET_OS_IPHONE == 1 + if (connectInForeground) { + self.foregroundReconnection = [[ForegroundReconnection alloc] initWithMQTTSessionManager:self]; + } +#endif + self.subscriptionLock = [[NSLock alloc] init]; + + return self; +} + +- (void)connectTo:(NSString *)host + port:(NSInteger)port + tls:(BOOL)tls + keepalive:(NSInteger)keepalive + clean:(BOOL)clean + auth:(BOOL)auth + user:(NSString *)user + pass:(NSString *)pass + will:(BOOL)will + willTopic:(NSString *)willTopic + willMsg:(NSData *)willMsg + willQos:(MQTTQosLevel)willQos + willRetainFlag:(BOOL)willRetainFlag + withClientId:(NSString *)clientId + securityPolicy:(MQTTSSLSecurityPolicy *)securityPolicy + certificates:(NSArray *)certificates + protocolLevel:(MQTTProtocolVersion)protocolLevel + connectHandler:(MQTTConnectHandler)connectHandler { + DDLogVerbose(@"MQTTSessionManager connectTo:%@", host); + BOOL shouldReconnect = self.session != nil; + if (!self.session || + ![host isEqualToString:self.host] || + port != self.port || + tls != self.tls || + keepalive != self.keepalive || + clean != self.clean || + auth != self.auth || + ![user isEqualToString:self.user] || + ![pass isEqualToString:self.pass] || + ![willTopic isEqualToString:self.willTopic] || + ![willMsg isEqualToData:self.willMsg] || + willQos != self.willQos || + willRetainFlag != self.willRetainFlag || + ![clientId isEqualToString:self.clientId] || + securityPolicy != self.securityPolicy || + certificates != self.certificates) { + self.host = host; + self.port = (int)port; + self.tls = tls; + self.keepalive = keepalive; + self.clean = clean; + self.auth = auth; + self.user = user; + self.pass = pass; + self.will = will; + self.willTopic = willTopic; + self.willMsg = willMsg; + self.willQos = willQos; + self.willRetainFlag = willRetainFlag; + self.clientId = clientId; + self.securityPolicy = securityPolicy; + self.certificates = certificates; + self.protocolLevel = protocolLevel; + + self.session = [[MQTTSession alloc] initWithClientId:clientId + userName:auth ? user : nil + password:auth ? pass : nil + keepAlive:keepalive + connectMessage:nil + cleanSession:clean + will:will + willTopic:willTopic + willMsg:willMsg + willQoS:willQos + willRetainFlag:willRetainFlag + protocolLevel:protocolLevel + queue:self.queue + securityPolicy:securityPolicy + certificates:certificates]; + self.session.streamSSLLevel = self.streamSSLLevel; + MQTTCoreDataPersistence *persistence = [[MQTTCoreDataPersistence alloc] init]; + + persistence.persistent = self.persistent; + persistence.maxWindowSize = self.maxWindowSize; + persistence.maxSize = self.maxSize; + persistence.maxMessages = self.maxMessages; + + self.session.persistence = persistence; + + self.session.delegate = self; + self.reconnectFlag = FALSE; + } + if (shouldReconnect) { + DDLogVerbose(@"[MQTTSessionManager] reconnecting"); + [self disconnectWithDisconnectHandler:nil]; + [self reconnect:connectHandler]; + } else { + DDLogVerbose(@"[MQTTSessionManager] connecting"); + [self connectToInternal:connectHandler]; + } +} + +- (UInt16)sendData:(NSData *)data topic:(NSString *)topic qos:(MQTTQosLevel)qos retain:(BOOL)retainFlag { + if (self.state != MQTTSessionManagerStateConnected) { + [self connectToLast:nil]; + } + UInt16 msgId = [self.session publishData:data + onTopic:topic + retain:retainFlag + qos:qos]; + return msgId; +} + +- (void)disconnectWithDisconnectHandler:(MQTTDisconnectHandler)disconnectHandler { + [self updateState:MQTTSessionManagerStateClosing]; + [self.session closeWithDisconnectHandler:disconnectHandler]; + [self.reconnectTimer stop]; +} + +- (BOOL)requiresTearDown { + return (self.state != MQTTSessionManagerStateClosed && + self.state != MQTTSessionManagerStateStarting); +} + +- (void)updateState:(MQTTSessionManagerState)newState { + self.state = newState; + + if ([self.delegate respondsToSelector:@selector(sessionManager:didChangeState:)]) { + [self.delegate sessionManager:self didChangeState:newState]; + } +} + + +#pragma mark - MQTT Callback methods + +- (void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error { +#ifdef DEBUG + __unused const NSDictionary *events = @{ + @(MQTTSessionEventConnected): @"connected", + @(MQTTSessionEventConnectionRefused): @"connection refused", + @(MQTTSessionEventConnectionClosed): @"connection closed", + @(MQTTSessionEventConnectionError): @"connection error", + @(MQTTSessionEventProtocolError): @"protocoll error", + @(MQTTSessionEventConnectionClosedByBroker): @"connection closed by broker" + }; + DDLogVerbose(@"[MQTTSessionManager] eventCode: %@ (%ld) %@", events[@(eventCode)], (long)eventCode, error); +#endif + switch (eventCode) { + case MQTTSessionEventConnected: + self.lastErrorCode = nil; + [self updateState:MQTTSessionManagerStateConnected]; + [self.reconnectTimer resetRetryInterval]; + break; + + case MQTTSessionEventConnectionClosed: + [self updateState:MQTTSessionManagerStateClosed]; + break; + + case MQTTSessionEventConnectionClosedByBroker: + if (self.state != MQTTSessionManagerStateClosing) { + [self triggerDelayedReconnect]; + } + [self updateState:MQTTSessionManagerStateClosed]; + break; + + case MQTTSessionEventProtocolError: + case MQTTSessionEventConnectionRefused: + case MQTTSessionEventConnectionError: + [self triggerDelayedReconnect]; + self.lastErrorCode = error; + [self updateState:MQTTSessionManagerStateError]; + break; + + default: + break; + } +} + +- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid { + if (self.delegate) { + if ([self.delegate respondsToSelector:@selector(sessionManager:didReceiveMessage:onTopic:retained:)]) { + [self.delegate sessionManager:self didReceiveMessage:data onTopic:topic retained:retained]; + } + if ([self.delegate respondsToSelector:@selector(handleMessage:onTopic:retained:)]) { + [self.delegate handleMessage:data onTopic:topic retained:retained]; + } + } +} + +- (void)connected:(MQTTSession *)session sessionPresent:(BOOL)sessionPresent { + if (self.clean || !self.reconnectFlag || !sessionPresent) { + NSDictionary *subscriptions = [self.internalSubscriptions copy]; + [self.subscriptionLock lock]; + self.effectiveSubscriptions = [[NSMutableDictionary alloc] init]; + [self.subscriptionLock unlock]; + if (subscriptions.count) { + __weak MQTTSessionManager *weakSelf = self; + [self.session subscribeToTopics:subscriptions subscribeHandler:^(NSError *error, NSArray *gQoss) { + MQTTSessionManager *strongSelf = weakSelf; + if (!error) { + NSArray *allTopics = subscriptions.allKeys; + for (int i = 0; i < allTopics.count; i++) { + NSString *topic = allTopics[i]; + NSNumber *gQos = gQoss[i]; + [strongSelf.subscriptionLock lock]; + NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; + newEffectiveSubscriptions[topic] = gQos; + strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; + [strongSelf.subscriptionLock unlock]; + } + } + }]; + + } + self.reconnectFlag = TRUE; + } +} + +- (void)messageDelivered:(MQTTSession *)session msgID:(UInt16)msgID { + if (self.delegate) { + if ([self.delegate respondsToSelector:@selector(sessionManager:didDeliverMessage:)]) { + [self.delegate sessionManager:self didDeliverMessage:msgID]; + } + if ([self.delegate respondsToSelector:@selector(messageDelivered:)]) { + [self.delegate messageDelivered:msgID]; + } + } +} + + +- (void)connectToInternal:(MQTTConnectHandler)connectHandler { + if (self.session && self.state == MQTTSessionManagerStateStarting) { + [self updateState:MQTTSessionManagerStateConnecting]; + MQTTCFSocketTransport *transport; + if (self.securityPolicy) { + transport = [[MQTTSSLSecurityPolicyTransport alloc] init]; + ((MQTTSSLSecurityPolicyTransport *)transport).securityPolicy = self.securityPolicy; + } else { + transport = [[MQTTCFSocketTransport alloc] init]; + } + transport.host = self.host; + transport.port = self.port; + transport.tls = self.tls; + transport.certificates = self.certificates; + transport.voip = self.session.voip; + transport.queue = self.queue; + transport.streamSSLLevel = self.streamSSLLevel; + self.session.transport = transport; + [self.session connectWithConnectHandler:connectHandler]; + } +} + +- (void)reconnect:(MQTTConnectHandler)connectHandler { + [self updateState:MQTTSessionManagerStateStarting]; + [self connectToInternal:connectHandler]; +} + +- (void)connectToLast:(MQTTConnectHandler)connectHandler { + if (self.state == MQTTSessionManagerStateConnected) { + return; + } + [self.reconnectTimer resetRetryInterval]; + [self reconnect:connectHandler]; +} + +- (void)triggerDelayedReconnect { + [self.reconnectTimer schedule]; +} + +- (NSDictionary *)subscriptions { + return self.internalSubscriptions; +} + +- (void)setSubscriptions:(NSDictionary *)newSubscriptions { + if (self.state == MQTTSessionManagerStateConnected) { + NSDictionary *currentSubscriptions = [self.effectiveSubscriptions copy]; + + for (NSString *topicFilter in currentSubscriptions) { + if (!newSubscriptions[topicFilter]) { + __weak MQTTSessionManager *weakSelf = self; + [self.session unsubscribeTopic:topicFilter unsubscribeHandler:^(NSError *error) { + MQTTSessionManager *strongSelf = weakSelf; + if (!error) { + [strongSelf.subscriptionLock lock]; + NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; + [newEffectiveSubscriptions removeObjectForKey:topicFilter]; + strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; + [strongSelf.subscriptionLock unlock]; + } + }]; + } + } + + for (NSString *topicFilter in newSubscriptions) { + if (!currentSubscriptions[topicFilter]) { + NSNumber *number = newSubscriptions[topicFilter]; + MQTTQosLevel qos = number.unsignedIntValue; + __weak MQTTSessionManager *weakSelf = self; + [self.session subscribeToTopic:topicFilter atLevel:qos subscribeHandler:^(NSError *error, NSArray *gQoss) { + MQTTSessionManager *strongSelf = weakSelf; + if (!error) { + NSNumber *gQos = gQoss[0]; + [strongSelf.subscriptionLock lock]; + NSMutableDictionary *newEffectiveSubscriptions = [strongSelf.subscriptions mutableCopy]; + newEffectiveSubscriptions[topicFilter] = gQos; + strongSelf.effectiveSubscriptions = newEffectiveSubscriptions; + [strongSelf.subscriptionLock unlock]; + } + }]; + } + } + } + self.internalSubscriptions = newSubscriptions; + DDLogVerbose(@"MQTTSessionManager internalSubscriptions: %@", self.internalSubscriptions); +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h new file mode 100644 index 0000000..52bb7d3 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.h @@ -0,0 +1,194 @@ +// +// MQTTSessionSynchron.h +// MQTTClient.framework +// + +/** + Synchronous API + + @author Christoph Krey c@ckrey.de + @copyright Copyright © 2013-2017, Christoph Krey. All rights reserved. + + */ + + +#import +#import "MQTTSession.h" + +@interface MQTTSession(Synchron) + +/** connects to the specified MQTT server synchronously + + @param timeout defines the maximum time to wait. Defaults to 0 for no timeout. + + @return true if the connection was established + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + @endcode + + */ +- (BOOL)connectAndWaitTimeout:(NSTimeInterval)timeout; + +/** subscribes to a topic at a specific QoS level synchronously + + @param topic the Topic Filter to subscribe to. + + @param qosLevel specifies the QoS Level of the subscription. + qosLevel can be 0, 1, or 2. + @param timeout defines the maximum time to wait + + @return TRUE if successfully subscribed + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + [session subscribeAndWaitToTopic:@"example/#" atLevel:2 timeout:10]; + + @endcode + + */ +- (BOOL)subscribeAndWaitToTopic:(NSString *)topic + atLevel:(MQTTQosLevel)qosLevel + timeout:(NSTimeInterval)timeout; + +/** subscribes a number of topics + + @param topics an NSDictionary containing the Topic Filters to subscribe to as keys and + the corresponding QoS as NSNumber values + @param timeout defines the maximum time to wait + + @return TRUE if the subscribe was succesfull + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + [session subscribeAndWaitToTopics:@{ + @"example/#": @(0), + @"example/status": @(2), + @"other/#": @(1) + } + timeout:10]; + + @endcode + */ +- (BOOL)subscribeAndWaitToTopics:(NSDictionary *)topics + timeout:(NSTimeInterval)timeout; + +/** unsubscribes from a topic synchronously + + @param topic the Topic Filter to unsubscribe from. + @param timeout defines the maximum time to wait + + @return TRUE if sucessfully unsubscribed + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + ... + + [session unsubscribeAndWaitTopic:@"example/#" timeout:10]; + + @endcode + */ +- (BOOL)unsubscribeAndWaitTopic:(NSString *)topic + timeout:(NSTimeInterval)timeout; + +/** unsubscribes from a number of topics synchronously + + @param topics an NSArray of topics to unsubscribe from + @param timeout defines the maximum time to wait + + @return TRUE if the unsubscribe was successful + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + ... + + [session unsubscribeAndWaitTopics:@[ + @"example/#", + @"example/status", + @"other/#" + ] + timeout:10]; + + @endcode + + */ +- (BOOL)unsubscribeAndWaitTopics:(NSArray *)topics + timeout:(NSTimeInterval)timeout; + +/** publishes synchronously data on a given topic at a specified QoS level and retain flag + + @param data the data to be sent. length may range from 0 to 268,435,455 - 4 - _lengthof-topic_ bytes. Defaults to length 0. + @param topic the Topic to identify the data + @param retainFlag if YES, data is stored on the MQTT broker until overwritten by the next publish with retainFlag = YES + @param qos specifies the Quality of Service for the publish + qos can be 0, 1, or 2. + @param timeout defines the maximum time to wait + @returns TRUE if the publish was successful + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + [session publishAndWaitData:[@"Sample Data" dataUsingEncoding:NSUTF8StringEncoding] + topic:@"example/data" + retain:YES + qos:1 + timeout:10]; + @endcode + + */ +- (BOOL)publishAndWaitData:(NSData *)data + onTopic:(NSString *)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + timeout:(NSTimeInterval)timeout; + +/** closes an MQTTSession gracefully synchronously + @param timeout defines the maximum time to wait + + If the connection was successfully established before, a DISCONNECT is sent. + + @code + #import "MQTTClient.h" + + MQTTSession *session = [[MQTTSession alloc] init]; + + [session connectAndWaitTimeout:30]; + + ... + + [session closeAndWait:10]; + + @endcode + + */ +- (void)closeAndWait:(NSTimeInterval)timeout; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m new file mode 100644 index 0000000..ed355c6 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTSessionSynchron.m @@ -0,0 +1,192 @@ +// +// MQTTSessionSynchron.m +// MQTTClient.framework +// +// Copyright © 2013-2017, Christoph Krey. All rights reserved. +// + +/** + Synchronous API + + @author Christoph Krey c@ckrey.de + @see http://mqtt.org + */ + +#import "MQTTSession.h" +#import "MQTTSessionLegacy.h" +#import "MQTTSessionSynchron.h" + +#import "MQTTLog.h" + +@interface MQTTSession() +@property (nonatomic) BOOL synchronPub; +@property (nonatomic) UInt16 synchronPubMid; +@property (nonatomic) BOOL synchronUnsub; +@property (nonatomic) UInt16 synchronUnsubMid; +@property (nonatomic) BOOL synchronSub; +@property (nonatomic) UInt16 synchronSubMid; +@property (nonatomic) BOOL synchronConnect; +@property (nonatomic) BOOL synchronDisconnect; + +@end + +@implementation MQTTSession(Synchron) + +/** Synchron connect + * + */ +- (BOOL)connectAndWaitTimeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + self.synchronConnect = TRUE; + + [self connect]; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronConnect && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for connect"); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end connect"); + + return (self.status == MQTTSessionStatusConnected); +} + +- (BOOL)subscribeAndWaitToTopic:(NSString *)topic atLevel:(MQTTQosLevel)qosLevel timeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + self.synchronSub = TRUE; + UInt16 mid = [self subscribeToTopic:topic atLevel:qosLevel]; + self.synchronSubMid = mid; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronSub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for suback %d", mid); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end subscribe"); + + if (self.synchronSub || self.synchronSubMid != mid) { + return FALSE; + } else { + return TRUE; + } +} + +- (BOOL)subscribeAndWaitToTopics:(NSDictionary *)topics timeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + self.synchronSub = TRUE; + UInt16 mid = [self subscribeToTopics:topics]; + self.synchronSubMid = mid; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronSub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for suback %d", mid); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end subscribe"); + + if (self.synchronSub || self.synchronSubMid != mid) { + return FALSE; + } else { + return TRUE; + } +} + +- (BOOL)unsubscribeAndWaitTopic:(NSString *)theTopic timeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + + self.synchronUnsub = TRUE; + UInt16 mid = [self unsubscribeTopic:theTopic]; + self.synchronUnsubMid = mid; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronUnsub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for unsuback %d", mid); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end unsubscribe"); + + if (self.synchronUnsub || self.synchronUnsubMid != mid) { + return FALSE; + } else { + return TRUE; + } +} + +- (BOOL)unsubscribeAndWaitTopics:(NSArray *)topics timeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + self.synchronUnsub = TRUE; + UInt16 mid = [self unsubscribeTopics:topics]; + self.synchronUnsubMid = mid; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronUnsub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for unsuback %d", mid); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end unsubscribe"); + + if (self.synchronUnsub || self.synchronUnsubMid != mid) { + return FALSE; + } else { + return TRUE; + } +} + +- (BOOL)publishAndWaitData:(NSData*)data + onTopic:(NSString*)topic + retain:(BOOL)retainFlag + qos:(MQTTQosLevel)qos + timeout:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + + if (qos != MQTTQosLevelAtMostOnce) { + self.synchronPub = TRUE; + } + + UInt16 mid = self.synchronPubMid = [self publishData:data onTopic:topic retain:retainFlag qos:qos]; + if (qos == MQTTQosLevelAtMostOnce) { + return TRUE; + } else { + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronPub && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for mid %d", mid); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + + DDLogVerbose(@"[MQTTSessionSynchron] end publish"); + + if (self.synchronPub || self.synchronPubMid != mid) { + return FALSE; + } else { + return TRUE; + } + } +} + +- (void)closeAndWait:(NSTimeInterval)timeout { + NSDate *started = [NSDate date]; + self.synchronDisconnect = TRUE; + [self closeWithDisconnectHandler:nil]; + + [[NSRunLoop currentRunLoop] addPort:[NSMachPort port] forMode:NSRunLoopCommonModes]; + + while (self.synchronDisconnect && (timeout == 0 || started.timeIntervalSince1970 + timeout > [NSDate date].timeIntervalSince1970)) { + DDLogVerbose(@"[MQTTSessionSynchron] waiting for close"); + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]]; + } + DDLogVerbose(@"[MQTTSessionSynchron] end close"); +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h new file mode 100644 index 0000000..88349ad --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.h @@ -0,0 +1,33 @@ +// +// MQTTStrict.h +// MQTTClient +// +// Created by Christoph Krey on 24.07.17. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import + +/** MQTTStrict controls the behaviour of MQTTClient with regards to parameter checking + * If strict is true, all parameters passed by the caller are checked before + * the corresponding message is send (CONNECT, PUBLISH, SUBSCRIBE, UNSUBSCRIBE) + * and an exception is thrown if any invalid values or inconsistencies are detected + * + * If strict is false, parameters are used as passed by the caller. + * Messages will be sent "incorrectly" and + * parameter checking will be done on the broker end. + * + */ +@interface MQTTStrict : NSObject + +/** strict returns the current strict flag + * @return the strict flag + */ ++ (BOOL)strict; + +/** setString sets the global strict flag + * @param strict the new strict flag + */ ++ (void)setStrict:(BOOL)strict; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m new file mode 100644 index 0000000..810f85d --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTStrict.m @@ -0,0 +1,22 @@ +// +// MQTTStrict.m +// MQTTClient +// +// Created by Christoph Krey on 24.07.17. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import "MQTTStrict.h" + +@implementation MQTTStrict +static BOOL internalStrict = false; + ++ (BOOL)strict { + return internalStrict; +} + ++ (void)setStrict:(BOOL)strict { + internalStrict = strict; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h new file mode 100644 index 0000000..d7ab0b4 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.h @@ -0,0 +1,114 @@ +// +// MQTTTransport.h +// MQTTClient +// +// Created by Christoph Krey on 06.12.15. +// Copyright © 2015-2017 Christoph Krey. All rights reserved. +// + +#import + +@protocol MQTTTransportDelegate; + +/** MQTTTransport is a protocol abstracting the underlying transport level for MQTTClient + * + */ +@protocol MQTTTransport + +/** MQTTTransport state defines the possible state of an abstract transport + * + */ + typedef NS_ENUM(NSInteger, MQTTTransportState) { + + /** MQTTTransportCreated indicates an initialized transport */ + MQTTTransportCreated = 0, + + /** MQTTTransportOpening indicates a transport in the process of opening a connection */ + MQTTTransportOpening, + + /** MQTTTransportCreated indicates a transport opened ready for communication */ + MQTTTransportOpen, + + /** MQTTTransportCreated indicates a transport in the process of closing */ + MQTTTransportClosing, + + /** MQTTTransportCreated indicates a closed transport */ + MQTTTransportClosed + }; + +/** queue The queue where the streams are scheduled. */ +@property (strong, nonatomic, nonnull) dispatch_queue_t queue; + +/** streamSSLLevel an NSString containing the security level for read and write streams + * For list of possible values see: + * https://developer.apple.com/documentation/corefoundation/cfstream/cfstream_socket_security_level_constants + * Please also note that kCFStreamSocketSecurityLevelTLSv1_2 is not in a list + * and cannot be used as constant, but you can use it as a string value + * defaults to kCFStreamSocketSecurityLevelNegotiatedSSL + */ +@property (strong, nonatomic, nonnull) NSString *streamSSLLevel; + +/** host an NSString containing the hostName or IP address of the host to connect to */ +@property (strong, nonatomic, nonnull) NSString *host; + +/** port an unsigned 32 bit integer containing the IP port number to connect to */ +@property (nonatomic) UInt32 port; + +/** MQTTTransportDelegate needs to be set to a class implementing th MQTTTransportDelegate protocol + * to receive delegate messages. + */ +@property (weak, nonatomic) _Nullable id delegate; + +/** state contains the current MQTTTransportState of the transport */ +@property (nonatomic) MQTTTransportState state; + +/** open opens the transport and prepares it for communication + * actual transports may require additional parameters to be set before opening + */ +- (void)open; + +/** send transmits a data message + * @param data data to be send, might be zero length + * @result a boolean indicating if the data could be send or not + */ +- (BOOL)send:(nonnull NSData *)data; + +/** close closes the transport */ +- (void)close; + +@end + +/** MQTTTransportDelegate protocol + * Note: the implementation of the didReceiveMessage method is mandatory, the others are optional + */ +@protocol MQTTTransportDelegate + +/** didReceiveMessage gets called when a message was received + * @param mqttTransport the transport on which the message was received + * @param message the data received which may be zero length + */ + - (void)mqttTransport:(nonnull id)mqttTransport didReceiveMessage:(nonnull NSData *)message; + +@optional + +/** mqttTransportDidOpen gets called when a transport is successfully opened + * @param mqttTransport the transport which was successfully opened + */ +- (void)mqttTransportDidOpen:(_Nonnull id)mqttTransport; + +/** didFailWithError gets called when an error was detected on the transport + * @param mqttTransport the transport which detected the error + * @param error available error information, might be nil + */ +- (void)mqttTransport:(_Nonnull id)mqttTransport didFailWithError:(nullable NSError *)error; + +/** mqttTransportDidClose gets called when the transport closed + * @param mqttTransport the transport which was closed + */ +- (void)mqttTransportDidClose:(_Nonnull id)mqttTransport; + +@end + +@interface MQTTTransport : NSObject +@end + diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m new file mode 100644 index 0000000..d372e02 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/MQTTTransport.m @@ -0,0 +1,40 @@ +// +// MQTTTransport.m +// MQTTClient +// +// Created by Christoph Krey on 05.01.16. +// Copyright © 2016-2017 Christoph Krey. All rights reserved. +// + +#import "MQTTTransport.h" + +#import "MQTTLog.h" + +@implementation MQTTTransport +@synthesize state; +@synthesize queue; +@synthesize streamSSLLevel; +@synthesize delegate; +@synthesize host; +@synthesize port; + +- (instancetype)init { + self = [super init]; + self.state = MQTTTransportCreated; + return self; +} + +- (void)open { + DDLogError(@"MQTTTransport is abstract class"); +} + +- (void)close { + DDLogError(@"MQTTTransport is abstract class"); +} + +- (BOOL)send:(NSData *)data { + DDLogError(@"MQTTTransport is abstract class"); + return FALSE; +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h new file mode 100644 index 0000000..00b4302 --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.h @@ -0,0 +1,21 @@ +// +// ReconnectTimer.h +// MQTTClient +// +// Created by Josip Cavar on 22/08/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import + +@interface ReconnectTimer : NSObject + +- (instancetype)initWithRetryInterval:(NSTimeInterval)retryInterval + maxRetryInterval:(NSTimeInterval)maxRetryInterval + queue:(dispatch_queue_t)queue + reconnectBlock:(void (^)(void))block; +- (void)schedule; +- (void)stop; +- (void)resetRetryInterval; + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m new file mode 100644 index 0000000..adf509f --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/MQTTClient/MQTTClient/ReconnectTimer.m @@ -0,0 +1,67 @@ +// +// ReconnectTimer.m +// MQTTClient +// +// Created by Josip Cavar on 22/08/2017. +// Copyright © 2017 Christoph Krey. All rights reserved. +// + +#import "ReconnectTimer.h" +#import "GCDTimer.h" + +@interface ReconnectTimer() + +@property (strong, nonatomic) GCDTimer *timer; +@property (assign, nonatomic) NSTimeInterval retryInterval; +@property (assign, nonatomic) NSTimeInterval currentRetryInterval; +@property (assign, nonatomic) NSTimeInterval maxRetryInterval; +@property (strong, nonatomic) dispatch_queue_t queue; +@property (copy, nonatomic) void (^reconnectBlock)(void); + +@end + +@implementation ReconnectTimer + +- (instancetype)initWithRetryInterval:(NSTimeInterval)retryInterval + maxRetryInterval:(NSTimeInterval)maxRetryInterval + queue:(dispatch_queue_t)queue + reconnectBlock:(void (^)(void))block { + self = [super init]; + if (self) { + self.retryInterval = retryInterval; + self.currentRetryInterval = retryInterval; + self.maxRetryInterval = maxRetryInterval; + self.reconnectBlock = block; + self.queue = queue; + } + return self; +} + +- (void)schedule { + __weak typeof(self) weakSelf = self; + self.timer = [GCDTimer scheduledTimerWithTimeInterval:self.currentRetryInterval + repeats:NO + queue:self.queue + block:^{ + [weakSelf reconnect]; + }]; +} + +- (void)stop { + [self.timer invalidate]; + self.timer = nil; +} + +- (void)resetRetryInterval { + self.currentRetryInterval = self.retryInterval; +} + +- (void)reconnect { + [self stop]; + if (self.currentRetryInterval < self.maxRetryInterval) { + self.currentRetryInterval *= 2; + } + self.reconnectBlock(); +} + +@end diff --git a/rnmqttexample/ios/Pods/MQTTClient/README.md b/rnmqttexample/ios/Pods/MQTTClient/README.md new file mode 100644 index 0000000..5c3ad4e --- /dev/null +++ b/rnmqttexample/ios/Pods/MQTTClient/README.md @@ -0,0 +1,153 @@ +# MQTT-Client-Framework + +[![Build Status](https://travis-ci.org/novastone-media/MQTT-Client-Framework.svg?branch=master)](https://travis-ci.org/novastone-media/MQTT-Client-Framework) +[![codecov](https://codecov.io/gh/novastone-media/MQTT-Client-Framework/branch/master/graph/badge.svg)](https://codecov.io/gh/novastone-media/MQTT-Client-Framework) +[![CocoaPods Version](https://img.shields.io/cocoapods/v/MQTTClient.svg)](https://img.shields.io/cocoapods/v/MQTTClient.svg) +[![Platform](https://img.shields.io/cocoapods/p/MQTTClient.svg?style=flat)](https://img.shields.io/cocoapods/p/MQTTClient.svg?style=flat) + +**Welcome to MQTT-Client-Framework** + +MQTT-Client-Framework is a native Objective-C iOS library. It uses `CFNetwork` for networking and `CoreData` for persistence. It is a complete implementation of MQTT 3.1.1 and supports TLS. + +You can read [introduction](http://www.hivemq.com/blog/mqtt-client-library-encyclopedia-mqtt-client-framework) to learn more about framework. + +MQTT-Client-Framework is tested with a long list of brokers: + +* mosquitto +* paho +* rabbitmq +* hivemq +* rsmb +* mosca +* vernemq +* emqtt +* moquette +* ActiveMQ +* Apollo +* CloudMQTT +* aws +* hbmqtt (MQTTv311 only, limitations) +* [aedes](https://github.com/mcollina/aedes) +* [flespi](https://flespi.com/mqtt-broker) + +## Usage + +Create a new client and connect to a broker: + +```objective-c +#import "MQTTClient.h" + +MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init]; +transport.host = @"test.mosquitto.org"; +transport.port = 1883; + +MQTTSession *session = [[MQTTSession alloc] init]; +session.transport = transport; +[session connectWithConnectHandler:^(NSError *error) { + // Do some work +}]; +``` + +Subscribe to a topic: + +```objective-c +[session subscribeToTopic:@"example/#" atLevel:MQTTQosLevelExactlyOnce subscribeHandler:^(NSError *error, NSArray *gQoss) { + if (error) { + NSLog(@"Subscription failed %@", error.localizedDescription); + } else { + NSLog(@"Subscription sucessfull! Granted Qos: %@", gQoss); + } + }]; + +``` + +In your `MQTTSession` delegate, add the following to receive messages for the subscribed topics: + +```objective-c +- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid { + // New message received in topic +} +``` + +Publish a message to a topic: + +```objective-c +[session publishData:someData onTopic:@"example/#" retain:NO qos:MQTTQosLevelAtMostOnce publishHandler:^(NSError *error) { +}]; +``` + +If you already have a self signed URL from broker like AWS IoT endpoint, use the `url` property of `MQTTWebsocketTransport`: +```objective-c +MQTTWebsocketTransport *transport = [[MQTTWebsocketTransport alloc] init]; +transport.url = @"wss://aws.iot-amazonaws.com/mqtt?expiry='2018-05-01T23:12:32.950Z'" + +MQTTSession *session = [[MQTTSession alloc] init]; +session.transport = transport; +[session connectWithConnectHandler:^(NSError *error) { + // Do some work +}]; +``` + +## Installation + +### CocoaPods + +Add this to your Podfile: + +``` +pod 'MQTTClient' +``` +which is a short for: + +``` +pod 'MQTTClient/Min' +pod 'MQTTClient/Manager' +``` + +The Manager subspec includes the `MQTTSessionManager` class. + +If you want to use MQTT over Websockets: + +``` +pod 'MQTTClient/Websocket' +``` + +If you want to do your logging with CocoaLumberjack (recommended): + +``` +pod 'MQTTClient/MinL' +pod 'MQTTClient/ManagerL' +pod 'MQTTClient/WebsocketL' +``` + +### Carthage + +In your Cartfile: + +``` +github "novastone-media/MQTT-Client-Framework" +``` + +### Manually + +#### Git submodule + +1. Add MQTT-Client-Framework as a git submodule into your top-level project directory or simply copy whole folder +2. Find MQTTClient.xcodeproj and drag it into the file navigator of your app project. +3. In Xcode, navigate to the target configuration window by clicking on the blue project icon, and selecting the application target under the "Targets" heading in the sidebar. +4. Under "General" panel go to "Linked Frameworks and Libraries" and add MQTTClient.framework + +#### Framework + +1. Download MQTT-Client-Framework +2. Build it and you should find MQTTClient.framework under "Products" group. +3. Right click on it and select "Show in Finder" option. +4. Just drag and drop MQTTClient.framework to your project + +## Security Disclosure + +If you believe you have identified a security vulnerability with MQTT-Client-Framework, please report it to ios@novastonemedia.com and do not post it to a public issue tracker. + +## Thanks + +This project was originally written by [Christoph Krey](https://github.com/ckrey). diff --git a/rnmqttexample/ios/Pods/Manifest.lock b/rnmqttexample/ios/Pods/Manifest.lock new file mode 100644 index 0000000..5b505ca --- /dev/null +++ b/rnmqttexample/ios/Pods/Manifest.lock @@ -0,0 +1,23 @@ +PODS: + - MQTTClient (0.15.2): + - MQTTClient/Core (= 0.15.2) + - MQTTClient/Core (0.15.2): + - MQTTClient/Manager + - MQTTClient/Min + - MQTTClient/Manager (0.15.2): + - MQTTClient/Min + - MQTTClient/Min (0.15.2) + +DEPENDENCIES: + - MQTTClient + +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - MQTTClient + +SPEC CHECKSUMS: + MQTTClient: 902c7bcac1501595f3d0b15178c7205b40331fb0 + +PODFILE CHECKSUM: 9e0819579a9cda7b7d2416d353139e76ab61b9b8 + +COCOAPODS: 1.7.0 diff --git a/rnmqttexample/ios/Pods/Pods.xcodeproj/project.pbxproj b/rnmqttexample/ios/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..cdff8b2 --- /dev/null +++ b/rnmqttexample/ios/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1119 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0CC1E165491D54AE9AF6C472F9103AE4 /* MQTTSSLSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79F28A7D1113EFB2802066ED47DB51FF /* MQTTSSLSecurityPolicy.m */; }; + 11FF4E001127F41E46F1D68D68825C36 /* MQTTSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 45DF397AA953BFA7B53B27A0F8226BD0 /* MQTTSession.m */; }; + 165F8C230775AF96940440AF2069072C /* MQTTSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D12E0E007DEEF19897B1AEF0F03FBA /* MQTTSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 19E5E25BC013F9CCC8EAEFB2C36ED8D3 /* MQTTSessionSynchron.h in Headers */ = {isa = PBXBuildFile; fileRef = B1701115A477173C1B8185D5BF1835C5 /* MQTTSessionSynchron.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C193D13BCAED104E80F89EF4E6A12E9 /* MQTTSSLSecurityPolicyDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BAF4A109157C45592A54C29193A6711 /* MQTTSSLSecurityPolicyDecoder.m */; }; + 1EC1601991EB7A9E055EBCFD566A249B /* MQTTSSLSecurityPolicyEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D3A90FD6E02FA56D578F343342118FBE /* MQTTSSLSecurityPolicyEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 20507384E92407711AC55C96A84E7DCA /* MQTTMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 114498BA35AF50A296E6ABB97B43D4FF /* MQTTMessage.m */; }; + 273B7476A9E796D76ADF4E8816DB332D /* ReconnectTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D91700A2D24DFBA68C363B3BFF67C10 /* ReconnectTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2FA7CF081B10D545DB76648E052D1C4F /* GCDTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 206DBC59F2BA2006DB8A55FECC42FE6C /* GCDTimer.m */; }; + 38CA5CC5BBB234238A69087349E35B17 /* Pods-rnmqttexampleTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4640A5AB60154ABA138E0284ECF13C15 /* Pods-rnmqttexampleTests-dummy.m */; }; + 3D390BE94FBD379242D5F21329822232 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + 4010EE2FF5174B915A69DF7E089FEED6 /* MQTTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 695B0E18AA0C65A965BFEEC2D20C8315 /* MQTTLog.m */; }; + 476AE2B0234822CE7C52A5FE84A9C45F /* Pods-rnmqttexample-tvOSTests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA733C653422CB0F4AABABCDB8B7E3C6 /* Pods-rnmqttexample-tvOSTests-dummy.m */; }; + 47F2AB224EC02522DE221C13388139CF /* MQTTCFSocketEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 91B545AE42C68B61D339C156DD39B240 /* MQTTCFSocketEncoder.m */; }; + 4B13942745A44301AB24F6887393D758 /* Pods-rnmqttexampleTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C180A342D60D61C5DEF25431DFF6893 /* Pods-rnmqttexampleTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4BDAC68505887EF539201548552F127A /* MQTTSessionSynchron.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E1D3C44572128F027ADF94BC1F30ECD /* MQTTSessionSynchron.m */; }; + 4C9681257D2F107BFC03B4DEB81D15B7 /* MQTTSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 98676D0F6B8AB5553CE194FAC750B0A2 /* MQTTSessionManager.m */; }; + 508D4B34DD7129921F5668A7C5A9D5CB /* Pods-rnmqttexample-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E9F2924B0177AB15F3EBED123B2D835D /* Pods-rnmqttexample-dummy.m */; }; + 50B54C1B2ACE6C5D9478349E53920822 /* MQTTClient-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E15ED205E6FDF5EDD009B63568D7EF5 /* MQTTClient-dummy.m */; }; + 51456917CA00927A33DFF6E15AF996E2 /* MQTTTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A46227DAF481ADA5BDABA706ED2374A /* MQTTTransport.m */; }; + 55A000F62BDEF5E2CF2931C4DB296A00 /* MQTTTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C80C62F6510D3B8B6255529BA53DFF /* MQTTTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5A0C1DE9E969B2FAF64FF6A1CFE8E949 /* ForegroundReconnection.h in Headers */ = {isa = PBXBuildFile; fileRef = D86DEA52A675361D8A93AB81CAA1FE64 /* ForegroundReconnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5C5CC3A3EF9D7C5B56FA3B9E2EE2705E /* MQTTProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = 99AA68E1132E76E537FEA3E286FF2EC9 /* MQTTProperties.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 65EFBB3A5EF77078B6E9C177AE599F53 /* MQTTCFSocketDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 57893486D67BC33DC0204AF538D12A6A /* MQTTCFSocketDecoder.m */; }; + 66B0F12CE5D4F5736F216A640B426FB3 /* MQTTDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AA950FA73A564E9873FC78E64803964 /* MQTTDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6DEAD8A8411A711F2EBDAA35A5583C37 /* MQTTCoreDataPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 58183E5A2D7A86718369D6D1B4078485 /* MQTTCoreDataPersistence.m */; }; + 742ED567BD90CBF93204FF544D441AE9 /* MQTTStrict.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A220E467F8A88FB7AD61A0EB60089A9 /* MQTTStrict.m */; }; + 799A6FDAF095B1F3D8A1882A34726FCF /* MQTTPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = AC3555B4B89D77A97BD6BE2188CECF57 /* MQTTPersistence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 79B72D6BEEB8345F7CCFD4B72ADB66C7 /* MQTTSSLSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 043B944C5E3788B9AE5DDC1B507DB000 /* MQTTSSLSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E1DE5F1283C8B82E4146BA7DA33766B /* MQTTSSLSecurityPolicyDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 757AD55EADEF9652544B1DE2478490C7 /* MQTTSSLSecurityPolicyDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7E6FE42AA27C5E4B52CF162C907716E0 /* MQTTSessionLegacy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C388F176887B76EC4EA20924B048E0A /* MQTTSessionLegacy.m */; }; + 826B43734D5359F6EF878837EA544D81 /* MQTTDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = F64B6C500C9787828D9D6F89C12E38B2 /* MQTTDecoder.m */; }; + 84D327A98325222685B8445CE8980464 /* MQTTClient-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 95335ABD20F5EB87D5984CD9745475DB /* MQTTClient-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 856763AEC3EC638699D115B720858AEC /* MQTTSSLSecurityPolicyEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = EA99FB5C718326E7AB2255944738E954 /* MQTTSSLSecurityPolicyEncoder.m */; }; + 895A32250BC3831147F8C99B48B5837A /* GCDTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D863BB97D9937270DB3A73374D46D0F /* GCDTimer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8B2160A6E35DFCA9C5CAC57EA3381D47 /* ForegroundReconnection.m in Sources */ = {isa = PBXBuildFile; fileRef = D1EE219480AF94DBC6A07097A92A47EB /* ForegroundReconnection.m */; }; + 900767F3F32DB3B195EBDF3DCDEF8482 /* MQTTSessionLegacy.h in Headers */ = {isa = PBXBuildFile; fileRef = D0799329F5CC44E8340353748DED270E /* MQTTSessionLegacy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 91F25F7698469DE360A97547B8BC1DC5 /* Pods-rnmqttexample-tvOSTests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 16B58244DB88AD67E03378604E7A5209 /* Pods-rnmqttexample-tvOSTests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9727430FF4B4274453CEF27E0DBF2100 /* MQTTSSLSecurityPolicyTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = 92B3E8A5FA7F16A97384709F2F46472C /* MQTTSSLSecurityPolicyTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 97281B4B27087D4B5019950665FF03F5 /* MQTTInMemoryPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EF8804675F9460E3EBF383A1356D716 /* MQTTInMemoryPersistence.m */; }; + A831BD273FCE1517FB4036F73A639FCD /* MQTTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = B03AF7F9E9AF8C26E516D338D5AE97AC /* MQTTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AC597B523650C6FFA1939FA7E77B91C4 /* MQTTCFSocketDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 00CE8B6DFB54D11925F04A952799064D /* MQTTCFSocketDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B62DD8B5EF896477990ACA23B9059129 /* MQTTSSLSecurityPolicyTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = CCFB449088FE8A5D288ECDF19DBF5030 /* MQTTSSLSecurityPolicyTransport.m */; }; + D3470193760B5B2A8E1D00BCBBD78E4C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + D46D6A234AFCFAC516E3B296143C1851 /* Pods-rnmqttexample-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2AC9C74C64DB42E4EB7408445100EEF7 /* Pods-rnmqttexample-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D54716ECE9EA4E760A9BC67F5454DAF9 /* MQTTSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 65DA6D136D9915631F18487072BC2627 /* MQTTSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D7AFD79C85773B1D05741C7C89009581 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + E193E051E13BCE1B11289D8C5A505FFA /* MQTTClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 71FCBACEB7304F91753742AABD0ED44B /* MQTTClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E25E445C4F0D2AD080F8ED0735D7E609 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + E38397861D26C2697B6EE0043A90A28F /* MQTTStrict.h in Headers */ = {isa = PBXBuildFile; fileRef = 48877A463D2A5486F49AA0EF1666C5AE /* MQTTStrict.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E54895DB281FCDAF837DD0CC4EF07AED /* MQTTMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = CFF6BAD9C69D5FF8077FA2438B0384C6 /* MQTTMessage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E9F51364F2FD8768506A6A9F10175433 /* MQTTInMemoryPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C97E5EB1A55226C90E4F1E76FF816B7 /* MQTTInMemoryPersistence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EDC496F23A3F36AD2A5C11240DCE31CF /* MQTTCoreDataPersistence.h in Headers */ = {isa = PBXBuildFile; fileRef = A254FB8375E1BC9E913A0D9E165FA500 /* MQTTCoreDataPersistence.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EE2505695E2283C92EEC79FD96593A23 /* MQTTCFSocketTransport.h in Headers */ = {isa = PBXBuildFile; fileRef = 56E476DC3CFB6F79C619A238F3A03991 /* MQTTCFSocketTransport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + EF75B1C06B8B4DDB29E1F6E1E9B004E0 /* MQTTCFSocketTransport.m in Sources */ = {isa = PBXBuildFile; fileRef = 1764CCAA01AE39AA1A7E2CA9741733C4 /* MQTTCFSocketTransport.m */; }; + F62244197805FC4A02CC8274025D2C62 /* ReconnectTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 23B8FFEF8B1AAED77994CAA4116CDF67 /* ReconnectTimer.m */; }; + F80E2AFBFFEF3CADF33CF8EF6A93D4CD /* MQTTCFSocketEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D77E0435AB0E8CA41E8F5ACD21C2175C /* MQTTCFSocketEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FDB843868D624D68AD08D097426841B4 /* MQTTProperties.m in Sources */ = {isa = PBXBuildFile; fileRef = D315FC044FD1DFEA16BE09540B0E729D /* MQTTProperties.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1C0975133E95072CB3C59C09E882A5D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 18D5937A1FF4E1064BDE592E5E9532EA; + remoteInfo = MQTTClient; + }; + 6E5BF9D8FB153098BBA945852510F471 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 841F5F0F6099124C245D0CBBDD125964; + remoteInfo = "Pods-rnmqttexample"; + }; + 9132ED34A2F95F8F3E476076AD54F7D3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 841F5F0F6099124C245D0CBBDD125964; + remoteInfo = "Pods-rnmqttexample"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00CE8B6DFB54D11925F04A952799064D /* MQTTCFSocketDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketDecoder.h; path = MQTTClient/MQTTClient/MQTTCFSocketDecoder.h; sourceTree = ""; }; + 043B944C5E3788B9AE5DDC1B507DB000 /* MQTTSSLSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicy.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.h; sourceTree = ""; }; + 0A220E467F8A88FB7AD61A0EB60089A9 /* MQTTStrict.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTStrict.m; path = MQTTClient/MQTTClient/MQTTStrict.m; sourceTree = ""; }; + 114498BA35AF50A296E6ABB97B43D4FF /* MQTTMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTMessage.m; path = MQTTClient/MQTTClient/MQTTMessage.m; sourceTree = ""; }; + 16B58244DB88AD67E03378604E7A5209 /* Pods-rnmqttexample-tvOSTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-rnmqttexample-tvOSTests-umbrella.h"; sourceTree = ""; }; + 1764CCAA01AE39AA1A7E2CA9741733C4 /* MQTTCFSocketTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketTransport.m; path = MQTTClient/MQTTClient/MQTTCFSocketTransport.m; sourceTree = ""; }; + 206DBC59F2BA2006DB8A55FECC42FE6C /* GCDTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = GCDTimer.m; path = MQTTClient/MQTTClient/GCDTimer.m; sourceTree = ""; }; + 23B8FFEF8B1AAED77994CAA4116CDF67 /* ReconnectTimer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ReconnectTimer.m; path = MQTTClient/MQTTClient/ReconnectTimer.m; sourceTree = ""; }; + 24E66A4BC997EA1F9C740FEF2A1397BE /* Pods_rnmqttexample_tvOSTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_rnmqttexample_tvOSTests.framework; path = "Pods-rnmqttexample-tvOSTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2A46227DAF481ADA5BDABA706ED2374A /* MQTTTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTTransport.m; path = MQTTClient/MQTTClient/MQTTTransport.m; sourceTree = ""; }; + 2AC9C74C64DB42E4EB7408445100EEF7 /* Pods-rnmqttexample-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-rnmqttexample-umbrella.h"; sourceTree = ""; }; + 2C388F176887B76EC4EA20924B048E0A /* MQTTSessionLegacy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionLegacy.m; path = MQTTClient/MQTTClient/MQTTSessionLegacy.m; sourceTree = ""; }; + 2C97E5EB1A55226C90E4F1E76FF816B7 /* MQTTInMemoryPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTInMemoryPersistence.h; path = MQTTClient/MQTTClient/MQTTInMemoryPersistence.h; sourceTree = ""; }; + 2E8B83313247124754E35547045F4DEC /* Pods_rnmqttexample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_rnmqttexample.framework; path = "Pods-rnmqttexample.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 366B24B63D9C5319295BB5436CF6DFE1 /* MQTTClient.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MQTTClient.modulemap; sourceTree = ""; }; + 39FB0A9001A2192FD9EE4B45BEBB88CE /* Pods-rnmqttexampleTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-rnmqttexampleTests.modulemap"; sourceTree = ""; }; + 3FF842A4D8FA50CC1D1330805226F314 /* Pods-rnmqttexample-tvOSTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-rnmqttexample-tvOSTests-acknowledgements.markdown"; sourceTree = ""; }; + 45DF397AA953BFA7B53B27A0F8226BD0 /* MQTTSession.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSession.m; path = MQTTClient/MQTTClient/MQTTSession.m; sourceTree = ""; }; + 4640A5AB60154ABA138E0284ECF13C15 /* Pods-rnmqttexampleTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-rnmqttexampleTests-dummy.m"; sourceTree = ""; }; + 47D12E0E007DEEF19897B1AEF0F03FBA /* MQTTSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSession.h; path = MQTTClient/MQTTClient/MQTTSession.h; sourceTree = ""; }; + 48877A463D2A5486F49AA0EF1666C5AE /* MQTTStrict.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTStrict.h; path = MQTTClient/MQTTClient/MQTTStrict.h; sourceTree = ""; }; + 4A47F285DD7DEB785CFF698C1C9DB26B /* MQTTClient.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MQTTClient.framework; path = MQTTClient.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4AA950FA73A564E9873FC78E64803964 /* MQTTDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTDecoder.h; path = MQTTClient/MQTTClient/MQTTDecoder.h; sourceTree = ""; }; + 4D91700A2D24DFBA68C363B3BFF67C10 /* ReconnectTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ReconnectTimer.h; path = MQTTClient/MQTTClient/ReconnectTimer.h; sourceTree = ""; }; + 4E451250F4BF966B425729E3094A999F /* Pods-rnmqttexample.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-rnmqttexample.modulemap"; sourceTree = ""; }; + 543DC7D8967CA0A8D86562E807ECECE1 /* Pods-rnmqttexample-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexample-acknowledgements.plist"; sourceTree = ""; }; + 56E476DC3CFB6F79C619A238F3A03991 /* MQTTCFSocketTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketTransport.h; path = MQTTClient/MQTTClient/MQTTCFSocketTransport.h; sourceTree = ""; }; + 5747B7B03ADDF4C44EE4611EF0B54731 /* Pods-rnmqttexample-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-rnmqttexample-acknowledgements.markdown"; sourceTree = ""; }; + 57893486D67BC33DC0204AF538D12A6A /* MQTTCFSocketDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketDecoder.m; path = MQTTClient/MQTTClient/MQTTCFSocketDecoder.m; sourceTree = ""; }; + 58183E5A2D7A86718369D6D1B4078485 /* MQTTCoreDataPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCoreDataPersistence.m; path = MQTTClient/MQTTClient/MQTTCoreDataPersistence.m; sourceTree = ""; }; + 5EF8804675F9460E3EBF383A1356D716 /* MQTTInMemoryPersistence.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTInMemoryPersistence.m; path = MQTTClient/MQTTClient/MQTTInMemoryPersistence.m; sourceTree = ""; }; + 62429CA16866441763042399EDAD116B /* MQTTClient-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MQTTClient-Info.plist"; sourceTree = ""; }; + 65DA6D136D9915631F18487072BC2627 /* MQTTSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionManager.h; path = MQTTClient/MQTTClient/MQTTSessionManager.h; sourceTree = ""; }; + 680DE6357E5B26158E54788935F2D8DE /* Pods-rnmqttexample-tvOSTests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-rnmqttexample-tvOSTests.modulemap"; sourceTree = ""; }; + 695B0E18AA0C65A965BFEEC2D20C8315 /* MQTTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTLog.m; path = MQTTClient/MQTTClient/MQTTLog.m; sourceTree = ""; }; + 6D55D31B379EB07668DF6AC717FC12C6 /* Pods-rnmqttexampleTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexampleTests-acknowledgements.plist"; sourceTree = ""; }; + 6E15ED205E6FDF5EDD009B63568D7EF5 /* MQTTClient-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MQTTClient-dummy.m"; sourceTree = ""; }; + 6E1D3C44572128F027ADF94BC1F30ECD /* MQTTSessionSynchron.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionSynchron.m; path = MQTTClient/MQTTClient/MQTTSessionSynchron.m; sourceTree = ""; }; + 71FCBACEB7304F91753742AABD0ED44B /* MQTTClient.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTClient.h; path = MQTTClient/MQTTClient/MQTTClient.h; sourceTree = ""; }; + 73D196833D5A521CB74C86E07E2DC7E4 /* Pods-rnmqttexample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexample.release.xcconfig"; sourceTree = ""; }; + 757AD55EADEF9652544B1DE2478490C7 /* MQTTSSLSecurityPolicyDecoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyDecoder.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.h; sourceTree = ""; }; + 79F28A7D1113EFB2802066ED47DB51FF /* MQTTSSLSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicy.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicy.m; sourceTree = ""; }; + 7C10F90718899605516C654EC7963B5E /* Pods-rnmqttexampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexampleTests.debug.xcconfig"; sourceTree = ""; }; + 8A5874030EE2122888B59316BCC0CDD0 /* Pods-rnmqttexample-tvOSTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexample-tvOSTests-Info.plist"; sourceTree = ""; }; + 8BAF4A109157C45592A54C29193A6711 /* MQTTSSLSecurityPolicyDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyDecoder.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyDecoder.m; sourceTree = ""; }; + 8CE039802A9A888F8A00DF7A6D518832 /* Pods-rnmqttexample-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-rnmqttexample-frameworks.sh"; sourceTree = ""; }; + 91B545AE42C68B61D339C156DD39B240 /* MQTTCFSocketEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTCFSocketEncoder.m; path = MQTTClient/MQTTClient/MQTTCFSocketEncoder.m; sourceTree = ""; }; + 92B3E8A5FA7F16A97384709F2F46472C /* MQTTSSLSecurityPolicyTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyTransport.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.h; sourceTree = ""; }; + 95335ABD20F5EB87D5984CD9745475DB /* MQTTClient-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MQTTClient-umbrella.h"; sourceTree = ""; }; + 98676D0F6B8AB5553CE194FAC750B0A2 /* MQTTSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSessionManager.m; path = MQTTClient/MQTTClient/MQTTSessionManager.m; sourceTree = ""; }; + 99AA68E1132E76E537FEA3E286FF2EC9 /* MQTTProperties.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTProperties.h; path = MQTTClient/MQTTClient/MQTTProperties.h; sourceTree = ""; }; + 9C180A342D60D61C5DEF25431DFF6893 /* Pods-rnmqttexampleTests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-rnmqttexampleTests-umbrella.h"; sourceTree = ""; }; + 9D863BB97D9937270DB3A73374D46D0F /* GCDTimer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = GCDTimer.h; path = MQTTClient/MQTTClient/GCDTimer.h; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A254FB8375E1BC9E913A0D9E165FA500 /* MQTTCoreDataPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCoreDataPersistence.h; path = MQTTClient/MQTTClient/MQTTCoreDataPersistence.h; sourceTree = ""; }; + A8C80C62F6510D3B8B6255529BA53DFF /* MQTTTransport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTTransport.h; path = MQTTClient/MQTTClient/MQTTTransport.h; sourceTree = ""; }; + AA733C653422CB0F4AABABCDB8B7E3C6 /* Pods-rnmqttexample-tvOSTests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-rnmqttexample-tvOSTests-dummy.m"; sourceTree = ""; }; + AC3555B4B89D77A97BD6BE2188CECF57 /* MQTTPersistence.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTPersistence.h; path = MQTTClient/MQTTClient/MQTTPersistence.h; sourceTree = ""; }; + B03AF7F9E9AF8C26E516D338D5AE97AC /* MQTTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTLog.h; path = MQTTClient/MQTTClient/MQTTLog.h; sourceTree = ""; }; + B1701115A477173C1B8185D5BF1835C5 /* MQTTSessionSynchron.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionSynchron.h; path = MQTTClient/MQTTClient/MQTTSessionSynchron.h; sourceTree = ""; }; + B86CD12592F80F7E0A6EB47807D18F63 /* Pods-rnmqttexampleTests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-rnmqttexampleTests-acknowledgements.markdown"; sourceTree = ""; }; + B9538DC4521AAAF51C67E5A87FE43788 /* MQTTClient-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MQTTClient-prefix.pch"; sourceTree = ""; }; + B967A79A726F79F46B06582729D7CC92 /* MQTTClient.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MQTTClient.xcconfig; sourceTree = ""; }; + BBFED176CAB6A34BC0F6D2514E26A8AD /* Pods-rnmqttexample-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexample-tvOSTests.release.xcconfig"; sourceTree = ""; }; + C75CB83D73C171AEACDAF0A58B4C360E /* Pods_rnmqttexampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_rnmqttexampleTests.framework; path = "Pods-rnmqttexampleTests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + CAA764A178A18893D14F8E24C3738AE1 /* Pods-rnmqttexampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexampleTests.release.xcconfig"; sourceTree = ""; }; + CCFB449088FE8A5D288ECDF19DBF5030 /* MQTTSSLSecurityPolicyTransport.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyTransport.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyTransport.m; sourceTree = ""; }; + CFF6BAD9C69D5FF8077FA2438B0384C6 /* MQTTMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTMessage.h; path = MQTTClient/MQTTClient/MQTTMessage.h; sourceTree = ""; }; + D0799329F5CC44E8340353748DED270E /* MQTTSessionLegacy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSessionLegacy.h; path = MQTTClient/MQTTClient/MQTTSessionLegacy.h; sourceTree = ""; }; + D1EE219480AF94DBC6A07097A92A47EB /* ForegroundReconnection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ForegroundReconnection.m; path = MQTTClient/MQTTClient/ForegroundReconnection.m; sourceTree = ""; }; + D315FC044FD1DFEA16BE09540B0E729D /* MQTTProperties.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTProperties.m; path = MQTTClient/MQTTClient/MQTTProperties.m; sourceTree = ""; }; + D3A90FD6E02FA56D578F343342118FBE /* MQTTSSLSecurityPolicyEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTSSLSecurityPolicyEncoder.h; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.h; sourceTree = ""; }; + D77E0435AB0E8CA41E8F5ACD21C2175C /* MQTTCFSocketEncoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MQTTCFSocketEncoder.h; path = MQTTClient/MQTTClient/MQTTCFSocketEncoder.h; sourceTree = ""; }; + D86DEA52A675361D8A93AB81CAA1FE64 /* ForegroundReconnection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ForegroundReconnection.h; path = MQTTClient/MQTTClient/ForegroundReconnection.h; sourceTree = ""; }; + DFDCC2B28B369A1B060E0B1DAEF29B95 /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexample-tvOSTests.debug.xcconfig"; sourceTree = ""; }; + E09827028DDA9085D21B2040E5D29598 /* Pods-rnmqttexampleTests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexampleTests-Info.plist"; sourceTree = ""; }; + E7358FEFB1B3ABAB390CB24974FC0B7F /* Pods-rnmqttexample-tvOSTests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexample-tvOSTests-acknowledgements.plist"; sourceTree = ""; }; + E7619C9FFF8CBAEBA327C85200B23C7C /* Pods-rnmqttexample-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-rnmqttexample-Info.plist"; sourceTree = ""; }; + E9F2924B0177AB15F3EBED123B2D835D /* Pods-rnmqttexample-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-rnmqttexample-dummy.m"; sourceTree = ""; }; + EA99FB5C718326E7AB2255944738E954 /* MQTTSSLSecurityPolicyEncoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTSSLSecurityPolicyEncoder.m; path = MQTTClient/MQTTClient/MQTTSSLSecurityPolicyEncoder.m; sourceTree = ""; }; + F2F9487DBB3DD01A8D4E22359CF7A29F /* Pods-rnmqttexample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-rnmqttexample.debug.xcconfig"; sourceTree = ""; }; + F64B6C500C9787828D9D6F89C12E38B2 /* MQTTDecoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MQTTDecoder.m; path = MQTTClient/MQTTClient/MQTTDecoder.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 698304055415627D9ACAE456224135E9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D7AFD79C85773B1D05741C7C89009581 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7F86418C0FFD4B8D5F66BD4585844F9D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E25E445C4F0D2AD080F8ED0735D7E609 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 80E8890A7BAD7DB0FDAAE88748D552B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3D390BE94FBD379242D5F21329822232 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9D2FB95B4EC5DF962698D4D800911D4B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D3470193760B5B2A8E1D00BCBBD78E4C /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0653211B05E15EC4DA54D2E51588959B /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 5A9A8EF2928E898930F1D69B4621F544 /* Pods-rnmqttexample */, + 568D767E8C303C6650E02718C9DB4683 /* Pods-rnmqttexample-tvOSTests */, + 8856828A1C929E5176145E7F3D2E7F78 /* Pods-rnmqttexampleTests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 32C0D158974F1CE62506D3F265D11324 /* Manager */ = { + isa = PBXGroup; + children = ( + D86DEA52A675361D8A93AB81CAA1FE64 /* ForegroundReconnection.h */, + D1EE219480AF94DBC6A07097A92A47EB /* ForegroundReconnection.m */, + 65DA6D136D9915631F18487072BC2627 /* MQTTSessionManager.h */, + 98676D0F6B8AB5553CE194FAC750B0A2 /* MQTTSessionManager.m */, + 4D91700A2D24DFBA68C363B3BFF67C10 /* ReconnectTimer.h */, + 23B8FFEF8B1AAED77994CAA4116CDF67 /* ReconnectTimer.m */, + ); + name = Manager; + sourceTree = ""; + }; + 48E308053618F8F4B3F24E289A759972 /* Min */ = { + isa = PBXGroup; + children = ( + 9D863BB97D9937270DB3A73374D46D0F /* GCDTimer.h */, + 206DBC59F2BA2006DB8A55FECC42FE6C /* GCDTimer.m */, + 00CE8B6DFB54D11925F04A952799064D /* MQTTCFSocketDecoder.h */, + 57893486D67BC33DC0204AF538D12A6A /* MQTTCFSocketDecoder.m */, + D77E0435AB0E8CA41E8F5ACD21C2175C /* MQTTCFSocketEncoder.h */, + 91B545AE42C68B61D339C156DD39B240 /* MQTTCFSocketEncoder.m */, + 56E476DC3CFB6F79C619A238F3A03991 /* MQTTCFSocketTransport.h */, + 1764CCAA01AE39AA1A7E2CA9741733C4 /* MQTTCFSocketTransport.m */, + 71FCBACEB7304F91753742AABD0ED44B /* MQTTClient.h */, + A254FB8375E1BC9E913A0D9E165FA500 /* MQTTCoreDataPersistence.h */, + 58183E5A2D7A86718369D6D1B4078485 /* MQTTCoreDataPersistence.m */, + 4AA950FA73A564E9873FC78E64803964 /* MQTTDecoder.h */, + F64B6C500C9787828D9D6F89C12E38B2 /* MQTTDecoder.m */, + 2C97E5EB1A55226C90E4F1E76FF816B7 /* MQTTInMemoryPersistence.h */, + 5EF8804675F9460E3EBF383A1356D716 /* MQTTInMemoryPersistence.m */, + B03AF7F9E9AF8C26E516D338D5AE97AC /* MQTTLog.h */, + 695B0E18AA0C65A965BFEEC2D20C8315 /* MQTTLog.m */, + CFF6BAD9C69D5FF8077FA2438B0384C6 /* MQTTMessage.h */, + 114498BA35AF50A296E6ABB97B43D4FF /* MQTTMessage.m */, + AC3555B4B89D77A97BD6BE2188CECF57 /* MQTTPersistence.h */, + 99AA68E1132E76E537FEA3E286FF2EC9 /* MQTTProperties.h */, + D315FC044FD1DFEA16BE09540B0E729D /* MQTTProperties.m */, + 47D12E0E007DEEF19897B1AEF0F03FBA /* MQTTSession.h */, + 45DF397AA953BFA7B53B27A0F8226BD0 /* MQTTSession.m */, + D0799329F5CC44E8340353748DED270E /* MQTTSessionLegacy.h */, + 2C388F176887B76EC4EA20924B048E0A /* MQTTSessionLegacy.m */, + B1701115A477173C1B8185D5BF1835C5 /* MQTTSessionSynchron.h */, + 6E1D3C44572128F027ADF94BC1F30ECD /* MQTTSessionSynchron.m */, + 043B944C5E3788B9AE5DDC1B507DB000 /* MQTTSSLSecurityPolicy.h */, + 79F28A7D1113EFB2802066ED47DB51FF /* MQTTSSLSecurityPolicy.m */, + 757AD55EADEF9652544B1DE2478490C7 /* MQTTSSLSecurityPolicyDecoder.h */, + 8BAF4A109157C45592A54C29193A6711 /* MQTTSSLSecurityPolicyDecoder.m */, + D3A90FD6E02FA56D578F343342118FBE /* MQTTSSLSecurityPolicyEncoder.h */, + EA99FB5C718326E7AB2255944738E954 /* MQTTSSLSecurityPolicyEncoder.m */, + 92B3E8A5FA7F16A97384709F2F46472C /* MQTTSSLSecurityPolicyTransport.h */, + CCFB449088FE8A5D288ECDF19DBF5030 /* MQTTSSLSecurityPolicyTransport.m */, + 48877A463D2A5486F49AA0EF1666C5AE /* MQTTStrict.h */, + 0A220E467F8A88FB7AD61A0EB60089A9 /* MQTTStrict.m */, + A8C80C62F6510D3B8B6255529BA53DFF /* MQTTTransport.h */, + 2A46227DAF481ADA5BDABA706ED2374A /* MQTTTransport.m */, + ); + name = Min; + sourceTree = ""; + }; + 568D767E8C303C6650E02718C9DB4683 /* Pods-rnmqttexample-tvOSTests */ = { + isa = PBXGroup; + children = ( + 680DE6357E5B26158E54788935F2D8DE /* Pods-rnmqttexample-tvOSTests.modulemap */, + 3FF842A4D8FA50CC1D1330805226F314 /* Pods-rnmqttexample-tvOSTests-acknowledgements.markdown */, + E7358FEFB1B3ABAB390CB24974FC0B7F /* Pods-rnmqttexample-tvOSTests-acknowledgements.plist */, + AA733C653422CB0F4AABABCDB8B7E3C6 /* Pods-rnmqttexample-tvOSTests-dummy.m */, + 8A5874030EE2122888B59316BCC0CDD0 /* Pods-rnmqttexample-tvOSTests-Info.plist */, + 16B58244DB88AD67E03378604E7A5209 /* Pods-rnmqttexample-tvOSTests-umbrella.h */, + DFDCC2B28B369A1B060E0B1DAEF29B95 /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */, + BBFED176CAB6A34BC0F6D2514E26A8AD /* Pods-rnmqttexample-tvOSTests.release.xcconfig */, + ); + name = "Pods-rnmqttexample-tvOSTests"; + path = "Target Support Files/Pods-rnmqttexample-tvOSTests"; + sourceTree = ""; + }; + 5A9A8EF2928E898930F1D69B4621F544 /* Pods-rnmqttexample */ = { + isa = PBXGroup; + children = ( + 4E451250F4BF966B425729E3094A999F /* Pods-rnmqttexample.modulemap */, + 5747B7B03ADDF4C44EE4611EF0B54731 /* Pods-rnmqttexample-acknowledgements.markdown */, + 543DC7D8967CA0A8D86562E807ECECE1 /* Pods-rnmqttexample-acknowledgements.plist */, + E9F2924B0177AB15F3EBED123B2D835D /* Pods-rnmqttexample-dummy.m */, + 8CE039802A9A888F8A00DF7A6D518832 /* Pods-rnmqttexample-frameworks.sh */, + E7619C9FFF8CBAEBA327C85200B23C7C /* Pods-rnmqttexample-Info.plist */, + 2AC9C74C64DB42E4EB7408445100EEF7 /* Pods-rnmqttexample-umbrella.h */, + F2F9487DBB3DD01A8D4E22359CF7A29F /* Pods-rnmqttexample.debug.xcconfig */, + 73D196833D5A521CB74C86E07E2DC7E4 /* Pods-rnmqttexample.release.xcconfig */, + ); + name = "Pods-rnmqttexample"; + path = "Target Support Files/Pods-rnmqttexample"; + sourceTree = ""; + }; + 72BC828B0D0766305E9F4CE0D97A7B9C /* Pods */ = { + isa = PBXGroup; + children = ( + 9A2FB64D898BE089C24D54F344496CA0 /* MQTTClient */, + ); + name = Pods; + sourceTree = ""; + }; + 78F908D8FC8F4FC2976F7A1BD6F95694 /* Support Files */ = { + isa = PBXGroup; + children = ( + 366B24B63D9C5319295BB5436CF6DFE1 /* MQTTClient.modulemap */, + B967A79A726F79F46B06582729D7CC92 /* MQTTClient.xcconfig */, + 6E15ED205E6FDF5EDD009B63568D7EF5 /* MQTTClient-dummy.m */, + 62429CA16866441763042399EDAD116B /* MQTTClient-Info.plist */, + B9538DC4521AAAF51C67E5A87FE43788 /* MQTTClient-prefix.pch */, + 95335ABD20F5EB87D5984CD9745475DB /* MQTTClient-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/MQTTClient"; + sourceTree = ""; + }; + 8856828A1C929E5176145E7F3D2E7F78 /* Pods-rnmqttexampleTests */ = { + isa = PBXGroup; + children = ( + 39FB0A9001A2192FD9EE4B45BEBB88CE /* Pods-rnmqttexampleTests.modulemap */, + B86CD12592F80F7E0A6EB47807D18F63 /* Pods-rnmqttexampleTests-acknowledgements.markdown */, + 6D55D31B379EB07668DF6AC717FC12C6 /* Pods-rnmqttexampleTests-acknowledgements.plist */, + 4640A5AB60154ABA138E0284ECF13C15 /* Pods-rnmqttexampleTests-dummy.m */, + E09827028DDA9085D21B2040E5D29598 /* Pods-rnmqttexampleTests-Info.plist */, + 9C180A342D60D61C5DEF25431DFF6893 /* Pods-rnmqttexampleTests-umbrella.h */, + 7C10F90718899605516C654EC7963B5E /* Pods-rnmqttexampleTests.debug.xcconfig */, + CAA764A178A18893D14F8E24C3738AE1 /* Pods-rnmqttexampleTests.release.xcconfig */, + ); + name = "Pods-rnmqttexampleTests"; + path = "Target Support Files/Pods-rnmqttexampleTests"; + sourceTree = ""; + }; + 9A2FB64D898BE089C24D54F344496CA0 /* MQTTClient */ = { + isa = PBXGroup; + children = ( + 32C0D158974F1CE62506D3F265D11324 /* Manager */, + 48E308053618F8F4B3F24E289A759972 /* Min */, + 78F908D8FC8F4FC2976F7A1BD6F95694 /* Support Files */, + ); + name = MQTTClient; + path = MQTTClient; + sourceTree = ""; + }; + C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { + isa = PBXGroup; + children = ( + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 72BC828B0D0766305E9F4CE0D97A7B9C /* Pods */, + E5F884FA83C4650F24B0C45E94CACE0B /* Products */, + 0653211B05E15EC4DA54D2E51588959B /* Targets Support Files */, + ); + sourceTree = ""; + }; + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C0834CEBB1379A84116EF29F93051C60 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + E5F884FA83C4650F24B0C45E94CACE0B /* Products */ = { + isa = PBXGroup; + children = ( + 4A47F285DD7DEB785CFF698C1C9DB26B /* MQTTClient.framework */, + 2E8B83313247124754E35547045F4DEC /* Pods_rnmqttexample.framework */, + 24E66A4BC997EA1F9C740FEF2A1397BE /* Pods_rnmqttexample_tvOSTests.framework */, + C75CB83D73C171AEACDAF0A58B4C360E /* Pods_rnmqttexampleTests.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + D0E2F55E1ADA507E4C183C030ACD1A26 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 4B13942745A44301AB24F6887393D758 /* Pods-rnmqttexampleTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EAFF6263F670AD1CA1B62368D81FCE77 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D46D6A234AFCFAC516E3B296143C1851 /* Pods-rnmqttexample-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F326CB559D93896BB7F52DBD38D8D58E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 91F25F7698469DE360A97547B8BC1DC5 /* Pods-rnmqttexample-tvOSTests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FEAAA76F52C17930C600BA91354018AA /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 5A0C1DE9E969B2FAF64FF6A1CFE8E949 /* ForegroundReconnection.h in Headers */, + 895A32250BC3831147F8C99B48B5837A /* GCDTimer.h in Headers */, + AC597B523650C6FFA1939FA7E77B91C4 /* MQTTCFSocketDecoder.h in Headers */, + F80E2AFBFFEF3CADF33CF8EF6A93D4CD /* MQTTCFSocketEncoder.h in Headers */, + EE2505695E2283C92EEC79FD96593A23 /* MQTTCFSocketTransport.h in Headers */, + 84D327A98325222685B8445CE8980464 /* MQTTClient-umbrella.h in Headers */, + E193E051E13BCE1B11289D8C5A505FFA /* MQTTClient.h in Headers */, + EDC496F23A3F36AD2A5C11240DCE31CF /* MQTTCoreDataPersistence.h in Headers */, + 66B0F12CE5D4F5736F216A640B426FB3 /* MQTTDecoder.h in Headers */, + E9F51364F2FD8768506A6A9F10175433 /* MQTTInMemoryPersistence.h in Headers */, + A831BD273FCE1517FB4036F73A639FCD /* MQTTLog.h in Headers */, + E54895DB281FCDAF837DD0CC4EF07AED /* MQTTMessage.h in Headers */, + 799A6FDAF095B1F3D8A1882A34726FCF /* MQTTPersistence.h in Headers */, + 5C5CC3A3EF9D7C5B56FA3B9E2EE2705E /* MQTTProperties.h in Headers */, + 165F8C230775AF96940440AF2069072C /* MQTTSession.h in Headers */, + 900767F3F32DB3B195EBDF3DCDEF8482 /* MQTTSessionLegacy.h in Headers */, + D54716ECE9EA4E760A9BC67F5454DAF9 /* MQTTSessionManager.h in Headers */, + 19E5E25BC013F9CCC8EAEFB2C36ED8D3 /* MQTTSessionSynchron.h in Headers */, + 79B72D6BEEB8345F7CCFD4B72ADB66C7 /* MQTTSSLSecurityPolicy.h in Headers */, + 7E1DE5F1283C8B82E4146BA7DA33766B /* MQTTSSLSecurityPolicyDecoder.h in Headers */, + 1EC1601991EB7A9E055EBCFD566A249B /* MQTTSSLSecurityPolicyEncoder.h in Headers */, + 9727430FF4B4274453CEF27E0DBF2100 /* MQTTSSLSecurityPolicyTransport.h in Headers */, + E38397861D26C2697B6EE0043A90A28F /* MQTTStrict.h in Headers */, + 55A000F62BDEF5E2CF2931C4DB296A00 /* MQTTTransport.h in Headers */, + 273B7476A9E796D76ADF4E8816DB332D /* ReconnectTimer.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 18D5937A1FF4E1064BDE592E5E9532EA /* MQTTClient */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4E1AC34BECFA53F94BDD1AE99209BEC2 /* Build configuration list for PBXNativeTarget "MQTTClient" */; + buildPhases = ( + FEAAA76F52C17930C600BA91354018AA /* Headers */, + 97E6ECDA8CB5A3C2C2DC20B1A9927AA8 /* Sources */, + 9D2FB95B4EC5DF962698D4D800911D4B /* Frameworks */, + 899B68737B74B7187657290EC2AB0ACB /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MQTTClient; + productName = MQTTClient; + productReference = 4A47F285DD7DEB785CFF698C1C9DB26B /* MQTTClient.framework */; + productType = "com.apple.product-type.framework"; + }; + 1CB4FA44BE07F11AB837552BDD715847 /* Pods-rnmqttexample-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6B6590633E85ACF48783DCCC725E330F /* Build configuration list for PBXNativeTarget "Pods-rnmqttexample-tvOSTests" */; + buildPhases = ( + F326CB559D93896BB7F52DBD38D8D58E /* Headers */, + 86CAA91CB96A62C75248DA978B5CC61E /* Sources */, + 7F86418C0FFD4B8D5F66BD4585844F9D /* Frameworks */, + BF8B9F3F112260634F45D3BF4EF56B02 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 800FC72E4CC5FC2A95D1F4200070EA58 /* PBXTargetDependency */, + ); + name = "Pods-rnmqttexample-tvOSTests"; + productName = "Pods-rnmqttexample-tvOSTests"; + productReference = 24E66A4BC997EA1F9C740FEF2A1397BE /* Pods_rnmqttexample_tvOSTests.framework */; + productType = "com.apple.product-type.framework"; + }; + 841F5F0F6099124C245D0CBBDD125964 /* Pods-rnmqttexample */ = { + isa = PBXNativeTarget; + buildConfigurationList = AADB7B158281F56E88D3B55B80AF63E3 /* Build configuration list for PBXNativeTarget "Pods-rnmqttexample" */; + buildPhases = ( + EAFF6263F670AD1CA1B62368D81FCE77 /* Headers */, + 3BEB6AF7078F8D54E8861CE9F905C066 /* Sources */, + 80E8890A7BAD7DB0FDAAE88748D552B9 /* Frameworks */, + 678C6C9A2003FC576BDECB37515D3BF9 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 17AFAF6E07B2FED48006F578DADEA4F4 /* PBXTargetDependency */, + ); + name = "Pods-rnmqttexample"; + productName = "Pods-rnmqttexample"; + productReference = 2E8B83313247124754E35547045F4DEC /* Pods_rnmqttexample.framework */; + productType = "com.apple.product-type.framework"; + }; + D75DCF6E6C08064402847852C5C19BB5 /* Pods-rnmqttexampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5E1467541356101DEE7542246EA7F406 /* Build configuration list for PBXNativeTarget "Pods-rnmqttexampleTests" */; + buildPhases = ( + D0E2F55E1ADA507E4C183C030ACD1A26 /* Headers */, + 6DF92D473713C5A0070AAD81F236F0C6 /* Sources */, + 698304055415627D9ACAE456224135E9 /* Frameworks */, + 5E254CAA48F0F7419E34A354CFC9E845 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + E6C1491AB0EF90DDE4B5C18499787AF2 /* PBXTargetDependency */, + ); + name = "Pods-rnmqttexampleTests"; + productName = "Pods-rnmqttexampleTests"; + productReference = C75CB83D73C171AEACDAF0A58B4C360E /* Pods_rnmqttexampleTests.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1020; + LastUpgradeCheck = 1020; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = E5F884FA83C4650F24B0C45E94CACE0B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 18D5937A1FF4E1064BDE592E5E9532EA /* MQTTClient */, + 841F5F0F6099124C245D0CBBDD125964 /* Pods-rnmqttexample */, + 1CB4FA44BE07F11AB837552BDD715847 /* Pods-rnmqttexample-tvOSTests */, + D75DCF6E6C08064402847852C5C19BB5 /* Pods-rnmqttexampleTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5E254CAA48F0F7419E34A354CFC9E845 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 678C6C9A2003FC576BDECB37515D3BF9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 899B68737B74B7187657290EC2AB0ACB /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + BF8B9F3F112260634F45D3BF4EF56B02 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3BEB6AF7078F8D54E8861CE9F905C066 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 508D4B34DD7129921F5668A7C5A9D5CB /* Pods-rnmqttexample-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6DF92D473713C5A0070AAD81F236F0C6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 38CA5CC5BBB234238A69087349E35B17 /* Pods-rnmqttexampleTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 86CAA91CB96A62C75248DA978B5CC61E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 476AE2B0234822CE7C52A5FE84A9C45F /* Pods-rnmqttexample-tvOSTests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97E6ECDA8CB5A3C2C2DC20B1A9927AA8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B2160A6E35DFCA9C5CAC57EA3381D47 /* ForegroundReconnection.m in Sources */, + 2FA7CF081B10D545DB76648E052D1C4F /* GCDTimer.m in Sources */, + 65EFBB3A5EF77078B6E9C177AE599F53 /* MQTTCFSocketDecoder.m in Sources */, + 47F2AB224EC02522DE221C13388139CF /* MQTTCFSocketEncoder.m in Sources */, + EF75B1C06B8B4DDB29E1F6E1E9B004E0 /* MQTTCFSocketTransport.m in Sources */, + 50B54C1B2ACE6C5D9478349E53920822 /* MQTTClient-dummy.m in Sources */, + 6DEAD8A8411A711F2EBDAA35A5583C37 /* MQTTCoreDataPersistence.m in Sources */, + 826B43734D5359F6EF878837EA544D81 /* MQTTDecoder.m in Sources */, + 97281B4B27087D4B5019950665FF03F5 /* MQTTInMemoryPersistence.m in Sources */, + 4010EE2FF5174B915A69DF7E089FEED6 /* MQTTLog.m in Sources */, + 20507384E92407711AC55C96A84E7DCA /* MQTTMessage.m in Sources */, + FDB843868D624D68AD08D097426841B4 /* MQTTProperties.m in Sources */, + 11FF4E001127F41E46F1D68D68825C36 /* MQTTSession.m in Sources */, + 7E6FE42AA27C5E4B52CF162C907716E0 /* MQTTSessionLegacy.m in Sources */, + 4C9681257D2F107BFC03B4DEB81D15B7 /* MQTTSessionManager.m in Sources */, + 4BDAC68505887EF539201548552F127A /* MQTTSessionSynchron.m in Sources */, + 0CC1E165491D54AE9AF6C472F9103AE4 /* MQTTSSLSecurityPolicy.m in Sources */, + 1C193D13BCAED104E80F89EF4E6A12E9 /* MQTTSSLSecurityPolicyDecoder.m in Sources */, + 856763AEC3EC638699D115B720858AEC /* MQTTSSLSecurityPolicyEncoder.m in Sources */, + B62DD8B5EF896477990ACA23B9059129 /* MQTTSSLSecurityPolicyTransport.m in Sources */, + 742ED567BD90CBF93204FF544D441AE9 /* MQTTStrict.m in Sources */, + 51456917CA00927A33DFF6E15AF996E2 /* MQTTTransport.m in Sources */, + F62244197805FC4A02CC8274025D2C62 /* ReconnectTimer.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 17AFAF6E07B2FED48006F578DADEA4F4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = MQTTClient; + target = 18D5937A1FF4E1064BDE592E5E9532EA /* MQTTClient */; + targetProxy = 1C0975133E95072CB3C59C09E882A5D1 /* PBXContainerItemProxy */; + }; + 800FC72E4CC5FC2A95D1F4200070EA58 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-rnmqttexample"; + target = 841F5F0F6099124C245D0CBBDD125964 /* Pods-rnmqttexample */; + targetProxy = 6E5BF9D8FB153098BBA945852510F471 /* PBXContainerItemProxy */; + }; + E6C1491AB0EF90DDE4B5C18499787AF2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-rnmqttexample"; + target = 841F5F0F6099124C245D0CBBDD125964 /* Pods-rnmqttexample */; + targetProxy = 9132ED34A2F95F8F3E476076AD54F7D3 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0E8661D4B0E863302ED62B12DF3DD97B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CAA764A178A18893D14F8E24C3738AE1 /* Pods-rnmqttexampleTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 17979295F8C716CEE7C170FE8B2F24AB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7C10F90718899605516C654EC7963B5E /* Pods-rnmqttexampleTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 2C6393DE7FAFA3BE7FEC26D9C861EADF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B967A79A726F79F46B06582729D7CC92 /* MQTTClient.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MQTTClient/MQTTClient-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MQTTClient/MQTTClient-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MQTTClient/MQTTClient.modulemap"; + PRODUCT_MODULE_NAME = MQTTClient; + PRODUCT_NAME = MQTTClient; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 31EB0B11E4F743543EADF3FA903F765B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B967A79A726F79F46B06582729D7CC92 /* MQTTClient.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/MQTTClient/MQTTClient-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/MQTTClient/MQTTClient-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/MQTTClient/MQTTClient.modulemap"; + PRODUCT_MODULE_NAME = MQTTClient; + PRODUCT_NAME = MQTTClient; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 52B5D7F56F6A7F9B16F581C5E717EAEB /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBFED176CAB6A34BC0F6D2514E26A8AD /* Pods-rnmqttexample-tvOSTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 896DE537BA8E4DD69EFB7B0F8891C162 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F2F9487DBB3DD01A8D4E22359CF7A29F /* Pods-rnmqttexample.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 8F17DC3A99F99FBAD606CE6963886315 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 916E0404255105F480DC4950B7625F7A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + ADF049DA8E7232804BC204CF74E3342E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = DFDCC2B28B369A1B060E0B1DAEF29B95 /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CFC7C73EE9A335E9934279AFBC850F52 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 73D196833D5A521CB74C86E07E2DC7E4 /* Pods-rnmqttexample.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 916E0404255105F480DC4950B7625F7A /* Debug */, + 8F17DC3A99F99FBAD606CE6963886315 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4E1AC34BECFA53F94BDD1AE99209BEC2 /* Build configuration list for PBXNativeTarget "MQTTClient" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2C6393DE7FAFA3BE7FEC26D9C861EADF /* Debug */, + 31EB0B11E4F743543EADF3FA903F765B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5E1467541356101DEE7542246EA7F406 /* Build configuration list for PBXNativeTarget "Pods-rnmqttexampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 17979295F8C716CEE7C170FE8B2F24AB /* Debug */, + 0E8661D4B0E863302ED62B12DF3DD97B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6B6590633E85ACF48783DCCC725E330F /* Build configuration list for PBXNativeTarget "Pods-rnmqttexample-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ADF049DA8E7232804BC204CF74E3342E /* Debug */, + 52B5D7F56F6A7F9B16F581C5E717EAEB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AADB7B158281F56E88D3B55B80AF63E3 /* Build configuration list for PBXNativeTarget "Pods-rnmqttexample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 896DE537BA8E4DD69EFB7B0F8891C162 /* Debug */, + CFC7C73EE9A335E9934279AFBC850F52 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-Info.plist b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-Info.plist new file mode 100644 index 0000000..677eb78 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.15.2 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m new file mode 100644 index 0000000..2e28530 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_MQTTClient : NSObject +@end +@implementation PodsDummy_MQTTClient +@end diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-umbrella.h b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-umbrella.h new file mode 100644 index 0000000..58982ec --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient-umbrella.h @@ -0,0 +1,40 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "MQTTSessionManager.h" +#import "ReconnectTimer.h" +#import "ForegroundReconnection.h" +#import "MQTTCFSocketDecoder.h" +#import "MQTTCFSocketEncoder.h" +#import "MQTTCFSocketTransport.h" +#import "MQTTCoreDataPersistence.h" +#import "MQTTDecoder.h" +#import "MQTTInMemoryPersistence.h" +#import "MQTTLog.h" +#import "MQTTStrict.h" +#import "MQTTClient.h" +#import "MQTTMessage.h" +#import "MQTTPersistence.h" +#import "MQTTSSLSecurityPolicy.h" +#import "MQTTSSLSecurityPolicyDecoder.h" +#import "MQTTSSLSecurityPolicyEncoder.h" +#import "MQTTSSLSecurityPolicyTransport.h" +#import "MQTTProperties.h" +#import "MQTTSession.h" +#import "MQTTSessionLegacy.h" +#import "MQTTSessionSynchron.h" +#import "MQTTTransport.h" +#import "GCDTimer.h" + +FOUNDATION_EXPORT double MQTTClientVersionNumber; +FOUNDATION_EXPORT const unsigned char MQTTClientVersionString[]; + diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.modulemap b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.modulemap new file mode 100644 index 0000000..9ddf33c --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.modulemap @@ -0,0 +1,6 @@ +framework module MQTTClient { + umbrella header "MQTTClient-umbrella.h" + + export * + module * { export * } +} diff --git a/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig new file mode 100644 index 0000000..1b7ef03 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/MQTTClient/MQTTClient.xcconfig @@ -0,0 +1,8 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/MQTTClient +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.markdown b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-dummy.m b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-dummy.m new file mode 100644 index 0000000..ecffffa --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_rnmqttexample_tvOSTests : NSObject +@end +@implementation PodsDummy_Pods_rnmqttexample_tvOSTests +@end diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-umbrella.h b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-umbrella.h new file mode 100644 index 0000000..5edeae6 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_rnmqttexample_tvOSTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_rnmqttexample_tvOSTestsVersionString[]; + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.debug.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.debug.xcconfig new file mode 100644 index 0000000..c8dc080 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap new file mode 100644 index 0000000..56ad66c --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_rnmqttexample_tvOSTests { + umbrella header "Pods-rnmqttexample-tvOSTests-umbrella.h" + + export * + module * { export * } +} diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.release.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.release.xcconfig new file mode 100644 index 0000000..c8dc080 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.markdown b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.markdown new file mode 100644 index 0000000..add9ba3 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.markdown @@ -0,0 +1,237 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## MQTTClient + +Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + +Copyright (c) 2013-2015 Christoph Krey + +Based on + +https://github.com/m2mIO/mqttIO-objC + +Copyright © 2011, 2013 2lemetry, LLC + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that +the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +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. + +THIS 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. + + + +Generated by CocoaPods - https://cocoapods.org diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.plist new file mode 100644 index 0000000..b9a5321 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-acknowledgements.plist @@ -0,0 +1,269 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Eclipse Public License - v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC +LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM +CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under this Agreement, and +b) in the case of each subsequent Contributor: + i) changes to the Program, and + ii) additions to the Program; + + where such changes and/or additions to the Program originate from and are + distributed by that particular Contributor. A Contribution 'originates' + from a Contributor if it was added to the Program by such Contributor + itself or anyone acting on such Contributor's behalf. Contributions do not + include additions to the Program which: (i) are separate modules of + software distributed in conjunction with the Program under their own + license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents" mean patent claims licensable by a Contributor which are +necessarily infringed by the use or sale of its Contribution alone or when +combined with the Program. + +"Program" means the Contributions distributed in accordance with this +Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, +including all Contributors. + +2. GRANT OF RIGHTS + a) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free copyright license to + reproduce, prepare derivative works of, publicly display, publicly + perform, distribute and sublicense the Contribution of such Contributor, + if any, and such derivative works, in source code and object code form. + b) Subject to the terms of this Agreement, each Contributor hereby grants + Recipient a non-exclusive, worldwide, royalty-free patent license under + Licensed Patents to make, use, sell, offer to sell, import and otherwise + transfer the Contribution of such Contributor, if any, in source code and + object code form. This patent license shall apply to the combination of + the Contribution and the Program if, at the time the Contribution is + added by the Contributor, such addition of the Contribution causes such + combination to be covered by the Licensed Patents. The patent license + shall not apply to any other combinations which include the Contribution. + No hardware per se is licensed hereunder. + c) Recipient understands that although each Contributor grants the licenses + to its Contributions set forth herein, no assurances are provided by any + Contributor that the Program does not infringe the patent or other + intellectual property rights of any other entity. Each Contributor + disclaims any liability to Recipient for claims brought by any other + entity based on infringement of intellectual property rights or + otherwise. As a condition to exercising the rights and licenses granted + hereunder, each Recipient hereby assumes sole responsibility to secure + any other intellectual property rights needed, if any. For example, if a + third party patent license is required to allow Recipient to distribute + the Program, it is Recipient's responsibility to acquire that license + before distributing the Program. + d) Each Contributor represents that to its knowledge it has sufficient + copyright rights in its Contribution, if any, to grant the copyright + license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under +its own license agreement, provided that: + + a) it complies with the terms and conditions of this Agreement; and + b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties + and conditions, express and implied, including warranties or + conditions of title and non-infringement, and implied warranties or + conditions of merchantability and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for + damages, including direct, indirect, special, incidental and + consequential damages, such as lost profits; + iii) states that any provisions which differ from this Agreement are + offered by that Contributor alone and not by any other party; and + iv) states that source code for the Program is available from such + Contributor, and informs licensees how to obtain it in a reasonable + manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + + a) it must be made available under this Agreement; and + b) a copy of this Agreement must be included with each copy of the Program. + Contributors may not remove or alter any copyright notices contained + within the Program. + +Each Contributor must identify itself as the originator of its Contribution, +if +any, in a manner that reasonably allows subsequent Recipients to identify the +originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with +respect to end users, business partners and the like. While this license is +intended to facilitate the commercial use of the Program, the Contributor who +includes the Program in a commercial product offering should do so in a manner +which does not create potential liability for other Contributors. Therefore, +if a Contributor includes the Program in a commercial product offering, such +Contributor ("Commercial Contributor") hereby agrees to defend and indemnify +every other Contributor ("Indemnified Contributor") against any losses, +damages and costs (collectively "Losses") arising from claims, lawsuits and +other legal actions brought by a third party against the Indemnified +Contributor to the extent caused by the acts or omissions of such Commercial +Contributor in connection with its distribution of the Program in a commercial +product offering. The obligations in this section do not apply to any claims +or Losses relating to any actual or alleged intellectual property +infringement. In order to qualify, an Indemnified Contributor must: +a) promptly notify the Commercial Contributor in writing of such claim, and +b) allow the Commercial Contributor to control, and cooperate with the +Commercial Contributor in, the defense and any related settlement +negotiations. The Indemnified Contributor may participate in any such claim at +its own expense. + +For example, a Contributor might include the Program in a commercial product +offering, Product X. That Contributor is then a Commercial Contributor. If +that Commercial Contributor then makes performance claims, or offers +warranties related to Product X, those performance claims and warranties are +such Commercial Contributor's responsibility alone. Under this section, the +Commercial Contributor would have to defend claims against the other +Contributors related to those performance claims and warranties, and if a +court requires any other Contributor to pay any damages as a result, the +Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, +NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each +Recipient is solely responsible for determining the appropriateness of using +and distributing the Program and assumes all risks associated with its +exercise of rights under this Agreement , including but not limited to the +risks and costs of program errors, compliance with applicable laws, damage to +or loss of data, programs or equipment, and unavailability or interruption of +operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY +CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of the +remainder of the terms of this Agreement, and without further action by the +parties hereto, such provision shall be reformed to the minimum extent +necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Program itself +(excluding combinations of the Program with other software or hardware) +infringes such Recipient's patent(s), then such Recipient's rights granted +under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to +comply with any of the material terms or conditions of this Agreement and does +not cure such failure in a reasonable period of time after becoming aware of +such noncompliance. If all Recipient's rights under this Agreement terminate, +Recipient agrees to cease use and distribution of the Program as soon as +reasonably practicable. However, Recipient's obligations under this Agreement +and any licenses granted by Recipient relating to the Program shall continue +and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in +order to avoid inconsistency the Agreement is copyrighted and may only be +modified in the following manner. The Agreement Steward reserves the right to +publish new versions (including revisions) of this Agreement from time to +time. No one other than the Agreement Steward has the right to modify this +Agreement. The Eclipse Foundation is the initial Agreement Steward. The +Eclipse Foundation may assign the responsibility to serve as the Agreement +Steward to a suitable separate entity. Each new version of the Agreement will +be given a distinguishing version number. The Program (including +Contributions) may always be distributed subject to the version of the +Agreement under which it was received. In addition, after a new version of the +Agreement is published, Contributor may elect to distribute the Program +(including its Contributions) under the new version. Except as expressly +stated in Sections 2(a) and 2(b) above, Recipient receives no rights or +licenses to the intellectual property of any Contributor under this Agreement, +whether expressly, by implication, estoppel or otherwise. All rights in the +Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the +intellectual property laws of the United States of America. No party to this +Agreement will bring a legal action under this Agreement more than one year +after the cause of action arose. Each party waives its rights to a jury trial in +any resulting litigation. + +Copyright (c) 2013-2015 Christoph Krey <krey.christoph@gmail.com> + +Based on + +https://github.com/m2mIO/mqttIO-objC + +Copyright © 2011, 2013 2lemetry, LLC + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that +the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +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. + +THIS 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. + + + + License + EPLv1 + Title + MQTTClient + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-dummy.m b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-dummy.m new file mode 100644 index 0000000..bb32d3d --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_rnmqttexample : NSObject +@end +@implementation PodsDummy_Pods_rnmqttexample +@end diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh new file mode 100755 index 0000000..0af28a7 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh @@ -0,0 +1,171 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + if [ -r "$source" ]; then + # Copy the dSYM into a the targets temp dir. + 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}\"" + 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}" + + local basename + basename="$(basename -s .framework.dSYM "$source")" + binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + 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}\"" + 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}" + else + # 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. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MQTTClient/MQTTClient.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/MQTTClient/MQTTClient.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-umbrella.h b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-umbrella.h new file mode 100644 index 0000000..926aecb --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_rnmqttexampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_rnmqttexampleVersionString[]; + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.debug.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.debug.xcconfig new file mode 100644 index 0000000..40df4b0 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap new file mode 100644 index 0000000..658194e --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.modulemap @@ -0,0 +1,6 @@ +framework module Pods_rnmqttexample { + umbrella header "Pods-rnmqttexample-umbrella.h" + + export * + module * { export * } +} diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.release.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.release.xcconfig new file mode 100644 index 0000000..40df4b0 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.markdown b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.markdown new file mode 100644 index 0000000..102af75 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.markdown @@ -0,0 +1,3 @@ +# Acknowledgements +This application makes use of the following third party libraries: +Generated by CocoaPods - https://cocoapods.org diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.plist b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.plist new file mode 100644 index 0000000..7acbad1 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-acknowledgements.plist @@ -0,0 +1,29 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-dummy.m b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-dummy.m new file mode 100644 index 0000000..2e714db --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_rnmqttexampleTests : NSObject +@end +@implementation PodsDummy_Pods_rnmqttexampleTests +@end diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-umbrella.h b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-umbrella.h new file mode 100644 index 0000000..8bb1310 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_rnmqttexampleTestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_rnmqttexampleTestsVersionString[]; + diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.debug.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.debug.xcconfig new file mode 100644 index 0000000..c8dc080 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.debug.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap new file mode 100644 index 0000000..475000e --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_rnmqttexampleTests { + umbrella header "Pods-rnmqttexampleTests-umbrella.h" + + export * + module * { export * } +} diff --git a/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.release.xcconfig b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.release.xcconfig new file mode 100644 index 0000000..c8dc080 --- /dev/null +++ b/rnmqttexample/ios/Pods/Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.release.xcconfig @@ -0,0 +1,8 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/MQTTClient/MQTTClient.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "MQTTClient" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/rnmqttexample/ios/rnmqttexample-tvOS/Info.plist b/rnmqttexample/ios/rnmqttexample-tvOS/Info.plist new file mode 100644 index 0000000..2fb6a11 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample-tvOS/Info.plist @@ -0,0 +1,54 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample-tvOSTests/Info.plist b/rnmqttexample/ios/rnmqttexample-tvOSTests/Info.plist new file mode 100644 index 0000000..886825c --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample-tvOSTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/rnmqttexample/ios/rnmqttexample.xcodeproj/project.pbxproj b/rnmqttexample/ios/rnmqttexample.xcodeproj/project.pbxproj new file mode 100644 index 0000000..01f222e --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample.xcodeproj/project.pbxproj @@ -0,0 +1,1726 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* rnmqttexampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rnmqttexampleTests.m */; }; + 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */; }; + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */; }; + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */; }; + 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2D16E6891FA4F8E400B85C8A /* libReact.a */; }; + 2DCD954D1E0B4F2C00145EB5 /* rnmqttexampleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rnmqttexampleTests.m */; }; + 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3EA31DF850E9000B6D8A /* libReact.a */; }; + 3C9183882DF4462FAAD3E8C3 /* Pods_rnmqttexample_tvOSTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 166D51168D9E0344F2643EE5 /* Pods_rnmqttexample_tvOSTests.framework */; }; + 3FB5C3FCA164629B6961006C /* Pods_rnmqttexampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5BC22B3D925C95FD6EC7691 /* Pods_rnmqttexampleTests.framework */; }; + 71B1A4FC84F45199C16CDCB8 /* Pods_rnmqttexample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 431EFEF468BE6C61D1D30197 /* Pods_rnmqttexample.framework */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */; }; + DAA30CA158CE42D8AED03A57 /* libRCTMqtt.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BDF4EABCA9494378A86E76D9 /* libRCTMqtt.a */; }; + ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED297162215061F000B7C4FE /* JavaScriptCore.framework */; }; + ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED2971642150620600B7C4FE /* JavaScriptCore.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTActionSheet; + }; + 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTGeolocation; + }; + 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5115D1A9E6B3D00147676; + remoteInfo = RCTImage; + }; + 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B511DB1A9E6C8500147676; + remoteInfo = RCTNetwork; + }; + 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; + remoteInfo = RCTVibration; + }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = rnmqttexample; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; + 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; + remoteInfo = React; + }; + 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2D02E47A1E0B4A5D006451C7; + remoteInfo = "rnmqttexample-tvOS"; + }; + 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ADD01A681E09402E00F6D226; + remoteInfo = "RCTBlob-tvOS"; + }; + 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D001F3B181A0099AA32; + remoteInfo = fishhook; + }; + 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3DBE0D0D1F3B181C0099AA32; + remoteInfo = "fishhook-tvOS"; + }; + 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EBF21BDC1FC498900052F4D5; + remoteInfo = jsinspector; + }; + 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EBF21BFA1FC4989A0052F4D5; + remoteInfo = "jsinspector-tvOS"; + }; + 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D7ECE1E25DB7D00323FB7; + remoteInfo = "third-party"; + }; + 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D383D3C1EBD27B6005632C8; + remoteInfo = "third-party-tvOS"; + }; + 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 139D7E881E25C6D100323FB7; + remoteInfo = "double-conversion"; + }; + 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D383D621EBD27B9005632C8; + remoteInfo = "double-conversion-tvOS"; + }; + 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; + remoteInfo = "RCTImage-tvOS"; + }; + 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28471D9B043800D4039D; + remoteInfo = "RCTLinking-tvOS"; + }; + 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28541D9B044C00D4039D; + remoteInfo = "RCTNetwork-tvOS"; + }; + 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28611D9B046600D4039D; + remoteInfo = "RCTSettings-tvOS"; + }; + 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A287B1D9B048500D4039D; + remoteInfo = "RCTText-tvOS"; + }; + 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28881D9B049200D4039D; + remoteInfo = "RCTWebSocket-tvOS"; + }; + 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28131D9B038B00D4039D; + remoteInfo = "React-tvOS"; + }; + 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C059A1DE3340900C268FA; + remoteInfo = yoga; + }; + 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3C06751DE3340C00C268FA; + remoteInfo = "yoga-tvOS"; + }; + 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; + remoteInfo = cxxreact; + }; + 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; + remoteInfo = "cxxreact-tvOS"; + }; + 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTAnimation; + }; + 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 2D2A28201D9B03D100D4039D; + remoteInfo = "RCTAnimation-tvOS"; + }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; + 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 58B5119B1A9E6C1200147676; + remoteInfo = RCTText; + }; + ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 358F4ED71D1E81A9004DF814; + remoteInfo = RCTBlob; + }; + D3C6A1D122B15C6200CADFE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EDEBC6D6214B3E7000DD5AC8; + remoteInfo = jsi; + }; + D3C6A1D322B15C6200CADFE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = EDEBC73B214B45A300DD5AC8; + remoteInfo = jsiexecutor; + }; + D3C6A1D522B15C6200CADFE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ED296FB6214C9A0900B7C4FE; + remoteInfo = "jsi-tvOS"; + }; + D3C6A1D722B15C6200CADFE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = ED296FEE214C9CF800B7C4FE; + remoteInfo = "jsiexecutor-tvOS"; + }; + D3C6A1DC22B15C6200CADFE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 91DCA8345F70452889AC9CAE /* RCTMqtt.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = FF7A9D401C64785B006743BA; + remoteInfo = RCTMqtt; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* rnmqttexampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rnmqttexampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* rnmqttexampleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = rnmqttexampleTests.m; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* rnmqttexample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rnmqttexample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = rnmqttexample/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = rnmqttexample/AppDelegate.m; sourceTree = ""; }; + 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = rnmqttexample/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = rnmqttexample/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = rnmqttexample/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 166D51168D9E0344F2643EE5 /* Pods_rnmqttexample_tvOSTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_rnmqttexample_tvOSTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D02E47B1E0B4A5D006451C7 /* rnmqttexample-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "rnmqttexample-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D02E4901E0B4A5D006451C7 /* rnmqttexample-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "rnmqttexample-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 2D16E6891FA4F8E400B85C8A /* libReact.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libReact.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 431EFEF468BE6C61D1D30197 /* Pods_rnmqttexample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_rnmqttexample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 48B43C88B65B24989F736D6D /* Pods-rnmqttexample-tvOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexample-tvOSTests.release.xcconfig"; path = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.release.xcconfig"; sourceTree = ""; }; + 59202B74FB1635C763976CC2 /* Pods-rnmqttexample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexample.debug.xcconfig"; path = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.debug.xcconfig"; sourceTree = ""; }; + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + 8CD1048D378AF54EE541D513 /* Pods-rnmqttexample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexample.release.xcconfig"; path = "Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample.release.xcconfig"; sourceTree = ""; }; + 91DCA8345F70452889AC9CAE /* RCTMqtt.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RCTMqtt.xcodeproj; path = "../node_modules/sp-react-native-mqtt/ios/RCTMqtt.xcodeproj"; sourceTree = ""; }; + A2399D3022306A314FE6B203 /* Pods-rnmqttexampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexampleTests.debug.xcconfig"; path = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.debug.xcconfig"; sourceTree = ""; }; + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTBlob.xcodeproj; path = "../node_modules/react-native/Libraries/Blob/RCTBlob.xcodeproj"; sourceTree = ""; }; + B5BC22B3D925C95FD6EC7691 /* Pods_rnmqttexampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_rnmqttexampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BDF4EABCA9494378A86E76D9 /* libRCTMqtt.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRCTMqtt.a; sourceTree = ""; }; + CE41429546471FEA8AEC7911 /* Pods-rnmqttexampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexampleTests.release.xcconfig"; path = "Target Support Files/Pods-rnmqttexampleTests/Pods-rnmqttexampleTests.release.xcconfig"; sourceTree = ""; }; + E53E1485E78AE6757E44D74B /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-rnmqttexample-tvOSTests.debug.xcconfig"; path = "Target Support Files/Pods-rnmqttexample-tvOSTests/Pods-rnmqttexample-tvOSTests.debug.xcconfig"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, + 3FB5C3FCA164629B6961006C /* Pods_rnmqttexampleTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ED297163215061F000B7C4FE /* JavaScriptCore.framework in Frameworks */, + ADBDB9381DFEBF1600ED6528 /* libRCTBlob.a in Frameworks */, + 11D1A2F320CAFA9E000508D9 /* libRCTAnimation.a in Frameworks */, + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + DAA30CA158CE42D8AED03A57 /* libRCTMqtt.a in Frameworks */, + 71B1A4FC84F45199C16CDCB8 /* Pods_rnmqttexample.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4781E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ED2971652150620600B7C4FE /* JavaScriptCore.framework in Frameworks */, + 2D16E6881FA4F8E400B85C8A /* libReact.a in Frameworks */, + 2D02E4C21E0B4AEC006451C7 /* libRCTAnimation.a in Frameworks */, + 2D02E4C31E0B4AEC006451C7 /* libRCTImage-tvOS.a in Frameworks */, + 2D02E4C41E0B4AEC006451C7 /* libRCTLinking-tvOS.a in Frameworks */, + 2D02E4C51E0B4AEC006451C7 /* libRCTNetwork-tvOS.a in Frameworks */, + 2D02E4C61E0B4AEC006451C7 /* libRCTSettings-tvOS.a in Frameworks */, + 2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */, + 2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48D1E0B4A5D006451C7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2DF0FFEE2056DD460020B375 /* libReact.a in Frameworks */, + 3C9183882DF4462FAAD3E8C3 /* Pods_rnmqttexample_tvOSTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302B61ABCB90400DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302BC1ABCB91800DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302D41ABCB9D200DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 00C302E01ABCB9EE00DB3ED1 /* Products */ = { + isa = PBXGroup; + children = ( + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, + ); + name = Products; + sourceTree = ""; + }; + 00E356EF1AD99517003FC87E /* rnmqttexampleTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* rnmqttexampleTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = rnmqttexampleTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */, + 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */, + 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* rnmqttexample */ = { + isa = PBXGroup; + children = ( + 008F07F21AC5B25A0029DE68 /* main.jsbundle */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.m */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 13B07FB71A68108700A75B9A /* main.m */, + ); + name = rnmqttexample; + sourceTree = ""; + }; + 146834001AC3E56700842450 /* Products */ = { + isa = PBXGroup; + children = ( + 146834041AC3E56700842450 /* libReact.a */, + 3DAD3EA31DF850E9000B6D8A /* libReact.a */, + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, + 2DF0FFDF2056DD460020B375 /* libjsinspector.a */, + 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */, + 2DF0FFE32056DD460020B375 /* libthird-party.a */, + 2DF0FFE52056DD460020B375 /* libthird-party.a */, + 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */, + 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */, + D3C6A1D222B15C6200CADFE5 /* libjsi.a */, + D3C6A1D422B15C6200CADFE5 /* libjsiexecutor.a */, + D3C6A1D622B15C6200CADFE5 /* libjsi-tvOS.a */, + D3C6A1D822B15C6200CADFE5 /* libjsiexecutor-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + ED2971642150620600B7C4FE /* JavaScriptCore.framework */, + 2D16E6891FA4F8E400B85C8A /* libReact.a */, + 431EFEF468BE6C61D1D30197 /* Pods_rnmqttexample.framework */, + 166D51168D9E0344F2643EE5 /* Pods_rnmqttexample_tvOSTests.framework */, + B5BC22B3D925C95FD6EC7691 /* Pods_rnmqttexampleTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 5E91572E1DD0AC6500FF2AA8 /* Products */ = { + isa = PBXGroup; + children = ( + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */, + ); + name = Products; + sourceTree = ""; + }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, + 146833FF1AC3E56700842450 /* React.xcodeproj */, + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, + ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */, + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, + 91DCA8345F70452889AC9CAE /* RCTMqtt.xcodeproj */, + ); + name = Libraries; + sourceTree = ""; + }; + 832341B11AAA6A8300B99B32 /* Products */ = { + isa = PBXGroup; + children = ( + 832341B51AAA6A8300B99B32 /* libRCTText.a */, + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* rnmqttexample */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* rnmqttexampleTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + D3C6A1AB22B15C6100CADFE5 /* Recovered References */, + E08814B3079AD63EB441BF1F /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* rnmqttexample.app */, + 00E356EE1AD99517003FC87E /* rnmqttexampleTests.xctest */, + 2D02E47B1E0B4A5D006451C7 /* rnmqttexample-tvOS.app */, + 2D02E4901E0B4A5D006451C7 /* rnmqttexample-tvOSTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + ADBDB9201DFEBF0600ED6528 /* Products */ = { + isa = PBXGroup; + children = ( + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */, + 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */, + ); + name = Products; + sourceTree = ""; + }; + D3C6A1AB22B15C6100CADFE5 /* Recovered References */ = { + isa = PBXGroup; + children = ( + BDF4EABCA9494378A86E76D9 /* libRCTMqtt.a */, + ); + name = "Recovered References"; + sourceTree = ""; + }; + D3C6A1D922B15C6200CADFE5 /* Products */ = { + isa = PBXGroup; + children = ( + D3C6A1DD22B15C6200CADFE5 /* libRCTMqtt.a */, + ); + name = Products; + sourceTree = ""; + }; + E08814B3079AD63EB441BF1F /* Pods */ = { + isa = PBXGroup; + children = ( + 59202B74FB1635C763976CC2 /* Pods-rnmqttexample.debug.xcconfig */, + 8CD1048D378AF54EE541D513 /* Pods-rnmqttexample.release.xcconfig */, + E53E1485E78AE6757E44D74B /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */, + 48B43C88B65B24989F736D6D /* Pods-rnmqttexample-tvOSTests.release.xcconfig */, + A2399D3022306A314FE6B203 /* Pods-rnmqttexampleTests.debug.xcconfig */, + CE41429546471FEA8AEC7911 /* Pods-rnmqttexampleTests.release.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* rnmqttexampleTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rnmqttexampleTests" */; + buildPhases = ( + 37D0A1885BEAA1C1123F5B88 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = rnmqttexampleTests; + productName = rnmqttexampleTests; + productReference = 00E356EE1AD99517003FC87E /* rnmqttexampleTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* rnmqttexample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rnmqttexample" */; + buildPhases = ( + 6E7B7DE1AE5C694B4CBFEA9D /* [CP] Check Pods Manifest.lock */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 554E9701F7BE8B4F7B8F38E2 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = rnmqttexample; + productName = "Hello World"; + productReference = 13B07F961A680F5B00A75B9A /* rnmqttexample.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E47A1E0B4A5D006451C7 /* rnmqttexample-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "rnmqttexample-tvOS" */; + buildPhases = ( + 2D02E4771E0B4A5D006451C7 /* Sources */, + 2D02E4781E0B4A5D006451C7 /* Frameworks */, + 2D02E4791E0B4A5D006451C7 /* Resources */, + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "rnmqttexample-tvOS"; + productName = "rnmqttexample-tvOS"; + productReference = 2D02E47B1E0B4A5D006451C7 /* rnmqttexample-tvOS.app */; + productType = "com.apple.product-type.application"; + }; + 2D02E48F1E0B4A5D006451C7 /* rnmqttexample-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "rnmqttexample-tvOSTests" */; + buildPhases = ( + 5839CC63532DC9F70A3FF066 /* [CP] Check Pods Manifest.lock */, + 2D02E48C1E0B4A5D006451C7 /* Sources */, + 2D02E48D1E0B4A5D006451C7 /* Frameworks */, + 2D02E48E1E0B4A5D006451C7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */, + ); + name = "rnmqttexample-tvOSTests"; + productName = "rnmqttexample-tvOSTests"; + productReference = 2D02E4901E0B4A5D006451C7 /* rnmqttexample-tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 940; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 2D02E47A1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + }; + 2D02E48F1E0B4A5D006451C7 = { + CreatedOnToolsVersion = 8.2.1; + ProvisioningStyle = Automatic; + TestTargetID = 2D02E47A1E0B4A5D006451C7; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rnmqttexample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; + ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; + }, + { + ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; + ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; + }, + { + ProductGroup = ADBDB9201DFEBF0600ED6528 /* Products */; + ProjectRef = ADBDB91F1DFEBF0600ED6528 /* RCTBlob.xcodeproj */; + }, + { + ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; + ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; + }, + { + ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; + ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; + }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, + { + ProductGroup = D3C6A1D922B15C6200CADFE5 /* Products */; + ProjectRef = 91DCA8345F70452889AC9CAE /* RCTMqtt.xcodeproj */; + }, + { + ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; + ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; + }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, + { + ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; + ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; + }, + { + ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; + ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; + }, + { + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + }, + { + ProductGroup = 146834001AC3E56700842450 /* Products */; + ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* rnmqttexample */, + 00E356ED1AD99517003FC87E /* rnmqttexampleTests */, + 2D02E47A1E0B4A5D006451C7 /* rnmqttexample-tvOS */, + 2D02E48F1E0B4A5D006451C7 /* rnmqttexample-tvOSTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTActionSheet.a; + remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTGeolocation.a; + remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTImage.a; + remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTNetwork.a; + remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTVibration.a; + remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 146834041AC3E56700842450 /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2D16E6721FA4F8DC00B85C8A /* libRCTBlob-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTBlob-tvOS.a"; + remoteRef = 2D16E6711FA4F8DC00B85C8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2D16E6841FA4F8DC00B85C8A /* libfishhook.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libfishhook.a; + remoteRef = 2D16E6831FA4F8DC00B85C8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2D16E6861FA4F8DC00B85C8A /* libfishhook-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libfishhook-tvOS.a"; + remoteRef = 2D16E6851FA4F8DC00B85C8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFDF2056DD460020B375 /* libjsinspector.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsinspector.a; + remoteRef = 2DF0FFDE2056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE12056DD460020B375 /* libjsinspector-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsinspector-tvOS.a"; + remoteRef = 2DF0FFE02056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE32056DD460020B375 /* libthird-party.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libthird-party.a"; + remoteRef = 2DF0FFE22056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE52056DD460020B375 /* libthird-party.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libthird-party.a"; + remoteRef = 2DF0FFE42056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE72056DD460020B375 /* libdouble-conversion.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libdouble-conversion.a"; + remoteRef = 2DF0FFE62056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 2DF0FFE92056DD460020B375 /* libdouble-conversion.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libdouble-conversion.a"; + remoteRef = 2DF0FFE82056DD460020B375 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTImage-tvOS.a"; + remoteRef = 3DAD3E831DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTLinking-tvOS.a"; + remoteRef = 3DAD3E871DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTNetwork-tvOS.a"; + remoteRef = 3DAD3E8B1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E901DF850E9000B6D8A /* libRCTSettings-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTSettings-tvOS.a"; + remoteRef = 3DAD3E8F1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E941DF850E9000B6D8A /* libRCTText-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTText-tvOS.a"; + remoteRef = 3DAD3E931DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3E991DF850E9000B6D8A /* libRCTWebSocket-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libRCTWebSocket-tvOS.a"; + remoteRef = 3DAD3E981DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA31DF850E9000B6D8A /* libReact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libReact.a; + remoteRef = 3DAD3EA21DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libyoga.a; + remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libcxxreact.a; + remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTAnimation.a; + remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTText.a; + remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + ADBDB9271DFEBF0700ED6528 /* libRCTBlob.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTBlob.a; + remoteRef = ADBDB9261DFEBF0700ED6528 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + D3C6A1D222B15C6200CADFE5 /* libjsi.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsi.a; + remoteRef = D3C6A1D122B15C6200CADFE5 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + D3C6A1D422B15C6200CADFE5 /* libjsiexecutor.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libjsiexecutor.a; + remoteRef = D3C6A1D322B15C6200CADFE5 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + D3C6A1D622B15C6200CADFE5 /* libjsi-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsi-tvOS.a"; + remoteRef = D3C6A1D522B15C6200CADFE5 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + D3C6A1D822B15C6200CADFE5 /* libjsiexecutor-tvOS.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libjsiexecutor-tvOS.a"; + remoteRef = D3C6A1D722B15C6200CADFE5 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + D3C6A1DD22B15C6200CADFE5 /* libRCTMqtt.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTMqtt.a; + remoteRef = D3C6A1DC22B15C6200CADFE5 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4791E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BD1E0B4A84006451C7 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48E1E0B4A5D006451C7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + }; + 2D02E4CB1E0B4B27006451C7 /* Bundle React Native Code And Images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native Code And Images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh"; + }; + 37D0A1885BEAA1C1123F5B88 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-rnmqttexampleTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "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"; + showEnvVarsInLog = 0; + }; + 554E9701F7BE8B4F7B8F38E2 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/MQTTClient/MQTTClient.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MQTTClient.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-rnmqttexample/Pods-rnmqttexample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 5839CC63532DC9F70A3FF066 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-rnmqttexample-tvOSTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "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"; + showEnvVarsInLog = 0; + }; + 6E7B7DE1AE5C694B4CBFEA9D /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-rnmqttexample-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "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"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* rnmqttexampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E4771E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2D02E4BF1E0B4AB3006451C7 /* main.m in Sources */, + 2D02E4BC1E0B4A80006451C7 /* AppDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2D02E48C1E0B4A5D006451C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2DCD954D1E0B4F2C00145EB5 /* rnmqttexampleTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* rnmqttexample */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; + 2D02E4921E0B4A5D006451C7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2D02E47A1E0B4A5D006451C7 /* rnmqttexample-tvOS */; + targetProxy = 2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 13B07FB21A68108700A75B9A /* Base */, + ); + name = LaunchScreen.xib; + path = rnmqttexample; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A2399D3022306A314FE6B203 /* Pods-rnmqttexampleTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = rnmqttexampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnmqttexample.app/rnmqttexample"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CE41429546471FEA8AEC7911 /* Pods-rnmqttexampleTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = rnmqttexampleTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnmqttexample.app/rnmqttexample"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 59202B74FB1635C763976CC2 /* Pods-rnmqttexample.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + DEAD_CODE_STRIPPING = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = rnmqttexample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = rnmqttexample; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8CD1048D378AF54EE541D513 /* Pods-rnmqttexample.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = 1; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = rnmqttexample/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = rnmqttexample; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 2D02E4971E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = "rnmqttexample-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.rnmqttexample-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Debug; + }; + 2D02E4981E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image"; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = "rnmqttexample-tvOS/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.rnmqttexample-tvOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.2; + }; + name = Release; + }; + 2D02E4991E0B4A5E006451C7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E53E1485E78AE6757E44D74B /* Pods-rnmqttexample-tvOSTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = "rnmqttexample-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.rnmqttexample-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnmqttexample-tvOS.app/rnmqttexample-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Debug; + }; + 2D02E49A1E0B4A5E006451C7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 48B43C88B65B24989F736D6D /* Pods-rnmqttexample-tvOSTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "$(SRCROOT)/../node_modules/sp-react-native-mqtt/ios", + ); + INFOPLIST_FILE = "rnmqttexample-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/$(TARGET_NAME)\"", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.rnmqttexample-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rnmqttexample-tvOS.app/rnmqttexample-tvOS"; + TVOS_DEPLOYMENT_TARGET = 10.1; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rnmqttexampleTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rnmqttexample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BA1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "rnmqttexample-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4971E0B4A5E006451C7 /* Debug */, + 2D02E4981E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D02E4BB1E0B4A5E006451C7 /* Build configuration list for PBXNativeTarget "rnmqttexample-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D02E4991E0B4A5E006451C7 /* Debug */, + 2D02E49A1E0B4A5E006451C7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rnmqttexample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample-tvOS.xcscheme b/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample-tvOS.xcscheme new file mode 100644 index 0000000..05938fb --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample-tvOS.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample.xcscheme b/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample.xcscheme new file mode 100644 index 0000000..6ae2d0d --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample.xcodeproj/xcshareddata/xcschemes/rnmqttexample.xcscheme @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample.xcworkspace/contents.xcworkspacedata b/rnmqttexample/ios/rnmqttexample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fef6027 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/rnmqttexample/ios/rnmqttexample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/rnmqttexample/ios/rnmqttexample/AppDelegate.h b/rnmqttexample/ios/rnmqttexample/AppDelegate.h new file mode 100644 index 0000000..2726d5e --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/AppDelegate.h @@ -0,0 +1,15 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import +#import + +@interface AppDelegate : UIResponder + +@property (nonatomic, strong) UIWindow *window; + +@end diff --git a/rnmqttexample/ios/rnmqttexample/AppDelegate.m b/rnmqttexample/ios/rnmqttexample/AppDelegate.m new file mode 100644 index 0000000..cee0a5a --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/AppDelegate.m @@ -0,0 +1,42 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "AppDelegate.h" + +#import +#import +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; + RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge + moduleName:@"rnmqttexample" + initialProperties:nil]; + + rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; + + self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; + UIViewController *rootViewController = [UIViewController new]; + rootViewController.view = rootView; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +@end diff --git a/rnmqttexample/ios/rnmqttexample/Base.lproj/LaunchScreen.xib b/rnmqttexample/ios/rnmqttexample/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..2661f7d --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/Base.lproj/LaunchScreen.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample/Images.xcassets/AppIcon.appiconset/Contents.json b/rnmqttexample/ios/rnmqttexample/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/rnmqttexample/ios/rnmqttexample/Images.xcassets/Contents.json b/rnmqttexample/ios/rnmqttexample/Images.xcassets/Contents.json new file mode 100644 index 0000000..2d92bd5 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/rnmqttexample/ios/rnmqttexample/Info.plist b/rnmqttexample/ios/rnmqttexample/Info.plist new file mode 100644 index 0000000..d33c7aa --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/Info.plist @@ -0,0 +1,60 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + rnmqttexample + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + NSExceptionDomains + + localhost + + NSExceptionAllowsInsecureHTTPLoads + + + + + + diff --git a/rnmqttexample/ios/rnmqttexample/main.m b/rnmqttexample/ios/rnmqttexample/main.m new file mode 100644 index 0000000..c316cf8 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexample/main.m @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/rnmqttexample/ios/rnmqttexampleTests/Info.plist b/rnmqttexample/ios/rnmqttexampleTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexampleTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/rnmqttexample/ios/rnmqttexampleTests/rnmqttexampleTests.m b/rnmqttexample/ios/rnmqttexampleTests/rnmqttexampleTests.m new file mode 100644 index 0000000..e48c302 --- /dev/null +++ b/rnmqttexample/ios/rnmqttexampleTests/rnmqttexampleTests.m @@ -0,0 +1,68 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface rnmqttexampleTests : XCTestCase + +@end + +@implementation rnmqttexampleTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + RCTSetLogFunction(RCTDefaultLogFunction); + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/rnmqttexample/metro.config.js b/rnmqttexample/metro.config.js new file mode 100644 index 0000000..13a9642 --- /dev/null +++ b/rnmqttexample/metro.config.js @@ -0,0 +1,17 @@ +/** + * Metro configuration for React Native + * https://github.com/facebook/react-native + * + * @format + */ + +module.exports = { + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: false, + }, + }), + }, +}; diff --git a/rnmqttexample/package-lock.json b/rnmqttexample/package-lock.json new file mode 100644 index 0000000..22dd755 --- /dev/null +++ b/rnmqttexample/package-lock.json @@ -0,0 +1,8376 @@ +{ + "name": "rnmqttexample", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/core": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.5.tgz", + "integrity": "sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.5", + "@babel/types": "^7.4.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "requires": { + "@babel/types": "^7.4.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz", + "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz", + "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz", + "integrity": "sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw==", + "requires": { + "@babel/types": "^7.3.0", + "esutils": "^2.0.0" + } + }, + "@babel/helper-call-delegate": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", + "requires": { + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", + "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4" + } + }, + "@babel/helper-define-map": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", + "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz", + "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", + "requires": { + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz", + "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz", + "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", + "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz", + "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==" + }, + "@babel/helper-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", + "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", + "requires": { + "lodash": "^4.17.11" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz", + "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", + "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz", + "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", + "requires": { + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" + } + }, + "@babel/helpers": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", + "requires": { + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", + "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==" + }, + "@babel/plugin-external-helpers": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz", + "integrity": "sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz", + "integrity": "sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.2.0.tgz", + "integrity": "sha512-NVfNe7F6nsasG1FnvcFxh2FN0l04ZNe75qTOAVOILWPam0tw9a63RtT/Dab8dPjedZa4fTQaQ83yMMywF9OSug==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.2.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz", + "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.2.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", + "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz", + "integrity": "sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.2.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz", + "integrity": "sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", + "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz", + "integrity": "sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", + "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz", + "integrity": "sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz", + "integrity": "sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz", + "integrity": "sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", + "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", + "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", + "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.11" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", + "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", + "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz", + "integrity": "sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", + "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", + "requires": { + "@babel/helper-module-transforms": "^7.4.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" + } + }, + "@babel/plugin-transform-object-assign": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz", + "integrity": "sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", + "requires": { + "@babel/helper-call-delegate": "^7.4.4", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz", + "integrity": "sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz", + "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz", + "integrity": "sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz", + "integrity": "sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==", + "requires": { + "regenerator-transform": "^0.14.0" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz", + "integrity": "sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q==", + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "resolve": "^1.8.1", + "semver": "^5.5.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz", + "integrity": "sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-typescript": "^7.2.0" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" + } + }, + "@babel/register": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.4.4.tgz", + "integrity": "sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA==", + "requires": { + "core-js": "^3.0.0", + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "pirates": "^4.0.0", + "source-map-support": "^0.5.9" + }, + "dependencies": { + "core-js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.1.3.tgz", + "integrity": "sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA==" + } + } + }, + "@babel/runtime": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", + "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==" + } + } + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", + "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.4.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.5", + "@babel/types": "^7.4.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/core": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", + "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.8.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "jest-watcher": "^24.8.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/fake-timers": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", + "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/reporters": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", + "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + } + }, + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", + "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0" + } + }, + "@jest/transform": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", + "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.8.0", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + } + }, + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, + "@react-native-community/cli": { + "version": "1.9.8", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-1.9.8.tgz", + "integrity": "sha512-/qd1fRJzisTjYpfNJ4NGYYM6cWhnTbmTTUPzi3yHTpfWWtyepAl8MLf6RbXaC8menCkg1jGkke6hD4rDoUJK0A==", + "requires": { + "chalk": "^1.1.1", + "commander": "^2.19.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "denodeify": "^1.2.1", + "envinfo": "^5.7.0", + "errorhandler": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "execa": "^1.0.0", + "fs-extra": "^7.0.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.3", + "inquirer": "^3.0.6", + "lodash": "^4.17.5", + "metro": "^0.51.0", + "metro-config": "^0.51.0", + "metro-core": "^0.51.0", + "metro-memory-fs": "^0.51.0", + "metro-react-native-babel-transformer": "^0.51.0", + "mime": "^1.3.4", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "morgan": "^1.9.0", + "node-fetch": "^2.2.0", + "node-notifier": "^5.2.1", + "opn": "^3.0.2", + "plist": "^3.0.0", + "semver": "^5.0.3", + "serve-static": "^1.13.1", + "shell-quote": "1.6.1", + "slash": "^2.0.0", + "ws": "^1.1.0", + "xcode": "^2.0.0", + "xmldoc": "^0.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "@types/babel__core": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", + "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", + "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "dev": true + }, + "absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-globals": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", + "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "art": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/art/-/art-0.10.3.tgz", + "integrity": "sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "requires": { + "lodash": "^4.17.11" + } + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "babel-jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "dev": true, + "requires": { + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", + "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==" + }, + "babel-preset-fbjs": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz", + "integrity": "sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big-integer": { + "version": "1.6.44", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.44.tgz", + "integrity": "sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ==" + }, + "bplist-creator": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.7.tgz", + "integrity": "sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU=", + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "bplist-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", + "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=", + "requires": { + "big-integer": "^1.6.7" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "requires": { + "mime-db": ">= 1.40.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-react-class": { + "version": "15.6.3", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", + "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", + "requires": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", + "dev": true, + "requires": { + "cssom": "0.3.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true + }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", + "dev": true + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "envinfo": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-5.12.1.tgz", + "integrity": "sha512-pwdo0/G3CIkQ0y6PCXq4RdkvId2elvtPCJMG0konqlrfkWQbf1DWeH9K2b/cvu2YgGvPPTOnonZxXM1gikFu1w==" + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "requires": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", + "dev": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-target-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-1.1.1.tgz", + "integrity": "sha1-qG5e5r2qFgVEddp5fM3fDFVphJE=" + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "expect": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "requires": { + "bser": "^2.0.0" + } + }, + "fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "requires": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "fbjs-scripts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", + "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", + "requires": { + "@babel/core": "^7.0.0", + "ansi-colors": "^1.0.1", + "babel-preset-fbjs": "^3.2.0", + "core-js": "^2.4.1", + "cross-spawn": "^5.1.0", + "fancy-log": "^1.3.2", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "semver": "^5.1.0", + "through2": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" + }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==" + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.1.tgz", + "integrity": "sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", + "dev": true, + "requires": { + "import-local": "^2.0.0", + "jest-cli": "^24.8.0" + }, + "dependencies": { + "jest-cli": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "dev": true, + "requires": { + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + } + } + }, + "jest-changed-files": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + } + }, + "jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" + } + }, + "jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + } + }, + "jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", + "dev": true, + "requires": { + "detect-newline": "^2.1.0" + } + }, + "jest-each": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" + } + }, + "jest-environment-jsdom": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", + "jsdom": "^11.5.1" + } + }, + "jest-environment-node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" + } + }, + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true + }, + "jest-haste-map": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", + "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-jasmine2": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", + "dev": true, + "requires": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", + "throat": "^4.0.0" + } + }, + "jest-leak-detector": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", + "dev": true, + "requires": { + "pretty-format": "^24.8.0" + } + }, + "jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" + } + }, + "jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true + }, + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", + "dev": true + }, + "jest-resolve": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" + } + }, + "jest-resolve-dependencies": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" + } + }, + "jest-runner": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + } + }, + "jest-runtime": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" + } + }, + "jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==" + }, + "jest-snapshot": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.8.0", + "semver": "^5.5.0" + } + }, + "jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.0.0" + } + }, + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" + }, + "lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "requires": { + "tmpl": "1.0.x" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "requires": { + "readable-stream": "^2.0.1" + } + }, + "metro": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.51.1.tgz", + "integrity": "sha512-nM0dqn8LQlMjhChl2fzTUq2EWiUebZM7nkesD9vQe47W10bj/tbRLPiIIAxht6SRDbPd/hRA+t39PxLhPSKEKg==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/plugin-external-helpers": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "async": "^2.4.0", + "babel-preset-fbjs": "^3.0.1", + "buffer-crc32": "^0.2.13", + "chalk": "^2.4.1", + "concat-stream": "^1.6.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "eventemitter3": "^3.0.0", + "fbjs": "^1.0.0", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "24.0.0-alpha.6", + "jest-worker": "24.0.0-alpha.6", + "json-stable-stringify": "^1.0.1", + "lodash.throttle": "^4.1.1", + "merge-stream": "^1.0.1", + "metro-babel-transformer": "0.51.1", + "metro-cache": "0.51.1", + "metro-config": "0.51.1", + "metro-core": "0.51.1", + "metro-minify-uglify": "0.51.1", + "metro-react-native-babel-preset": "0.51.1", + "metro-resolver": "0.51.1", + "metro-source-map": "0.51.1", + "mime-types": "2.1.11", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.0", + "react-transform-hmr": "^1.0.4", + "resolve": "^1.5.0", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "temp": "0.8.3", + "throat": "^4.1.0", + "wordwrap": "^1.0.0", + "write-file-atomic": "^1.2.0", + "ws": "^1.1.5", + "xpipe": "^1.0.5", + "yargs": "^9.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "requires": { + "rsvp": "^3.3.3" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jest-haste-map": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.0.0-alpha.6.tgz", + "integrity": "sha512-+NO2HMbjvrG8BC39ieLukdpFrcPhhjCJGhpbHodHNZygH1Tt06WrlNYGpZtWKx/zpf533tCtMQXO/q59JenjNw==", + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-serializer": "^24.0.0-alpha.6", + "jest-worker": "^24.0.0-alpha.6", + "micromatch": "^2.3.11", + "sane": "^3.0.0" + } + }, + "jest-worker": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.0.0-alpha.6.tgz", + "integrity": "sha512-iXtH7MR9bjWlNnlnRBcrBRrb4cSVxML96La5vsnmBvDI+mJnkP5uEt6Fgpo5Y8f3z9y2Rd7wuPnKRxqQsiU/dA==", + "requires": { + "merge-stream": "^1.0.1" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "metro-babel7-plugin-react-transform": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.1.tgz", + "integrity": "sha512-wzn4X9KgmAMZ7Bi6v9KxA7dw+AHGL0RODPxU5NDJ3A6d0yERvzfZ3qkzWhz8jbFkVBK12cu5DTho3HBazKQDOw==", + "requires": { + "@babel/helper-module-imports": "^7.0.0" + } + }, + "metro-react-native-babel-preset": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.1.tgz", + "integrity": "sha512-e9tsYDFhU70gar0jQWcZXRPJVCv4k7tEs6Pm74wXO2OO/T1MEumbvniDIGwGG8bG8RUnYdHhjcaiub2Vc5BRWw==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "metro-babel7-plugin-react-transform": "0.51.1", + "react-transform-hmr": "^1.0.4" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=" + }, + "mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "requires": { + "mime-db": "~1.23.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, + "sane": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-3.1.0.tgz", + "integrity": "sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==", + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "metro-babel-register": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.51.0.tgz", + "integrity": "sha512-rhdvHFOZ7/ub019A3+aYs8YeLydb02/FAMsKr2Nz2Jlf6VUxWrMnrcT0NYX16F9TGdi2ulRlJ9dwvUmdhkk+Bw==", + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "core-js": "^2.2.2", + "escape-string-regexp": "^1.0.5" + } + }, + "metro-babel-transformer": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.51.1.tgz", + "integrity": "sha512-+tOnZZzOzufB86ASdfimUEGB1jBKsdsVpPdjNJZkueTFyvYlGqWDQKHM1w9bwKMeM/czPQ48Y6m8Bou6le0X4w==", + "requires": { + "@babel/core": "^7.0.0" + } + }, + "metro-babel7-plugin-react-transform": { + "version": "0.54.1", + "resolved": "https://registry.npmjs.org/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz", + "integrity": "sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0" + } + }, + "metro-cache": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.51.1.tgz", + "integrity": "sha512-0m1+aicsw77LVAehNuTxDpE1c/7Xv/ajRD+UL/lFCWUxnrjSbxVtIKr8l5DxEY11082c1axVRuaV9e436W+eXg==", + "requires": { + "jest-serializer": "24.0.0-alpha.6", + "metro-core": "0.51.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + }, + "dependencies": { + "jest-serializer": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.0.0-alpha.6.tgz", + "integrity": "sha512-IPA5T6/GhlE6dedSk7Cd7YfuORnYjN0VD5iJVFn1Q81RJjpj++Hen5kJbKcg547vXsQ1TddV15qOA/zeIfOCLw==" + } + } + }, + "metro-config": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.51.1.tgz", + "integrity": "sha512-WCNd0tTI9gb/ubgTqK1+ljZL4b3hsXVinsOAtep4nHiVb6DSDdbO2yXDD2rpYx3NE6hDRMFS9HHg6G0139pAqQ==", + "requires": { + "cosmiconfig": "^5.0.5", + "metro": "0.51.1", + "metro-cache": "0.51.1", + "metro-core": "0.51.1", + "pretty-format": "24.0.0-alpha.6" + }, + "dependencies": { + "pretty-format": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz", + "integrity": "sha512-zG2m6YJeuzwBFqb5EIdmwYVf30sap+iMRuYNPytOccEXZMAJbPIFGKVJ/U0WjQegmnQbRo9CI7j6j3HtDaifiA==", + "requires": { + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0" + } + } + } + }, + "metro-core": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.51.1.tgz", + "integrity": "sha512-sG1yACjdFqmIzZN50HqLTKUMp1oy0AehHhmIuYeIllo1DjX6Y2o3UAT3rGP8U+SAqJGXf/OWzl6VNyRPGDENfA==", + "requires": { + "jest-haste-map": "24.0.0-alpha.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.51.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "requires": { + "rsvp": "^3.3.3" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "jest-haste-map": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.0.0-alpha.6.tgz", + "integrity": "sha512-+NO2HMbjvrG8BC39ieLukdpFrcPhhjCJGhpbHodHNZygH1Tt06WrlNYGpZtWKx/zpf533tCtMQXO/q59JenjNw==", + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-serializer": "^24.0.0-alpha.6", + "jest-worker": "^24.0.0-alpha.6", + "micromatch": "^2.3.11", + "sane": "^3.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" + }, + "sane": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-3.1.0.tgz", + "integrity": "sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==", + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + } + } + }, + "metro-memory-fs": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-memory-fs/-/metro-memory-fs-0.51.1.tgz", + "integrity": "sha512-dXVUpLPLwfQcYHd1HlqHGVzBsiwvUdT92TDSbdc10152TP+iynHBqLDWbxt0MAtd6c/QXwOuGZZ1IcX3+lv5iw==" + }, + "metro-minify-uglify": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.51.1.tgz", + "integrity": "sha512-HAqd/rFrQ6mnbqVAszDXIKTg2rqHlY9Fm8DReakgbkAeyMbF2mH3kEgtesPmTrhajdFk81UZcNSm6wxj1JMgVg==", + "requires": { + "uglify-es": "^3.1.9" + } + }, + "metro-react-native-babel-preset": { + "version": "0.54.1", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz", + "integrity": "sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "metro-babel7-plugin-react-transform": "0.54.1", + "react-transform-hmr": "^1.0.4" + } + }, + "metro-react-native-babel-transformer": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.51.0.tgz", + "integrity": "sha512-VFnqtE0qrVmU1HV9B04o53+NZHvDwR+CWCoEx4+7vCqJ9Tvas741biqCjah9xtifoKdElQELk6x0soOAWCDFJA==", + "requires": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.0.1", + "metro-babel-transformer": "0.51.0", + "metro-react-native-babel-preset": "0.51.0" + }, + "dependencies": { + "metro-babel-transformer": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.51.0.tgz", + "integrity": "sha512-M7KEY/hjD3E8tJEliWgI0VOSaJtqaznC0ItM6FiMrhoGDqqa1BvGofl+EPcKqjBSOV1UgExua/T1VOIWbjwQsw==", + "requires": { + "@babel/core": "^7.0.0" + } + }, + "metro-babel7-plugin-react-transform": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.0.tgz", + "integrity": "sha512-dZ95kXcE2FJMoRsYhxr7YLCbOlHWKwe0bOpihRhfImDTgFfuKIzU4ROQwMUbE0NCbzB+ATFsa2FZ3pHDJ5GI0w==", + "requires": { + "@babel/helper-module-imports": "^7.0.0" + } + }, + "metro-react-native-babel-preset": { + "version": "0.51.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.0.tgz", + "integrity": "sha512-Y/aPeLl4RzY8IEAneOyDcpdjto/8yjIuX9eUWRngjSqdHYhGQtqiSBpfTpo0BvXpwNRLwCLHyXo58gNpckTJFw==", + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.0.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "metro-babel7-plugin-react-transform": "0.51.0", + "react-transform-hmr": "^1.0.4" + } + } + } + }, + "metro-resolver": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.51.1.tgz", + "integrity": "sha512-zmWbD/287NDA/jLPuPV0hne/YMMSG0dljzu21TYMg2lXRLur/zROJHHhyepZvuBHgInXBi4Vhr2wvuSnY39SuA==", + "requires": { + "absolute-path": "^0.0.0" + } + }, + "metro-source-map": { + "version": "0.51.1", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.51.1.tgz", + "integrity": "sha512-JyrE+RV4YumrboHPHTGsUUGERjQ681ImRLrSYDGcmNv4tfpk9nvAK26UAas4IvBYFCC9oW90m0udt3kaQGv59Q==", + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.4.tgz", + "integrity": "sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI=", + "requires": { + "ansi": "~0.3.1", + "are-we-there-yet": "~1.1.2", + "gauge": "~1.2.5" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", + "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "^2.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "prompts": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.1.0.tgz", + "integrity": "sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg==", + "dev": true, + "requires": { + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.32", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", + "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + } + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "react": { + "version": "16.8.3", + "resolved": "https://registry.npmjs.org/react/-/react-16.8.3.tgz", + "integrity": "sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.3" + } + }, + "react-clone-referenced-element": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz", + "integrity": "sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg==" + }, + "react-deep-force-update": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz", + "integrity": "sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA==" + }, + "react-devtools-core": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-3.6.1.tgz", + "integrity": "sha512-I/LSX+tpeTrGKaF1wXSfJ/kP+6iaP2JfshEjW8LtQBdz6c6HhzOJtjZXhqOUrAdysuey8M1/JgPY1flSVVt8Ig==", + "requires": { + "shell-quote": "^1.6.1", + "ws": "^3.3.1" + }, + "dependencies": { + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + } + } + }, + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" + }, + "react-native": { + "version": "0.59.9", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.59.9.tgz", + "integrity": "sha512-/+8EgIZwFpYHyyJ7Zav7B6LHNrytwUQ+EKGT/QV7HSrgpf2Y5NZNeUYUHKiVKLYpBip1G32/LcAECQj37YRwGQ==", + "requires": { + "@babel/runtime": "^7.0.0", + "@react-native-community/cli": "^1.2.1", + "absolute-path": "^0.0.0", + "art": "^0.10.0", + "base64-js": "^1.1.2", + "chalk": "^2.4.1", + "commander": "^2.9.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "create-react-class": "^15.6.3", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "errorhandler": "^1.5.0", + "escape-string-regexp": "^1.0.5", + "event-target-shim": "^1.0.5", + "fbjs": "^1.0.0", + "fbjs-scripts": "^1.0.0", + "fs-extra": "^1.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.3", + "inquirer": "^3.0.6", + "invariant": "^2.2.4", + "lodash": "^4.17.5", + "metro-babel-register": "0.51.0", + "metro-react-native-babel-transformer": "0.51.0", + "mime": "^1.3.4", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "morgan": "^1.9.0", + "node-fetch": "^2.2.0", + "node-notifier": "^5.2.1", + "npmlog": "^2.0.4", + "nullthrows": "^1.1.0", + "opn": "^3.0.2", + "optimist": "^0.6.1", + "plist": "^3.0.0", + "pretty-format": "24.0.0-alpha.6", + "promise": "^7.1.1", + "prop-types": "^15.5.8", + "react-clone-referenced-element": "^1.0.1", + "react-devtools-core": "^3.6.0", + "regenerator-runtime": "^0.11.0", + "rimraf": "^2.5.4", + "semver": "^5.0.3", + "serve-static": "^1.13.1", + "shell-quote": "1.6.1", + "stacktrace-parser": "^0.1.3", + "ws": "^1.1.5", + "xmldoc": "^0.4.0", + "yargs": "^9.0.0" + }, + "dependencies": { + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "pretty-format": { + "version": "24.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz", + "integrity": "sha512-zG2m6YJeuzwBFqb5EIdmwYVf30sap+iMRuYNPytOccEXZMAJbPIFGKVJ/U0WjQegmnQbRo9CI7j6j3HtDaifiA==", + "requires": { + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "react-proxy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-1.1.8.tgz", + "integrity": "sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo=", + "requires": { + "lodash": "^4.6.1", + "react-deep-force-update": "^1.0.0" + } + }, + "react-test-renderer": { + "version": "16.8.3", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.8.3.tgz", + "integrity": "sha512-rjJGYebduKNZH0k1bUivVrRLX04JfIQ0FKJLPK10TAb06XWhfi4gTobooF9K/DEFNW98iGac3OSxkfIJUN9Mdg==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "react-is": "^16.8.3", + "scheduler": "^0.13.3" + } + }, + "react-transform-hmr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz", + "integrity": "sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s=", + "requires": { + "global": "^4.3.0", + "react-proxy": "^1.1.7" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" + }, + "regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regenerator-transform": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz", + "integrity": "sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w==", + "requires": { + "private": "^0.1.6" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + } + }, + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==" + }, + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", + "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "*" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.13.6", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", + "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-plist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.0.0.tgz", + "integrity": "sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g==", + "requires": { + "bplist-creator": "0.0.7", + "bplist-parser": "0.1.1", + "plist": "^3.0.1" + } + }, + "sisteransi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", + "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "sp-react-native-mqtt": { + "version": "0.4.25", + "resolved": "https://registry.npmjs.org/sp-react-native-mqtt/-/sp-react-native-mqtt-0.4.25.tgz", + "integrity": "sha512-cR1vF6esV92TdHCDrKDcDC7mAY7qAAENW5/4fyROmSqsnMm01PDdvFsad48u6KCy1FvpcooGldYMiTjFDTZihg==" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "stacktrace-parser": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz", + "integrity": "sha512-wXhu0Z8YgCGigUtHQq+J7pjXCppk3Um5DwH4qskOKHMlJmKwuuUSm+wDAgU7t4sbVjvuDTNGwOfFKgjMEqSflA==", + "requires": { + "type-fest": "^0.3.0" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=" + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + } + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "ua-parser-js": { + "version": "0.7.20", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.20.tgz", + "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw==" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==" + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "underscore": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", + "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==" + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==" + }, + "unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "requires": { + "makeerror": "1.0.x" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "xcode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.0.0.tgz", + "integrity": "sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw==", + "requires": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xmldoc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-0.4.0.tgz", + "integrity": "sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg=", + "requires": { + "sax": "~1.1.1" + }, + "dependencies": { + "sax": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.6.tgz", + "integrity": "sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA=" + } + } + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + }, + "xpipe": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + } + } +} diff --git a/rnmqttexample/package.json b/rnmqttexample/package.json new file mode 100644 index 0000000..4ea5143 --- /dev/null +++ b/rnmqttexample/package.json @@ -0,0 +1,26 @@ +{ + "name": "rnmqttexample", + "version": "0.0.1", + "private": true, + "scripts": { + "start": "node node_modules/react-native/local-cli/cli.js start", + "test": "jest" + }, + "dependencies": { + "react": "16.8.3", + "react-native": "0.59.9", + "sp-react-native-mqtt": "^0.4.25", + "underscore": "^1.9.1" + }, + "devDependencies": { + "@babel/core": "^7.4.5", + "@babel/runtime": "^7.4.5", + "babel-jest": "^24.8.0", + "jest": "^24.8.0", + "metro-react-native-babel-preset": "^0.54.1", + "react-test-renderer": "16.8.3" + }, + "jest": { + "preset": "react-native" + } +} diff --git a/rnmqttexample/realtimeManager.js b/rnmqttexample/realtimeManager.js new file mode 100644 index 0000000..6ebe71b --- /dev/null +++ b/rnmqttexample/realtimeManager.js @@ -0,0 +1,76 @@ +import MQTT from 'sp-react-native-mqtt'; +import _ from 'underscore'; + + +module.exports = { // cached singleton instance + QOS: 1, // Only 0 and 1 supported by Rabbit + props: null, + randIdCreator() { + // eslint-disable-next-line + const S4 = () => (((1+Math.random())*0x10000)|0).toString(16).substring(1); + return `random${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}${S4()}`; + }, + create(userID, connectionProps = {}) { + if (userID && connectionProps) { + // http://www.hivemq.com/demos/websocket-client/ + this.onConnectionOpened = this.onConnectionOpened.bind(this); + this.onConnectionClosed = this.onConnectionClosed.bind(this); + this.onError = this.onError.bind(this); + this.onMessageArrived = this.onMessageArrived.bind(this); + this.disconnect = this.disconnect.bind(this); + + const deviceId = this.randIdCreator() + .replace(/[^a-zA-Z0-9]+/g, ''); + + this.conProps = _.extend({ + clientId: `realtime.${userID}.${deviceId}`, + channelToUse: `mqtt-subscription-realtime.${userID}`, + auth: false, + clean: true, // clean session YES deletes the queue when all clients disconnect + }, connectionProps); + + /* create mqtt client */ + MQTT.createClient(this.conProps) + .then((client) => { + this.client = client; + client.on('closed', this.onConnectionClosed); + client.on('error', this.onError); + client.on('message', this.onMessageArrived); + client.on('connect', this.onConnectionOpened); + client.connect(); + }).catch((err) => { + console.error(`MQTT.createtClient error: ${err}`); + }); + } + }, + + disconnect() { + if (this.client) { + console.log('Now killing open realtime connection.'); + this.client.disconnect(); + } + }, + + onError(error) { + console.error(`MQTT onError: ${error}`); + }, + + onConnectionOpened() { + // subscribe to the client channel + this.client.subscribe(this.conProps.channelToUse, this.QOS); + + console.log('MQTT onConnectionOpened'); + }, + + onConnectionClosed(err) { + console.log(`MQTT onConnectionClosed ${err}`); + }, + + onMessageArrived(message) { + if (message) { + console.log(`MQTT New message: ${JSON.stringify(message)}`) + } + }, + + +}; diff --git a/rnmqttexample/yarn.lock b/rnmqttexample/yarn.lock new file mode 100644 index 0000000..c5e144a --- /dev/null +++ b/rnmqttexample/yarn.lock @@ -0,0 +1,6234 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" + integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helpers" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.5" + "@babel/types" "^7.4.4" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0", "@babel/generator@^7.4.0", "@babel/generator@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.4.4.tgz#174a215eb843fc392c7edcaabeaa873de6e8f041" + integrity sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ== + dependencies: + "@babel/types" "^7.4.4" + jsesc "^2.5.1" + lodash "^4.17.11" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.3.0.tgz#a1ac95a5d2b3e88ae5e54846bf462eeb81b318a4" + integrity sha512-MjA9KgwCuPEkQd9ncSXvSyJ5y+j2sICHyrI0M3L+6fnS4wMSNDc1ARXsbTfbb2cXHn17VisSnU/sHFTCxVxSMw== + dependencies: + "@babel/types" "^7.3.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz#87c1f8ca19ad552a736a7a27b1c1fcf8b1ff1f43" + integrity sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ== + dependencies: + "@babel/helper-hoist-variables" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-create-class-features-plugin@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz#fc3d690af6554cc9efc607364a82d48f58736dba" + integrity sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + +"@babel/helper-define-map@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz#6969d1f570b46bdc900d1eba8e5d59c48ba2c12a" + integrity sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" + integrity sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz#96115ea42a2f139e619e98ed46df6019b94414b8" + integrity sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/template" "^7.4.4" + "@babel/types" "^7.4.4" + lodash "^4.17.11" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0", "@babel/helper-regex@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.4.4.tgz#a47e02bc91fb259d2e6727c2a30013e3ac13c4a2" + integrity sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q== + dependencies: + lodash "^4.17.11" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz#aee41783ebe4f2d3ab3ae775e1cc6f1a90cefa27" + integrity sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" + integrity sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q== + dependencies: + "@babel/types" "^7.4.4" + +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.4.4.tgz#868b0ef59c1dd4e78744562d5ce1b59c89f2f2a5" + integrity sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A== + dependencies: + "@babel/template" "^7.4.4" + "@babel/traverse" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.4.4", "@babel/parser@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.4.5.tgz#04af8d5d5a2b044a2a1bffacc1e5e6673544e872" + integrity sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew== + +"@babel/plugin-external-helpers@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-external-helpers/-/plugin-external-helpers-7.2.0.tgz#7f4cb7dee651cd380d2034847d914288467a6be4" + integrity sha512-QFmtcCShFkyAsNtdCM3lJPmRe1iB+vPZymlB4LnDIKEBj2yKQLQKtoxXxJ8ePT5fwMl4QGg303p4mB0UsSI2/g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-class-properties@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" + integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.2.0.tgz#737b0da44b9254b6152fe29bb99c64e5691f6f68" + integrity sha512-NVfNe7F6nsasG1FnvcFxh2FN0l04ZNe75qTOAVOILWPam0tw9a63RtT/Dab8dPjedZa4fTQaQ83yMMywF9OSug== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.2.0" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39" + integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" + integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-optional-chaining@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.2.0.tgz#ae454f4c21c6c2ce8cb2397dc332ae8b420c5441" + integrity sha512-ea3Q6edZC/55wEBVZAEz42v528VulyO0eir+7uky/sT4XRcdkWJcFi1aPtitTlwUzGnECWJNExWww1SStt+yWw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.2.0" + +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.2.0.tgz#23b3b7b9bcdabd73672a9149f728cd3be6214812" + integrity sha512-UxYaGXYQ7rrKJS/PxIKRkv3exi05oH7rokBAsmCSsCxz1sVPZ7Fu6FzKoGgUvmY+0YgSkYHgUoCh5R5bCNBQlw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-dynamic-import@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" + integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.2.0.tgz#edd83b7adc2e0d059e2467ca96c650ab6d2f3820" + integrity sha512-c7nqUnNST97BWPtoe+Ssi+fJukc9P9/JMZ71IOMNQWza2E+Psrd46N6AEvtw6pqK+gt7ChjXyrw4SPDO79f3Lw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz#a765f061f803bc48f240c26f8747faf97c26bf7c" + integrity sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.2.0.tgz#0b85a3b4bc7cdf4cc4b8bf236335b907ca22e7c7" + integrity sha512-VyN4QANJkRW6lDBmENzRszvZf3/4AXaj9YR7GwrWeeN9tEBPuXbmDYVU9bYBN0D70zCWVwUy0HWq2553VCb6Hw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.2.0.tgz#f75083dfd5ade73e783db729bbd87e7b9efb7624" + integrity sha512-lRCEaKE+LTxDQtgbYajI04ddt6WW0WJq57xqkAZ+s11h4YgfRHhVA/Y2VhfPzzFD4qeLHWg32DMp9HooY4Kqlg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-chaining@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.2.0.tgz#a59d6ae8c167e7608eaa443fda9fa8fa6bf21dff" + integrity sha512-HtGCtvp5Uq/jH/WNUPkK6b7rufnCPLLlDAFN7cmACoIjaOOiXxUt3SswU5loHqrhtqTsa/WoLQ1OQ1AGuZqaWA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.3.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz#a7cc3f66119a9f7ebe2de5383cce193473d65991" + integrity sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz#a3f1d01f2f21cadab20b33a82133116f14fb5894" + integrity sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz#c13279fabf6b916661531841a23c4b7dae29646d" + integrity sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.11" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz#0ce4094cdafd709721076d3b9c38ad31ca715eb6" + integrity sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.4.4" + "@babel/helper-split-export-declaration" "^7.4.4" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz#9d964717829cc9e4b601fc82a26a71a4d8faf20f" + integrity sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.4.tgz#d267a081f49a8705fc9146de0768c6b58dccd8f7" + integrity sha512-WyVedfeEIILYEaWGAUWzVNyqG4sfsNooMhXWsu/YzOvVGcsnPb5PguysjJqI3t3qiaYj0BR8T2f5njdjTGe44Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556" + integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad" + integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d" + integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" + integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== + dependencies: + "@babel/helper-module-transforms" "^7.4.4" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-object-assign@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.2.0.tgz#6fdeea42be17040f119e38e23ea0f49f31968bde" + integrity sha512-nmE55cZBPFgUktbF2OuoZgPRadfxosLOpSgzEPYotKSls9J4pEPcembi8r78RU37Rph6UApCpNmsQA4QMWK9Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16" + integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw== + dependencies: + "@babel/helper-call-delegate" "^7.4.4" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905" + integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.2.0.tgz#ebfaed87834ce8dc4279609a4f0c324c156e3eb0" + integrity sha512-Htf/tPa5haZvRMiNSQSFifK12gtr/8vwfr+A9y69uF0QcU77AVu4K7MiHEkTxF7lQoHOL0F9ErqgfNEAKgXj7A== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.2.0.tgz#20c8c60f0140f5dd3cd63418d452801cf3f7180f" + integrity sha512-A32OkKTp4i5U6aE88GwwcuV4HAprUgHcTq0sSafLxjr6AW0QahrCRCjxogkbbcdtpbXkuTOlgpjophCxb6sh5g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290" + integrity sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg== + dependencies: + "@babel/helper-builder-react-jsx" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.2.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f" + integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA== + dependencies: + regenerator-transform "^0.14.0" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08" + integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0" + integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typescript@^7.0.0": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" + integrity sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f" + integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.5.4" + +"@babel/register@^7.0.0": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.4.4.tgz#370a68ba36f08f015a8b35d4864176c6b65d7a23" + integrity sha512-sn51H88GRa00+ZoMqCVgOphmswG4b7mhf9VOB0LUBAieykq2GnRFerlN+JQkO/ntT7wz4jaHNSRPg9IdMPEUkA== + dependencies: + core-js "^3.0.0" + find-cache-dir "^2.0.0" + lodash "^4.17.11" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" + integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== + dependencies: + regenerator-runtime "^0.13.2" + +"@babel/template@^7.0.0", "@babel/template@^7.1.0", "@babel/template@^7.4.0", "@babel/template@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237" + integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.4.4" + "@babel/types" "^7.4.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5": + version "7.4.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.5.tgz#4e92d1728fd2f1897dafdd321efbff92156c3216" + integrity sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.4.4" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/parser" "^7.4.5" + "@babel/types" "^7.4.4" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.11" + +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.4.tgz#8db9e9a629bb7c29370009b4b779ed93fe57d5f0" + integrity sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.11" + to-fast-properties "^2.0.0" + +"@cnakazawa/watch@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" + integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA== + dependencies: + exec-sh "^0.3.2" + minimist "^1.2.0" + +"@jest/console@^24.7.1": + version "24.7.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.7.1.tgz#32a9e42535a97aedfe037e725bd67e954b459545" + integrity sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg== + dependencies: + "@jest/source-map" "^24.3.0" + chalk "^2.0.1" + slash "^2.0.0" + +"@jest/core@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.8.0.tgz#fbbdcd42a41d0d39cddbc9f520c8bab0c33eed5b" + integrity sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A== + dependencies: + "@jest/console" "^24.7.1" + "@jest/reporters" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-changed-files "^24.8.0" + jest-config "^24.8.0" + jest-haste-map "^24.8.0" + jest-message-util "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve-dependencies "^24.8.0" + jest-runner "^24.8.0" + jest-runtime "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + jest-watcher "^24.8.0" + micromatch "^3.1.10" + p-each-series "^1.0.0" + pirates "^4.0.1" + realpath-native "^1.1.0" + rimraf "^2.5.4" + strip-ansi "^5.0.0" + +"@jest/environment@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.8.0.tgz#0342261383c776bdd652168f68065ef144af0eac" + integrity sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw== + dependencies: + "@jest/fake-timers" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + +"@jest/fake-timers@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.8.0.tgz#2e5b80a4f78f284bcb4bd5714b8e10dd36a8d3d1" + integrity sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw== + dependencies: + "@jest/types" "^24.8.0" + jest-message-util "^24.8.0" + jest-mock "^24.8.0" + +"@jest/reporters@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.8.0.tgz#075169cd029bddec54b8f2c0fc489fd0b9e05729" + integrity sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + istanbul-lib-coverage "^2.0.2" + istanbul-lib-instrument "^3.0.1" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.1" + istanbul-reports "^2.1.1" + jest-haste-map "^24.8.0" + jest-resolve "^24.8.0" + jest-runtime "^24.8.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + node-notifier "^5.2.1" + slash "^2.0.0" + source-map "^0.6.0" + string-length "^2.0.0" + +"@jest/source-map@^24.3.0": + version "24.3.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28" + integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.1.15" + source-map "^0.6.0" + +"@jest/test-result@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.8.0.tgz#7675d0aaf9d2484caa65e048d9b467d160f8e9d3" + integrity sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng== + dependencies: + "@jest/console" "^24.7.1" + "@jest/types" "^24.8.0" + "@types/istanbul-lib-coverage" "^2.0.0" + +"@jest/test-sequencer@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz#2f993bcf6ef5eb4e65e8233a95a3320248cf994b" + integrity sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg== + dependencies: + "@jest/test-result" "^24.8.0" + jest-haste-map "^24.8.0" + jest-runner "^24.8.0" + jest-runtime "^24.8.0" + +"@jest/transform@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.8.0.tgz#628fb99dce4f9d254c6fd9341e3eea262e06fef5" + integrity sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^24.8.0" + babel-plugin-istanbul "^5.1.0" + chalk "^2.0.1" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.1.15" + jest-haste-map "^24.8.0" + jest-regex-util "^24.3.0" + jest-util "^24.8.0" + micromatch "^3.1.10" + realpath-native "^1.1.0" + slash "^2.0.0" + source-map "^0.6.1" + write-file-atomic "2.4.1" + +"@jest/types@^24.8.0": + version "24.8.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.8.0.tgz#f31e25948c58f0abd8c845ae26fcea1491dea7ad" + integrity sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^12.0.9" + +"@react-native-community/cli@^1.2.1": + version "1.9.8" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-1.9.8.tgz#8488699f78b146cab2d7451951c4218671812cdc" + integrity sha512-/qd1fRJzisTjYpfNJ4NGYYM6cWhnTbmTTUPzi3yHTpfWWtyepAl8MLf6RbXaC8menCkg1jGkke6hD4rDoUJK0A== + dependencies: + chalk "^1.1.1" + commander "^2.19.0" + compression "^1.7.1" + connect "^3.6.5" + denodeify "^1.2.1" + envinfo "^5.7.0" + errorhandler "^1.5.0" + escape-string-regexp "^1.0.5" + execa "^1.0.0" + fs-extra "^7.0.1" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + lodash "^4.17.5" + metro "^0.51.0" + metro-config "^0.51.0" + metro-core "^0.51.0" + metro-memory-fs "^0.51.0" + metro-react-native-babel-transformer "^0.51.0" + mime "^1.3.4" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-fetch "^2.2.0" + node-notifier "^5.2.1" + opn "^3.0.2" + plist "^3.0.0" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + slash "^2.0.0" + ws "^1.1.0" + xcode "^2.0.0" + xmldoc "^0.4.0" + +"@types/babel__core@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" + integrity sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc" + integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" + integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.0.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.7.tgz#2496e9ff56196cc1429c72034e07eab6121b6f3f" + integrity sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw== + dependencies: + "@babel/types" "^7.3.0" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" + integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + +"@types/istanbul-lib-report@*": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" + integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" + integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/stack-utils@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" + integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== + +"@types/yargs@^12.0.2", "@types/yargs@^12.0.9": + version "12.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.12.tgz#45dd1d0638e8c8f153e87d296907659296873916" + integrity sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw== + +abab@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" + integrity sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +absolute-path@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/absolute-path/-/absolute-path-0.0.0.tgz#a78762fbdadfb5297be99b15d35a785b2f095bf7" + integrity sha1-p4di+9rftSl76ZsV01p4Wy8JW/c= + +accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^4.1.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.2.tgz#4e2c2313a597fd589720395f6354b41cd5ec8006" + integrity sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ== + dependencies: + acorn "^6.0.1" + acorn-walk "^6.0.1" + +acorn-walk@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" + integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== + +acorn@^5.5.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + +acorn@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + +ajv@^6.5.5: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-colors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.1.0.tgz#6374b4dd5d4718ff3ce27a671a3b1cad077132a9" + integrity sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA== + dependencies: + ansi-wrap "^0.1.0" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM= + dependencies: + ansi-wrap "0.1.0" + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE= + dependencies: + ansi-wrap "0.1.0" + +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw= + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.0.0, ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= + +ansi@^0.3.0, ansi@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + integrity sha1-DELU+xcWDVqa8eSEus4cZpIsGyE= + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + integrity sha1-aHwydYFjWI/vfeezb6vklesaOZo= + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + integrity sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0= + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" + integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= + +array-filter@~0.0.0: + version "0.0.1" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + +array-map@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + +array-reduce@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +art@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/art/-/art-0.10.3.tgz#b01d84a968ccce6208df55a733838c96caeeaea2" + integrity sha512-HXwbdofRTiJT6qZX/FnchtldzJjS3vkLJxQilc3Xj+ma2MXjY4UAyQ0ls1XZYVnDvVIBiFZbC6QsvtW86TD6tQ== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= + +asn1@~0.2.3: + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + +async@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + dependencies: + lodash "^4.17.11" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +babel-jest@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589" + integrity sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw== + dependencies: + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/babel__core" "^7.1.0" + babel-plugin-istanbul "^5.1.0" + babel-preset-jest "^24.6.0" + chalk "^2.4.2" + slash "^2.0.0" + +babel-plugin-istanbul@^5.1.0: + version "5.1.4" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz#841d16b9a58eeb407a0ddce622ba02fe87a752ba" + integrity sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ== + dependencies: + find-up "^3.0.0" + istanbul-lib-instrument "^3.3.0" + test-exclude "^5.2.3" + +babel-plugin-jest-hoist@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz#f7f7f7ad150ee96d7a5e8e2c5da8319579e78019" + integrity sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w== + dependencies: + "@types/babel__traverse" "^7.0.6" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-fbjs@^3.0.1, babel-preset-fbjs@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.2.0.tgz#c0e6347d3e0379ed84b3c2434d3467567aa05297" + integrity sha512-5Jo+JeWiVz2wHUUyAlvb/sSYnXNig9r+HqGAOSfh5Fzxp7SnAaR/tEGRJ1ZX7C77kfk82658w6R5Z+uPATTD9g== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz#66f06136eefce87797539c0d63f1769cc3915984" + integrity sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw== + dependencies: + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + babel-plugin-jest-hoist "^24.6.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.1.2, base64-js@^1.2.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +basic-auth@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +big-integer@^1.6.7: + version "1.6.44" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.44.tgz#4ee9ae5f5839fc11ade338fea216b4513454a539" + integrity sha512-7MzElZPTyJ2fNvBkPxtFQ2fWIkVmuzw41+BZHSzpEq3ymB2MfeKp1+yXl/tS75xCx+WnyV+yb0kp+K1C3UNwmQ== + +bplist-creator@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" + integrity sha1-N98VNgkoJLh8QvlXsBNEEXNyrkU= + dependencies: + stream-buffers "~2.2.0" + +bplist-parser@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.1.1.tgz#d60d5dcc20cba6dc7e1f299b35d3e1f95dafbae6" + integrity sha1-1g1dzCDLptx+HymbNdPh+V2vuuY= + dependencies: + big-integer "^1.6.7" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browser-process-hrtime@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" + integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== + +browser-resolve@^1.11.3: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + dependencies: + resolve "1.1.7" + +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +capture-exit@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" + integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= + dependencies: + rsvp "^3.3.3" + +capture-exit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" + integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== + dependencies: + rsvp "^4.8.4" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.19.0, commander@^2.9.0, commander@~2.20.0: + version "2.20.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" + integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +compressible@~2.0.16: + version "2.0.17" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.17.tgz#6e8c108a16ad58384a977f3a482ca20bff2f38c1" + integrity sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw== + dependencies: + mime-db ">= 1.40.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +convert-source-map@^1.1.0, convert-source-map@^1.4.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= + +core-js@^2.2.2, core-js@^2.4.1: + version "2.6.9" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" + integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== + +core-js@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.3.tgz#95700bca5f248f5f78c0ec63e784eca663ec4138" + integrity sha512-PWZ+ZfuaKf178BIAg+CRsljwjIMRV8MY00CbZczkR6Zk5LfkSkjGoaab3+bqRQWVITNZxQB7TFYz+CFcyuamvA== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +cosmiconfig@^5.0.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +create-react-class@^15.6.3: + version "15.6.3" + resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" + integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== + dependencies: + fbjs "^0.8.9" + loose-envify "^1.3.1" + object-assign "^4.1.1" + +cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": + version "0.3.6" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.6.tgz#f85206cee04efa841f3c5982a74ba96ab20d65ad" + integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A== + +cssstyle@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.2.tgz#427ea4d585b18624f6fdbf9de7a2a1a3ba713077" + integrity sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow== + dependencies: + cssom "0.3.x" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe" + integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ== + dependencies: + abab "^2.0.0" + whatwg-mimetype "^2.2.0" + whatwg-url "^7.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.1.1, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + +detect-newline@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" + integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= + +diff-sequences@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975" + integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw== + +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg= + +domexception@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" + integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + dependencies: + webidl-conversions "^4.0.2" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +envinfo@^5.7.0: + version "5.12.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.12.1.tgz#83068c33e0972eb657d6bc69a6df30badefb46ef" + integrity sha512-pwdo0/G3CIkQ0y6PCXq4RdkvId2elvtPCJMG0konqlrfkWQbf1DWeH9K2b/cvu2YgGvPPTOnonZxXM1gikFu1w== + +error-ex@^1.2.0, error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +errorhandler@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-keys "^1.0.12" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^1.9.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510" + integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw== + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +event-target-shim@^1.0.5: + version "1.1.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-1.1.1.tgz#a86e5ee6bdaa16054475da797ccddf0c55698491" + integrity sha1-qG5e5r2qFgVEddp5fM3fDFVphJE= + +eventemitter3@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + +exec-sh@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" + integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== + dependencies: + merge "^1.2.0" + +exec-sh@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" + integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + +expect@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-24.8.0.tgz#471f8ec256b7b6129ca2524b2a62f030df38718d" + integrity sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA== + dependencies: + "@jest/types" "^24.8.0" + ansi-styles "^3.2.0" + jest-get-type "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-regex-util "^24.3.0" + +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + integrity sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE= + dependencies: + kind-of "^1.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + +fancy-log@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + +fast-deep-equal@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= + dependencies: + bser "^2.0.0" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs-scripts@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz#069a0c0634242d10031c6460ef1fccefcdae8b27" + integrity sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ== + dependencies: + "@babel/core" "^7.0.0" + ansi-colors "^1.0.1" + babel-preset-fbjs "^3.2.0" + core-js "^2.4.1" + cross-spawn "^5.1.0" + fancy-log "^1.3.2" + object-assign "^4.0.1" + plugin-error "^0.1.2" + semver "^5.1.0" + through2 "^2.0.0" + +fbjs@^0.8.9: + version "0.8.17" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" + integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + +fill-range@^2.1.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-minipass@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.6.tgz#2c5cc30ded81282bfe8a0d7c7c1853ddeb102c07" + integrity sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ== + dependencies: + minipass "^2.2.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.3, fsevents@^1.2.7: + version "1.2.9" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" + integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== + dependencies: + nan "^2.12.1" + node-pre-gyp "^0.12.0" + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + integrity sha1-6c7FSD09TuDvRLYKfZnkk14TbZM= + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global@^4.3.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +growly@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" + integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= + +handlebars@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" + integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + dependencies: + ajv "^6.5.5" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + +html-encoding-sniffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" + integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + dependencies: + whatwg-encoding "^1.0.1" + +http-errors@~1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.4, iconv-lite@~0.4.13: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + +image-size@^0.6.0: + version "0.6.3" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.3.tgz#e7e5c65bb534bd7cdcedd6cb5166272a85f75fb2" + integrity sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA== + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630" + integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA== + dependencies: + "@babel/generator" "^7.4.0" + "@babel/parser" "^7.4.3" + "@babel/template" "^7.4.0" + "@babel/traverse" "^7.4.3" + "@babel/types" "^7.4.0" + istanbul-lib-coverage "^2.0.5" + semver "^6.0.0" + +istanbul-lib-report@^2.0.4: + version "2.0.8" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33" + integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ== + dependencies: + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + supports-color "^6.1.0" + +istanbul-lib-source-maps@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^2.1.1: + version "2.2.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.6.tgz#7b4f2660d82b29303a8fe6091f8ca4bf058da1af" + integrity sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA== + dependencies: + handlebars "^4.1.2" + +jest-changed-files@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.8.0.tgz#7e7eb21cf687587a85e50f3d249d1327e15b157b" + integrity sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug== + dependencies: + "@jest/types" "^24.8.0" + execa "^1.0.0" + throat "^4.0.0" + +jest-cli@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.8.0.tgz#b075ac914492ed114fa338ade7362a301693e989" + integrity sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA== + dependencies: + "@jest/core" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + exit "^0.1.2" + import-local "^2.0.0" + is-ci "^2.0.0" + jest-config "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + prompts "^2.0.1" + realpath-native "^1.1.0" + yargs "^12.0.2" + +jest-config@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.8.0.tgz#77db3d265a6f726294687cbbccc36f8a76ee0f4f" + integrity sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/test-sequencer" "^24.8.0" + "@jest/types" "^24.8.0" + babel-jest "^24.8.0" + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^24.8.0" + jest-environment-node "^24.8.0" + jest-get-type "^24.8.0" + jest-jasmine2 "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + micromatch "^3.1.10" + pretty-format "^24.8.0" + realpath-native "^1.1.0" + +jest-diff@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.8.0.tgz#146435e7d1e3ffdf293d53ff97e193f1d1546172" + integrity sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g== + dependencies: + chalk "^2.0.1" + diff-sequences "^24.3.0" + jest-get-type "^24.8.0" + pretty-format "^24.8.0" + +jest-docblock@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd" + integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg== + dependencies: + detect-newline "^2.1.0" + +jest-each@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.8.0.tgz#a05fd2bf94ddc0b1da66c6d13ec2457f35e52775" + integrity sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA== + dependencies: + "@jest/types" "^24.8.0" + chalk "^2.0.1" + jest-get-type "^24.8.0" + jest-util "^24.8.0" + pretty-format "^24.8.0" + +jest-environment-jsdom@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz#300f6949a146cabe1c9357ad9e9ecf9f43f38857" + integrity sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/fake-timers" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + jest-util "^24.8.0" + jsdom "^11.5.1" + +jest-environment-node@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.8.0.tgz#d3f726ba8bc53087a60e7a84ca08883a4c892231" + integrity sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q== + dependencies: + "@jest/environment" "^24.8.0" + "@jest/fake-timers" "^24.8.0" + "@jest/types" "^24.8.0" + jest-mock "^24.8.0" + jest-util "^24.8.0" + +jest-get-type@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.8.0.tgz#a7440de30b651f5a70ea3ed7ff073a32dfe646fc" + integrity sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ== + +jest-haste-map@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.6.tgz#fb2c785080f391b923db51846b86840d0d773076" + integrity sha512-+NO2HMbjvrG8BC39ieLukdpFrcPhhjCJGhpbHodHNZygH1Tt06WrlNYGpZtWKx/zpf533tCtMQXO/q59JenjNw== + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + invariant "^2.2.4" + jest-serializer "^24.0.0-alpha.6" + jest-worker "^24.0.0-alpha.6" + micromatch "^2.3.11" + sane "^3.0.0" + +jest-haste-map@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.8.0.tgz#51794182d877b3ddfd6e6d23920e3fe72f305800" + integrity sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ== + dependencies: + "@jest/types" "^24.8.0" + anymatch "^2.0.0" + fb-watchman "^2.0.0" + graceful-fs "^4.1.15" + invariant "^2.2.4" + jest-serializer "^24.4.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + micromatch "^3.1.10" + sane "^4.0.3" + walker "^1.0.7" + optionalDependencies: + fsevents "^1.2.7" + +jest-jasmine2@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz#a9c7e14c83dd77d8b15e820549ce8987cc8cd898" + integrity sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong== + dependencies: + "@babel/traverse" "^7.1.0" + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^24.8.0" + is-generator-fn "^2.0.0" + jest-each "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-runtime "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + pretty-format "^24.8.0" + throat "^4.0.0" + +jest-leak-detector@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz#c0086384e1f650c2d8348095df769f29b48e6980" + integrity sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g== + dependencies: + pretty-format "^24.8.0" + +jest-matcher-utils@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz#2bce42204c9af12bde46f83dc839efe8be832495" + integrity sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw== + dependencies: + chalk "^2.0.1" + jest-diff "^24.8.0" + jest-get-type "^24.8.0" + pretty-format "^24.8.0" + +jest-message-util@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.8.0.tgz#0d6891e72a4beacc0292b638685df42e28d6218b" + integrity sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/stack-utils" "^1.0.1" + chalk "^2.0.1" + micromatch "^3.1.10" + slash "^2.0.0" + stack-utils "^1.0.1" + +jest-mock@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.8.0.tgz#2f9d14d37699e863f1febf4e4d5a33b7fdbbde56" + integrity sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A== + dependencies: + "@jest/types" "^24.8.0" + +jest-pnp-resolver@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" + integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + +jest-regex-util@^24.3.0: + version "24.3.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36" + integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg== + +jest-resolve-dependencies@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz#19eec3241f2045d3f990dba331d0d7526acff8e0" + integrity sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw== + dependencies: + "@jest/types" "^24.8.0" + jest-regex-util "^24.3.0" + jest-snapshot "^24.8.0" + +jest-resolve@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.8.0.tgz#84b8e5408c1f6a11539793e2b5feb1b6e722439f" + integrity sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw== + dependencies: + "@jest/types" "^24.8.0" + browser-resolve "^1.11.3" + chalk "^2.0.1" + jest-pnp-resolver "^1.2.1" + realpath-native "^1.1.0" + +jest-runner@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.8.0.tgz#4f9ae07b767db27b740d7deffad0cf67ccb4c5bb" + integrity sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.8.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + chalk "^2.4.2" + exit "^0.1.2" + graceful-fs "^4.1.15" + jest-config "^24.8.0" + jest-docblock "^24.3.0" + jest-haste-map "^24.8.0" + jest-jasmine2 "^24.8.0" + jest-leak-detector "^24.8.0" + jest-message-util "^24.8.0" + jest-resolve "^24.8.0" + jest-runtime "^24.8.0" + jest-util "^24.8.0" + jest-worker "^24.6.0" + source-map-support "^0.5.6" + throat "^4.0.0" + +jest-runtime@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.8.0.tgz#05f94d5b05c21f6dc54e427cd2e4980923350620" + integrity sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/environment" "^24.8.0" + "@jest/source-map" "^24.3.0" + "@jest/transform" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/yargs" "^12.0.2" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.1.15" + jest-config "^24.8.0" + jest-haste-map "^24.8.0" + jest-message-util "^24.8.0" + jest-mock "^24.8.0" + jest-regex-util "^24.3.0" + jest-resolve "^24.8.0" + jest-snapshot "^24.8.0" + jest-util "^24.8.0" + jest-validate "^24.8.0" + realpath-native "^1.1.0" + slash "^2.0.0" + strip-bom "^3.0.0" + yargs "^12.0.2" + +jest-serializer@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.6.tgz#27d2fee4b1a85698717a30c3ec2ab80767312597" + integrity sha512-IPA5T6/GhlE6dedSk7Cd7YfuORnYjN0VD5iJVFn1Q81RJjpj++Hen5kJbKcg547vXsQ1TddV15qOA/zeIfOCLw== + +jest-serializer@^24.0.0-alpha.6, jest-serializer@^24.4.0: + version "24.4.0" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3" + integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q== + +jest-snapshot@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.8.0.tgz#3bec6a59da2ff7bc7d097a853fb67f9d415cb7c6" + integrity sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg== + dependencies: + "@babel/types" "^7.0.0" + "@jest/types" "^24.8.0" + chalk "^2.0.1" + expect "^24.8.0" + jest-diff "^24.8.0" + jest-matcher-utils "^24.8.0" + jest-message-util "^24.8.0" + jest-resolve "^24.8.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^24.8.0" + semver "^5.5.0" + +jest-util@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.8.0.tgz#41f0e945da11df44cc76d64ffb915d0716f46cd1" + integrity sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA== + dependencies: + "@jest/console" "^24.7.1" + "@jest/fake-timers" "^24.8.0" + "@jest/source-map" "^24.3.0" + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + callsites "^3.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.15" + is-ci "^2.0.0" + mkdirp "^0.5.1" + slash "^2.0.0" + source-map "^0.6.0" + +jest-validate@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.8.0.tgz#624c41533e6dfe356ffadc6e2423a35c2d3b4849" + integrity sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA== + dependencies: + "@jest/types" "^24.8.0" + camelcase "^5.0.0" + chalk "^2.0.1" + jest-get-type "^24.8.0" + leven "^2.1.0" + pretty-format "^24.8.0" + +jest-watcher@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.8.0.tgz#58d49915ceddd2de85e238f6213cef1c93715de4" + integrity sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw== + dependencies: + "@jest/test-result" "^24.8.0" + "@jest/types" "^24.8.0" + "@types/yargs" "^12.0.9" + ansi-escapes "^3.0.0" + chalk "^2.0.1" + jest-util "^24.8.0" + string-length "^2.0.0" + +jest-worker@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.6.tgz#463681b92c117c57107135c14b9b9d6cd51d80ce" + integrity sha512-iXtH7MR9bjWlNnlnRBcrBRrb4cSVxML96La5vsnmBvDI+mJnkP5uEt6Fgpo5Y8f3z9y2Rd7wuPnKRxqQsiU/dA== + dependencies: + merge-stream "^1.0.1" + +jest-worker@^24.0.0-alpha.6, jest-worker@^24.6.0: + version "24.6.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.6.0.tgz#7f81ceae34b7cde0c9827a6980c35b7cdc0161b3" + integrity sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ== + dependencies: + merge-stream "^1.0.1" + supports-color "^6.1.0" + +jest@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-24.8.0.tgz#d5dff1984d0d1002196e9b7f12f75af1b2809081" + integrity sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg== + dependencies: + import-local "^2.0.0" + jest-cli "^24.8.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^11.5.1: + version "11.12.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8" + integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw== + dependencies: + abab "^2.0.0" + acorn "^5.5.3" + acorn-globals "^4.1.0" + array-equal "^1.0.0" + cssom ">= 0.3.2 < 0.4.0" + cssstyle "^1.0.0" + data-urls "^1.0.0" + domexception "^1.0.1" + escodegen "^1.9.1" + html-encoding-sniffer "^1.0.2" + left-pad "^1.3.0" + nwsapi "^2.0.7" + parse5 "4.0.0" + pn "^1.1.0" + request "^2.87.0" + request-promise-native "^1.0.5" + sax "^1.2.4" + symbol-tree "^3.2.2" + tough-cookie "^2.3.4" + w3c-hr-time "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-encoding "^1.0.3" + whatwg-mimetype "^2.1.0" + whatwg-url "^6.4.1" + ws "^5.2.0" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" + integrity sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ= + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +kleur@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +left-pad@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" + integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== + +leven@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + integrity sha1-QzCUmoM6fI2iLMIPaibE1Z3runA= + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + integrity sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4= + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + integrity sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= + +lodash@^4.17.11, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.6.1: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +makeerror@1.0.x: + version "1.0.11" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" + integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= + dependencies: + tmpl "1.0.x" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +merge-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= + dependencies: + readable-stream "^2.0.1" + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +metro-babel-register@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.51.0.tgz#d86d3f2d90b45c7a3c6ae67a53bd1e50bad7a24d" + integrity sha512-rhdvHFOZ7/ub019A3+aYs8YeLydb02/FAMsKr2Nz2Jlf6VUxWrMnrcT0NYX16F9TGdi2ulRlJ9dwvUmdhkk+Bw== + dependencies: + "@babel/core" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/register" "^7.0.0" + core-js "^2.2.2" + escape-string-regexp "^1.0.5" + +metro-babel-transformer@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.51.0.tgz#9ee5199163ac46b2057527b3f8cbd8b089ffc03e" + integrity sha512-M7KEY/hjD3E8tJEliWgI0VOSaJtqaznC0ItM6FiMrhoGDqqa1BvGofl+EPcKqjBSOV1UgExua/T1VOIWbjwQsw== + dependencies: + "@babel/core" "^7.0.0" + +metro-babel-transformer@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.51.1.tgz#97be9e2b96c78aa202b52ae05fb86f71327aef72" + integrity sha512-+tOnZZzOzufB86ASdfimUEGB1jBKsdsVpPdjNJZkueTFyvYlGqWDQKHM1w9bwKMeM/czPQ48Y6m8Bou6le0X4w== + dependencies: + "@babel/core" "^7.0.0" + +metro-babel7-plugin-react-transform@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.0.tgz#af27dd81666b91f05d2b371b0d6d283c585e38b6" + integrity sha512-dZ95kXcE2FJMoRsYhxr7YLCbOlHWKwe0bOpihRhfImDTgFfuKIzU4ROQwMUbE0NCbzB+ATFsa2FZ3pHDJ5GI0w== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-babel7-plugin-react-transform@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.51.1.tgz#9cce2c340cc4006fc82aa6dfab27af22d592607e" + integrity sha512-wzn4X9KgmAMZ7Bi6v9KxA7dw+AHGL0RODPxU5NDJ3A6d0yERvzfZ3qkzWhz8jbFkVBK12cu5DTho3HBazKQDOw== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-babel7-plugin-react-transform@0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz#5335b810284789724886dc483d5bde9c149a1996" + integrity sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + +metro-cache@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.51.1.tgz#d0b296eab8e009214413bba87e4eac3d9b44cd04" + integrity sha512-0m1+aicsw77LVAehNuTxDpE1c/7Xv/ajRD+UL/lFCWUxnrjSbxVtIKr8l5DxEY11082c1axVRuaV9e436W+eXg== + dependencies: + jest-serializer "24.0.0-alpha.6" + metro-core "0.51.1" + mkdirp "^0.5.1" + rimraf "^2.5.4" + +metro-config@0.51.1, metro-config@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.51.1.tgz#8f1a241ce2c0b521cd492c39bc5c6c69e3397b82" + integrity sha512-WCNd0tTI9gb/ubgTqK1+ljZL4b3hsXVinsOAtep4nHiVb6DSDdbO2yXDD2rpYx3NE6hDRMFS9HHg6G0139pAqQ== + dependencies: + cosmiconfig "^5.0.5" + metro "0.51.1" + metro-cache "0.51.1" + metro-core "0.51.1" + pretty-format "24.0.0-alpha.6" + +metro-core@0.51.1, metro-core@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.51.1.tgz#e7227fb1dd1bb3f953272fad9876e6201140b038" + integrity sha512-sG1yACjdFqmIzZN50HqLTKUMp1oy0AehHhmIuYeIllo1DjX6Y2o3UAT3rGP8U+SAqJGXf/OWzl6VNyRPGDENfA== + dependencies: + jest-haste-map "24.0.0-alpha.6" + lodash.throttle "^4.1.1" + metro-resolver "0.51.1" + wordwrap "^1.0.0" + +metro-memory-fs@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-memory-fs/-/metro-memory-fs-0.51.1.tgz#624291f5956b0fd11532d80b1b85d550926f96c9" + integrity sha512-dXVUpLPLwfQcYHd1HlqHGVzBsiwvUdT92TDSbdc10152TP+iynHBqLDWbxt0MAtd6c/QXwOuGZZ1IcX3+lv5iw== + +metro-minify-uglify@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.51.1.tgz#60cd8fe4d3e82d6670c717b8ddb52ae63199c0e4" + integrity sha512-HAqd/rFrQ6mnbqVAszDXIKTg2rqHlY9Fm8DReakgbkAeyMbF2mH3kEgtesPmTrhajdFk81UZcNSm6wxj1JMgVg== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.0.tgz#978d960acf2d214bbbe43e59145878d663bd07de" + integrity sha512-Y/aPeLl4RzY8IEAneOyDcpdjto/8yjIuX9eUWRngjSqdHYhGQtqiSBpfTpo0BvXpwNRLwCLHyXo58gNpckTJFw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.51.0" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-preset@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.51.1.tgz#44aeeedfea37f7c2ab8f6f273fa71b90fe65f089" + integrity sha512-e9tsYDFhU70gar0jQWcZXRPJVCv4k7tEs6Pm74wXO2OO/T1MEumbvniDIGwGG8bG8RUnYdHhjcaiub2Vc5BRWw== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.51.1" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-preset@^0.54.1: + version "0.54.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz#b8f03865c381841d7f8912e7ba46804ea3a928b8" + integrity sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.0.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-assign" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + metro-babel7-plugin-react-transform "0.54.1" + react-transform-hmr "^1.0.4" + +metro-react-native-babel-transformer@0.51.0: + version "0.51.0" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.51.0.tgz#57a695e97a19d95de63c9633f9d0dc024ee8e99a" + integrity sha512-VFnqtE0qrVmU1HV9B04o53+NZHvDwR+CWCoEx4+7vCqJ9Tvas741biqCjah9xtifoKdElQELk6x0soOAWCDFJA== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.0.1" + metro-babel-transformer "0.51.0" + metro-react-native-babel-preset "0.51.0" + +metro-react-native-babel-transformer@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.51.1.tgz#bac34f988c150c725cd1875c13701cc2032615f9" + integrity sha512-D0KU+JPb/Z76nUWt3+bkjKggOlGvqAVI2BpIH2JFKprpUyBjWaCRqHnkBfZGixYwUfmu93MIlKJWr6iKzzFrlg== + dependencies: + "@babel/core" "^7.0.0" + babel-preset-fbjs "^3.0.1" + metro-babel-transformer "0.51.1" + metro-react-native-babel-preset "0.51.1" + +metro-resolver@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.51.1.tgz#4c26f0baee47d30250187adca3d34c902e627611" + integrity sha512-zmWbD/287NDA/jLPuPV0hne/YMMSG0dljzu21TYMg2lXRLur/zROJHHhyepZvuBHgInXBi4Vhr2wvuSnY39SuA== + dependencies: + absolute-path "^0.0.0" + +metro-source-map@0.51.1: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.51.1.tgz#1a8da138e98e184304d5558b4f92a5c2141822d0" + integrity sha512-JyrE+RV4YumrboHPHTGsUUGERjQ681ImRLrSYDGcmNv4tfpk9nvAK26UAas4IvBYFCC9oW90m0udt3kaQGv59Q== + dependencies: + source-map "^0.5.6" + +metro@0.51.1, metro@^0.51.0: + version "0.51.1" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.51.1.tgz#b0aad4731593b9f244261bad1abb2a006d1c8969" + integrity sha512-nM0dqn8LQlMjhChl2fzTUq2EWiUebZM7nkesD9vQe47W10bj/tbRLPiIIAxht6SRDbPd/hRA+t39PxLhPSKEKg== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/plugin-external-helpers" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + absolute-path "^0.0.0" + async "^2.4.0" + babel-preset-fbjs "^3.0.1" + buffer-crc32 "^0.2.13" + chalk "^2.4.1" + concat-stream "^1.6.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + eventemitter3 "^3.0.0" + fbjs "^1.0.0" + fs-extra "^1.0.0" + graceful-fs "^4.1.3" + image-size "^0.6.0" + invariant "^2.2.4" + jest-haste-map "24.0.0-alpha.6" + jest-worker "24.0.0-alpha.6" + json-stable-stringify "^1.0.1" + lodash.throttle "^4.1.1" + merge-stream "^1.0.1" + metro-babel-transformer "0.51.1" + metro-cache "0.51.1" + metro-config "0.51.1" + metro-core "0.51.1" + metro-minify-uglify "0.51.1" + metro-react-native-babel-preset "0.51.1" + metro-resolver "0.51.1" + metro-source-map "0.51.1" + mime-types "2.1.11" + mkdirp "^0.5.1" + node-fetch "^2.2.0" + nullthrows "^1.1.0" + react-transform-hmr "^1.0.4" + resolve "^1.5.0" + rimraf "^2.5.4" + serialize-error "^2.1.0" + source-map "^0.5.6" + temp "0.8.3" + throat "^4.1.0" + wordwrap "^1.0.0" + write-file-atomic "^1.2.0" + ws "^1.1.5" + xpipe "^1.0.5" + yargs "^9.0.0" + +micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +mime-db@1.40.0, "mime-db@>= 1.40.0 < 2": + version "1.40.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32" + integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + +mime-db@~1.23.0: + version "1.23.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.23.0.tgz#a31b4070adaea27d732ea333740a64d0ec9a6659" + integrity sha1-oxtAcK2uon1zLqMzdApk0OyaZlk= + +mime-types@2.1.11: + version "2.1.11" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.11.tgz#c259c471bda808a85d6cd193b430a5fae4473b3c" + integrity sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw= + dependencies: + mime-db "~1.23.0" + +mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + +mime@1.6.0, mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + +minimist@^1.1.1, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= + +minipass@^2.2.1, minipass@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + +morgan@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" + integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA== + dependencies: + basic-auth "~2.0.0" + debug "2.6.9" + depd "~1.1.2" + on-finished "~2.3.0" + on-headers "~1.0.1" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +nan@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" + integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +needle@^2.2.1: + version "2.4.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" + integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + +node-fetch@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + +node-notifier@^5.2.1: + version "5.4.0" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.0.tgz#7b455fdce9f7de0c63538297354f3db468426e6a" + integrity sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ== + dependencies: + growly "^1.3.0" + is-wsl "^1.1.0" + semver "^5.5.0" + shellwords "^0.1.1" + which "^1.3.0" + +node-pre-gyp@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" + integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npmlog@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" + integrity sha1-mLUlMPJRTKkNCexbIsiEZyI3VpI= + dependencies: + ansi "~0.3.1" + are-we-there-yet "~1.1.2" + gauge "~1.2.5" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nullthrows@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.0.7: + version "2.1.4" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.4.tgz#e006a878db23636f8e8a67d33ca0e4edf61a842f" + integrity sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.12: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1, on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +opn@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/opn/-/opn-3.0.3.tgz#b6d99e7399f78d65c3baaffef1fb288e9b85243a" + integrity sha1-ttmec5n3jWXDuq/+8fsojpuFJDo= + dependencies: + object-assign "^4.0.1" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-locale@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-each-series@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" + integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E= + dependencies: + p-reduce "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-reduce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" + integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= + dependencies: + pify "^2.0.0" + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.0, pirates@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" + integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== + dependencies: + node-modules-regexp "^1.0.0" + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +plist@^3.0.0, plist@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c" + integrity sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ== + dependencies: + base64-js "^1.2.3" + xmlbuilder "^9.0.7" + xmldom "0.1.x" + +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + +pn@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" + integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +pretty-format@24.0.0-alpha.6: + version "24.0.0-alpha.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0-alpha.6.tgz#25ad2fa46b342d6278bf241c5d2114d4376fbac1" + integrity sha512-zG2m6YJeuzwBFqb5EIdmwYVf30sap+iMRuYNPytOccEXZMAJbPIFGKVJ/U0WjQegmnQbRo9CI7j6j3HtDaifiA== + dependencies: + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + +pretty-format@^24.8.0: + version "24.8.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.8.0.tgz#8dae7044f58db7cb8be245383b565a963e3c27f2" + integrity sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw== + dependencies: + "@jest/types" "^24.8.0" + ansi-regex "^4.0.0" + ansi-styles "^3.2.0" + react-is "^16.8.4" + +private@^0.1.6: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + +prompts@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.1.0.tgz#bf90bc71f6065d255ea2bdc0fe6520485c1b45db" + integrity sha512-+x5TozgqYdOwWsQFZizE/Tra3fKvAoy037kOyU6cgz84n8f6zxngLOV4O32kTwt9FcLCxAqw0P/c8rOr9y+Gfg== + dependencies: + kleur "^3.0.2" + sisteransi "^1.0.0" + +prop-types@^15.5.8, prop-types@^15.6.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + +psl@^1.1.24, psl@^1.1.28: + version "1.1.32" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.32.tgz#3f132717cf2f9c169724b2b6caf373cf694198db" + integrity sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-clone-referenced-element@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/react-clone-referenced-element/-/react-clone-referenced-element-1.1.0.tgz#9cdda7f2aeb54fea791f3ab8c6ab96c7a77d0158" + integrity sha512-FKOsfKbBkPxYE8576EM6uAfHC4rnMpLyH6/TJUL4WcHUEB3EUn8AxPjnnV/IiwSSzsClvHYK+sDELKN/EJ0WYg== + +react-deep-force-update@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.1.2.tgz#3d2ae45c2c9040cbb1772be52f8ea1ade6ca2ee1" + integrity sha512-WUSQJ4P/wWcusaH+zZmbECOk7H5N2pOIl0vzheeornkIMhu+qrNdGFm0bDZLCb0hSF0jf/kH1SgkNGfBdTc4wA== + +react-devtools-core@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.1.tgz#51af81ceada65209bbccb8b547a01187cd1cbf04" + integrity sha512-I/LSX+tpeTrGKaF1wXSfJ/kP+6iaP2JfshEjW8LtQBdz6c6HhzOJtjZXhqOUrAdysuey8M1/JgPY1flSVVt8Ig== + dependencies: + shell-quote "^1.6.1" + ws "^3.3.1" + +react-is@^16.8.1, react-is@^16.8.3, react-is@^16.8.4: + version "16.8.6" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" + integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== + +react-native@0.59.9: + version "0.59.9" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.59.9.tgz#c94ee4fa35121720c05235a2dd6cdd2784bf5177" + integrity sha512-/+8EgIZwFpYHyyJ7Zav7B6LHNrytwUQ+EKGT/QV7HSrgpf2Y5NZNeUYUHKiVKLYpBip1G32/LcAECQj37YRwGQ== + dependencies: + "@babel/runtime" "^7.0.0" + "@react-native-community/cli" "^1.2.1" + absolute-path "^0.0.0" + art "^0.10.0" + base64-js "^1.1.2" + chalk "^2.4.1" + commander "^2.9.0" + compression "^1.7.1" + connect "^3.6.5" + create-react-class "^15.6.3" + debug "^2.2.0" + denodeify "^1.2.1" + errorhandler "^1.5.0" + escape-string-regexp "^1.0.5" + event-target-shim "^1.0.5" + fbjs "^1.0.0" + fbjs-scripts "^1.0.0" + fs-extra "^1.0.0" + glob "^7.1.1" + graceful-fs "^4.1.3" + inquirer "^3.0.6" + invariant "^2.2.4" + lodash "^4.17.5" + metro-babel-register "0.51.0" + metro-react-native-babel-transformer "0.51.0" + mime "^1.3.4" + minimist "^1.2.0" + mkdirp "^0.5.1" + morgan "^1.9.0" + node-fetch "^2.2.0" + node-notifier "^5.2.1" + npmlog "^2.0.4" + nullthrows "^1.1.0" + opn "^3.0.2" + optimist "^0.6.1" + plist "^3.0.0" + pretty-format "24.0.0-alpha.6" + promise "^7.1.1" + prop-types "^15.5.8" + react-clone-referenced-element "^1.0.1" + react-devtools-core "^3.6.0" + regenerator-runtime "^0.11.0" + rimraf "^2.5.4" + semver "^5.0.3" + serve-static "^1.13.1" + shell-quote "1.6.1" + stacktrace-parser "^0.1.3" + ws "^1.1.5" + xmldoc "^0.4.0" + yargs "^9.0.0" + +react-proxy@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" + integrity sha1-nb/Z2SdSjDqp9ETkVYw3gwq4wmo= + dependencies: + lodash "^4.6.1" + react-deep-force-update "^1.0.0" + +react-test-renderer@16.8.3: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.3.tgz#230006af264cc46aeef94392e04747c21839e05e" + integrity sha512-rjJGYebduKNZH0k1bUivVrRLX04JfIQ0FKJLPK10TAb06XWhfi4gTobooF9K/DEFNW98iGac3OSxkfIJUN9Mdg== + dependencies: + object-assign "^4.1.1" + prop-types "^15.6.2" + react-is "^16.8.3" + scheduler "^0.13.3" + +react-transform-hmr@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" + integrity sha1-4aQL0Krvxy6N/Xp82gmvhQZjl7s= + dependencies: + global "^4.3.0" + react-proxy "^1.1.7" + +react@16.8.3: + version "16.8.3" + resolved "https://registry.yarnpkg.com/react/-/react-16.8.3.tgz#c6f988a2ce895375de216edcfaedd6b9a76451d9" + integrity sha512-3UoSIsEq8yTJuSu0luO1QQWYbgGEILm+eJl2QN/VLDi7hL+EN18M3q3oVZwmVzzBJ3DkM7RMdRwBmZZ+b4IzSA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.13.3" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== + dependencies: + find-up "^3.0.0" + read-pkg "^3.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@~2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +realpath-native@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c" + integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA== + dependencies: + util.promisify "^1.0.0" + +regenerate-unicode-properties@^8.0.2: + version "8.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e" + integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + +regenerator-transform@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf" + integrity sha512-rtOelq4Cawlbmq9xuMR5gdFmv7ku/sFoB7sRiywx7aq53bc52b4j6zvH7Te1Vt/X2YveDKnCGUbioieU7FEL3w== + dependencies: + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regexpu-core@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae" + integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ== + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^8.0.2" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.1.0" + +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== + +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-promise-core@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.2.tgz#339f6aababcafdb31c799ff158700336301d3346" + integrity sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag== + dependencies: + lodash "^4.17.11" + +request-promise-native@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.7.tgz#a49868a624bdea5069f1251d0a836e0d89aa2c59" + integrity sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w== + dependencies: + request-promise-core "1.1.2" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + +resolve@^1.10.0, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1: + version "1.11.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.11.0.tgz#4014870ba296176b86343d50b60f3b50609ce232" + integrity sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw== + dependencies: + path-parse "^1.0.6" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + integrity sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI= + +rsvp@^3.3.3: + version "3.6.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" + integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + +rsvp@^4.8.4: + version "4.8.5" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" + integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + integrity sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74= + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sane@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" + integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== + dependencies: + anymatch "^2.0.0" + capture-exit "^1.2.0" + exec-sh "^0.2.0" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.18.0" + optionalDependencies: + fsevents "^1.2.3" + +sane@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" + integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== + dependencies: + "@cnakazawa/watch" "^1.0.3" + anymatch "^2.0.0" + capture-exit "^2.0.0" + exec-sh "^0.3.2" + execa "^1.0.0" + fb-watchman "^2.0.0" + micromatch "^3.1.4" + minimist "^1.1.1" + walker "~1.0.5" + +sax@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +sax@~1.1.1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.1.6.tgz#5d616be8a5e607d54e114afae55b7eaf2fcc3240" + integrity sha1-XWFr6KXmB9VOEUr65Vt+ry/MMkA= + +scheduler@^0.13.3: + version "0.13.6" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889" + integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +semver@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.1.1.tgz#53f53da9b30b2103cd4f15eab3a18ecbcb210c9b" + integrity sha512-rWYq2e5iYW+fFe/oPPtYJxYgjBm8sC4rmoGdUOgBB7VnwKt6HrL793l2voH1UlsyYZpJ4g0wfjnTEO1s1NP2eQ== + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha1-ULZ51WNc34Rme9yOWa9OW4HV9go= + +serve-static@^1.13.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shell-quote@1.6.1, shell-quote@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" + integrity sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + +shellwords@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" + integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== + +signal-exit@^3.0.0, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +simple-plist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.0.0.tgz#bed3085633b22f371e111f45d159a1ccf94b81eb" + integrity sha512-043L2rO80LVF7zfZ+fqhsEkoJFvW8o59rt/l4ctx1TJWoTx7/jkiS1R5TatD15Z1oYnuLJytzE7gcnnBuIPL2g== + dependencies: + bplist-creator "0.0.7" + bplist-parser "0.1.1" + plist "^3.0.1" + +sisteransi@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" + integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-map-resolve@^0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + dependencies: + atob "^2.1.1" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.5.6, source-map-support@^0.5.9: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.0, source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz#75ecd1a88de8c184ef015eafb51b5b48bfd11bb1" + integrity sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +stack-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" + integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + +stacktrace-parser@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.6.tgz#c17d466d15ba51bee2f753d064f17327a886ff37" + integrity sha512-wXhu0Z8YgCGigUtHQq+J7pjXCppk3Um5DwH4qskOKHMlJmKwuuUSm+wDAgU7t4sbVjvuDTNGwOfFKgjMEqSflA== + dependencies: + type-fest "^0.3.0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + +stream-buffers@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + integrity sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ= + +string-length@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" + integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= + dependencies: + astral-regex "^1.0.0" + strip-ansi "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +symbol-tree@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= + +tar@^4: + version "4.4.10" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" + integrity sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.5" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +temp@0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + integrity sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k= + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +test-exclude@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0" + integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g== + dependencies: + glob "^7.1.3" + minimatch "^3.0.4" + read-pkg-up "^4.0.0" + require-main-filename "^2.0.0" + +throat@^4.0.0, throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@^2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM= + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +tmpl@1.0.x: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" + integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tough-cookie@^2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= + dependencies: + punycode "^2.1.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +ua-parser-js@^0.7.18: + version "0.7.20" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.20.tgz#7527178b82f6a62a0f243d1f94fd30e3e3c21098" + integrity sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +uglify-js@^3.1.4: + version "3.6.0" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" + integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + dependencies: + commander "~2.20.0" + source-map "~0.6.1" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + integrity sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po= + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz#5b4b426e08d13a80365e0d657ac7a6c1ec46a277" + integrity sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57" + integrity sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw== + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +w3c-hr-time@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" + integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + dependencies: + browser-process-hrtime "^0.1.2" + +walker@^1.0.7, walker@~1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" + integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + dependencies: + makeerror "1.0.x" + +watch@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" + integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= + dependencies: + exec-sh "^0.2.0" + minimist "^1.2.0" + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + +whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^6.4.1: + version "6.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" + integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.0.0.tgz#fde926fa54a599f3adf82dff25a9f7be02dc6edd" + integrity sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529" + integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^1.2.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +ws@^1.1.0, ws@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51" + integrity sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w== + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +ws@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + +ws@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" + integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + dependencies: + async-limiter "~1.0.0" + +xcode@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xcode/-/xcode-2.0.0.tgz#134f1f94c26fbfe8a9aaa9724bfb2772419da1a2" + integrity sha512-5xF6RCjAdDEiEsbbZaS/gBRt3jZ/177otZcpoLCjGN/u1LrfgH7/Sgeeavpr/jELpyDqN2im3AKosl2G2W8hfw== + dependencies: + simple-plist "^1.0.0" + uuid "^3.3.2" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xmlbuilder@^9.0.7: + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + +xmldoc@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-0.4.0.tgz#d257224be8393eaacbf837ef227fd8ec25b36888" + integrity sha1-0lciS+g5PqrL+DfvIn/Y7CWzaIg= + dependencies: + sax "~1.1.1" + +xmldom@0.1.x: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + integrity sha1-1QH5ezvbQDr4757MIFcxh6rawOk= + +xpipe@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/xpipe/-/xpipe-1.0.5.tgz#8dd8bf45fc3f7f55f0e054b878f43a62614dafdf" + integrity sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98= + +xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= + +"y18n@^3.2.1 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + +yallist@^3.0.0, yallist@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= + dependencies: + camelcase "^4.1.0" + +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + +yargs@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= + dependencies: + camelcase "^4.1.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + read-pkg-up "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^7.0.0" From c89d7bb276aebe49e449ea03ffdfd30c31c8a6c3 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 12 Jun 2019 19:48:25 +0300 Subject: [PATCH 25/41] Updated README --- README.md | 69 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 36f0506..ced21d5 100644 --- a/README.md +++ b/README.md @@ -2,74 +2,79 @@ ## Description -[react-native](https://github.com/facebook/react-native) mqtt client module +A [react-native](https://github.com/facebook/react-native) mqtt client module that works -## MQTT Features (inherit from native MQTT framework) -* Use [MQTT Framework](https://github.com/ckrey/MQTT-Client-Framework) for IOS, [Paho MQTT Client](https://eclipse.org/paho/clients/android/) for Android -* Support both IOS and Android +## MQTT Features (inherited from the native MQTT framework) +* Uses [MQTT Framework](https://github.com/ckrey/MQTT-Client-Framework) for IOS, [Paho MQTT Client](https://eclipse.org/paho/clients/android/) for Android +* Supports both IOS and Android * SSL/TLS -* Native library, support mqtt over tcp +* Native library, support mqtt over tcp (forget websockets, we're on **mobile**) -## Warning -This library in progress developing, api may change, SSL/TLS non verify ## Getting started -### Manual install +### Installation -#### JS +#### Step 1: ```bash -npm install rusfearuth/react-native-mqtt --save +npm install sp-react-native-mqtt --save ``` + or + +```bash +yarn add sp-react-native-mqtt +``` + +#### Step 2: + ```bash -yarn add rusfearuth/react-native-mqtt +react-native link sp-react-native-mqtt ``` -#### iOS -- In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` -- Go to `node_modules` ➜ `react-native-mqtt` and add `RCTMqtt.xcodeproj` +#### Step 3: +##### iOS + +Add `pod 'MQTTClient'` to your podfile and `pod install` + +

+Alternatively you can manually link the library on iOS (click to expand) + +In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [your project's name]` +- Go to `node_modules` ➜ `sp-react-native-mqtt` and add `RCTMqtt.xcodeproj` - In XCode, in the project navigator, select your project. Add `libRCTmqtt.a` and `libicucore.tbd` to your project's `Build Phases` ➜ `Link Binary With Libraries` - Click `RCTMqtt.xcodeproj` in the project navigator and go the `Build Settings` tab. Make sure 'All' is toggled on (instead of 'Basic'). In the `Search Paths` section, look for `Header Search Paths` and make sure it contains both `$(SRCROOT)/../../react-native/React` - mark as `recursive`. -Add `pod 'MQTTClient'` to your podfile and `pod install` -- Run your project (`Cmd+R`) + +
+ -#### Android +##### Android + - Modify the ReactInstanceManager.builder() calls chain in `android/app/main/java/.../MainActivity.java` to include: ```java import com.tuanpm.RCTMqtt.*; // import - -.addPackage(new RCTMqttPackage()) //for older version - -new RCTMqttPackage() // for newest version of react-native +new RCTMqttPackage() // as a child of the getPackages() returned array ``` - Append the following lines to `android/settings.gradle` before `include ':app'`: ``` -include ':react-native-mqtt' -project(':react-native-mqtt').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-mqtt/android') +include ':sp-react-native-mqtt' +project(':sp-react-native-mqtt').projectDir = new File(rootProject.projectDir, '../node_modules/sp-react-native-mqtt/android') ``` -- Insert the following lines inside the dependencies block in `android/app/build.gradle`, don't missing `apply plugin:'java'` on top: +- Insert the following lines inside the dependencies block in `android/app/build.gradle`, don't miss `apply plugin:'java'` on top: ``` -compile project(':react-native-mqtt') +compile project(':sp-react-native-mqtt') ``` -Notes: - -``` -dependencies { - compile project(':react-native-mqtt') -} -``` ## Usage From 4fec778134052cc521e8b0536b10a6e2b809a751 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 12 Jun 2019 19:55:04 +0300 Subject: [PATCH 26/41] Readme minor typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3a0763e..c87f9c6 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ compile project(':sp-react-native-mqtt') ## Usage ```javascript -import MQTT from 'react-native-mqtt'; +import MQTT from 'sp-react-native-mqtt'; /* create mqtt client */ MQTT.createClient({ From a7a51f8c905599843a8a0758ef8e24fa60e6d7fd Mon Sep 17 00:00:00 2001 From: Kirk Ryan Date: Thu, 26 Mar 2020 15:09:03 +0000 Subject: [PATCH 27/41] Update linking instructions Update instructions for RN 0.60 and above. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c87f9c6..f07e129 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ or yarn add sp-react-native-mqtt ``` -#### Step 2: +#### Step 2: (Skip this step if you are using RN 0.60 or above as the module will be auto-linked) ```bash react-native link sp-react-native-mqtt From 64b55aaeddc9a332cd8600afca60ac731b282867 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Wed, 5 Aug 2020 16:09:22 +0300 Subject: [PATCH 28/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f07e129..525ec92 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ MQTT.createClient({ * `tls`: true/false (override by uri if set to mqtts or wss) * `user`: string username * `pass`: string password - * `auth`: true/false - override = true if `user` or `pass` exist + * `auth`: true/false - override = true Set to true if `user` or `pass` exist * `clientId`: string client id * `keepalive` From 4175b4de1612193873e83e67c48fa0ca33b41b5e Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Fri, 15 Jan 2021 11:05:29 +0200 Subject: [PATCH 29/41] Update index.js The is a problem with the domain that contains a dash (-) e.g. mqtts://test-domain.com --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 689a55d..c8ebb3a 100644 --- a/index.js +++ b/index.js @@ -65,7 +65,7 @@ module.exports = { }, createClient: async function(options) { if(options.uri) { - var pattern = /^((mqtt[s]?|ws[s]?)?:(\/\/)([0-9a-zA-Z_\.]*):?(\d+))$/; + var pattern = /^((mqtt[s]?|ws[s]?)?:(\/\/)([a-z0-9A-Z_\.\-]*):?(\d+))$/; var matches = options.uri.match(pattern); if (!matches) { throw new Error(`Uri passed to createClient ${options.uri} doesn't match a known protocol (mqtt:// or ws://).`); From a0eec9e282f1ae91b8cd7c3321e9350308b15959 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 15 Jan 2021 16:04:37 +0200 Subject: [PATCH 30/41] 0.4.26 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 6a29b83..5809cfd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.25", + "version": "0.4.26", "description": "MQTT client for react-native", "main": "index.js", "scripts": { @@ -41,7 +41,7 @@ "email": "tao_qiufeng@126.com", "url": "http://github.com/taoqf" } - ], + ], "license": "MIT", "bugs": { "url": "https://github.com/SudoPlz/react-native-mqtt/issues" From 1a371a35034d44063223784474d0784f904779d4 Mon Sep 17 00:00:00 2001 From: prof-lupin <33233393+prof-lupin@users.noreply.github.com> Date: Fri, 22 Jan 2021 15:45:55 +0530 Subject: [PATCH 31/41] Updated outdated steps and errors from Readme.md "compile project" no longer works in gradle. Packages are added manually in "MainApplication.java" and not "MainActivity.java". The previously mentioned path to "MainActivity.java" did not seem correct. --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 525ec92..8087fe7 100644 --- a/README.md +++ b/README.md @@ -52,14 +52,16 @@ In XCode, in the project navigator, right click `Libraries` ➜ `Add Files to [y ##### Android -* Modify the ReactInstanceManager.builder() calls chain in `android/app/main/java/.../MainActivity.java` to include: +* Add the following line in `getPackages()` method inside the `ReactNativeHost` object in `android/app/src/main/java/.../MainApplication.java`: ```java -import com.tuanpm.RCTMqtt.*; // import -new RCTMqttPackage() // as a child of the getPackages() returned array +packages.add(new RCTMqttPackage()); // as a child of the getPackages() returned array + ``` +Don't forget to include `import com.tuanpm.RCTMqtt.*;` with the other imports at the top. + * Append the following lines to `android/settings.gradle` before `include ':app'`: ``` @@ -69,10 +71,10 @@ project(':sp-react-native-mqtt').projectDir = new File(rootProject.projectDir, ``` -- Insert the following lines inside the dependencies block in `android/app/build.gradle`, don't miss `apply plugin:'java'` on top: +- Insert the following lines inside the dependencies block in `android/app/build.gradle`: ``` -compile project(':sp-react-native-mqtt') +implementation ':sp-react-native-mqtt' ``` From 5e8ffcbcb394d3cd79ea2a98d21cd3d94815da2d Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Fri, 19 Feb 2021 17:00:56 +0200 Subject: [PATCH 32/41] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 8087fe7..9a68e5b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ [![npm](https://img.shields.io/npm/dt/react-native-mqtt.svg)]() +## Announcements: + +No longer actively maintained. +Looking for maintainers. + ## Description A [react-native](https://github.com/facebook/react-native) mqtt client module that works From c3c73865c6e53378abe15f4cef5388b95ce451e5 Mon Sep 17 00:00:00 2001 From: Scott Spitler Date: Mon, 1 Mar 2021 23:22:36 -0500 Subject: [PATCH 33/41] Implemented missing iOS functions Implemented isConnected for iOS, and since async functions don't behave the same on iOS as Android. Implemented isSubbed and getTopics. Will add async version is connect, disconnect, subscribe, unsubscribe This will make it possible to have simple blocking functionality when trying to connect to 10's or 100's of topics. Adding a hash table to look up the 'onConnect' event is not simple to maintain across 4 client instances in the FE not to mention performant. It is simpler to just make call and await the response or for a timeout. If either happens then you can assume the client is hung --- README.md | 10 ++++++++++ index.js | 11 ++++++++++- ios/Mqtt.h | 3 +++ ios/Mqtt.m | 42 ++++++++++++++++++++++++++++++++++++++++++ ios/RCTMqtt.m | 45 +++++++++++++++++++++++++++++++++++++++++++-- package.json | 15 ++++++++++----- 6 files changed, 118 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 9a68e5b..e73267b 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,16 @@ MQTT.createClient({ * [ ] Use WeakReference for timer * [ ] Add disconnecting event +* [ ] Add async versions of: + - [ ] connect + - [ ] subscribe + - [ ] disconnect + - [ ] unsubscribe + +* [X] Allow for multi nested domains ie: na.est.example.com +* [X] Add isConnected implementation for iOS +* [X] Add isSubbed for iOS & Android +* [X] Add getTopics for iOS & Android ## LICENSE diff --git a/index.js b/index.js index c8ebb3a..5e9d8a5 100644 --- a/index.js +++ b/index.js @@ -49,10 +49,19 @@ MqttClient.prototype.publish = function(topic, payload, qos, retain) { MqttClient.prototype.reconnect = function() { Mqtt.reconnect(this.clientRef); }; + MqttClient.prototype.isConnected = function() { return Mqtt.isConnected(this.clientRef); }; +MqttClient.prototype.getTopics = function() { + return Mqtt.getTopics(this.clientRef); +}; + +MqttClient.prototype.isSubbed = function(topic) { + return Mqtt.isSubbed(this.clientRef, topic); +}; + const emitter = new NativeEventEmitter(Mqtt) module.exports = { @@ -65,7 +74,7 @@ module.exports = { }, createClient: async function(options) { if(options.uri) { - var pattern = /^((mqtt[s]?|ws[s]?)?:(\/\/)([a-z0-9A-Z_\.\-]*):?(\d+))$/; + var pattern = /^((mqtt[s]?|ws[s]?)?:(\/\/)([0-9a-zA-Z_\.\-]*):?(\d+))$/; var matches = options.uri.match(pattern); if (!matches) { throw new Error(`Uri passed to createClient ${options.uri} doesn't match a known protocol (mqtt:// or ws://).`); diff --git a/ios/Mqtt.h b/ios/Mqtt.h index 73564b9..828d8b5 100644 --- a/ios/Mqtt.h +++ b/ios/Mqtt.h @@ -21,6 +21,9 @@ clientRef:(NSString *) clientRef; - (void) connect; - (void) disconnect; +- (BOOL) isConnected; +- (BOOL) isSubbed:(NSString *) topic; +- (NSMutableArray *) getTopics; - (void) subscribe:(NSString *)topic qos:(NSNumber *)qos; - (void) unsubscribe:(NSString *)topic; - (void) publish:(NSString *) topic data:(NSData *)data qos:(NSNumber *)qos retain:(BOOL) retain; diff --git a/ios/Mqtt.m b/ios/Mqtt.m index 0b01a20..78017dd 100644 --- a/ios/Mqtt.m +++ b/ios/Mqtt.m @@ -5,6 +5,8 @@ // Created by Tuan PM on 2/13/16. // Copyright © 2016 Tuan PM. All rights reserved. // Updated by NaviOcean on 01/04/18 +// Updated by Scott Spitler of KUHMUTE on 03/01/2021. +// Copyright © 2021 Scott Spitler. All rights reserved. // #import "Mqtt.h" @@ -182,6 +184,46 @@ - (void) disconnect { } +- (BOOL) isConnected { + //NSLog(@"Trying to check for connection..."); + if(self.manager.session.status == MQTTSessionStatusConnected) { + return true; + } + return false; +} + +- (BOOL) isSubbed:(NSString *)topic { + //NSLog(@"Checking to see if listening to topic... %@", topic); + if([self.manager.subscriptions objectForKey:topic]) { + return true; + } + return false; +} +/* + Returns array of objects with keys: + -topic: type string + -qos : type int + + TODO: + Allocate all space before hand, remove "tmp" holding variable. + Still learning Objective C... +*/ + +- (NSMutableArray *) getTopics { + //NSLog(@"Trying to pull all connected topics...."); + NSMutableArray * ret; + int i = 0; + for(id key in self.manager.subscriptions) { + id keySet = [NSDictionary sharedKeySetForKeys:@[@"topic", @"qos"]] + NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithSharedKeySet:keySet]; + tmp[@"topic"] = key; + tmp[@"qos"] = [self.manager.subscriptions objectForKey:key]; + ret[i] = tmp; + i++; + } + return ret; +} + - (void) subscribe:(NSString *)topic qos:(NSNumber *)qos { NSMutableDictionary *subscriptions = [self.manager.subscriptions mutableCopy]; [subscriptions setObject:qos forKey: topic]; diff --git a/ios/RCTMqtt.m b/ios/RCTMqtt.m index 7add36d..ecaf3f5 100644 --- a/ios/RCTMqtt.m +++ b/ios/RCTMqtt.m @@ -4,13 +4,15 @@ // // Created by Tuan PM on 2/2/16. // Copyright © 2016 Tuan PM. All rights reserved. +// Updated by Scott Spitler of KUHMUTE on 03/01/2021. +// Copyright © 2021 Scott Spitler. All rights reserved. // - +//Package dependencies #import #import #import #import - +//Project imports #import "RCTMqtt.h" #import "Mqtt.h" @@ -91,6 +93,45 @@ -(void)stopObserving { [[[self clients] objectForKey:clientRef] disconnect]; } +RCT_EXPORT_METHOD(isConnected:(nonnull NSString *) clientRef resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + //RCTLogInfo(@"Bridge handling call to core for isConnected"); + if([[self clients] objectForKey:clientRef]) { + BOOL conn = [[[self clients] objectForKey:clientRef] isConnected]; + //RCTLogInfo(@"Client: %@ isConnected: %s", clientRef, conn ? "true" : "false"); + resolve(@(conn)); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"com.kuhmute.kca" code:404 userInfo:@{@"Error reason": @"Client Not Found"}]; + reject(@"client_not_found", @"This client doesn't exist", error); + } +} + +RCT_EXPORT_METHOD(isSubbed:(nonnull NSString *) clientRef:(nonnull NSString*)topic resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + //RCTLogInfo(@"Bridge handling call to core for topic: %@", topic); + if([[self clients] objectForKey:clientRef]) { + BOOL subbed = [[[self clients] objectForKey:clientRef] isSubbed:clientRef]; + //RCTLogInfo(@"Client: %@ isSubbed: %s", clientRef, subbed ? "true" : "false"); + resolve(@(subbed)); + } else { + + NSError *error = [[NSError alloc] initWithDomain:@"com.kuhmute.kca" code:404 userInfo:@{@"Error reason": @"Client Not Found"}]; + reject(@"client_not_found", @"This client doesn't exist", error); + } +} + +RCT_EXPORT_METHOD(getTopics:(nonnull NSString *) clientRef resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { + //RCTLogInfo(@"Bridge handling call to core for client: %@", clientRef); + if([[self clients] objectForKey:clientRef]) { + NSMutableArray *ret = [[[self clients] objectForKey:clientRef] getTopics]; + //RCTLogInfo(@"Client: %@ topics: %@", clientRef, ret); + resolve(ret); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"com.kuhmute.kca" code:404 userInfo:@{@"Error reason": @"Client Not Found"}]; + reject(@"client_not_found", @"This client doesn't exist", error); + } +} + + + RCT_EXPORT_METHOD(disconnectAll) { if (self.clients.count > 0) { for(NSString* aClientRef in self.clients) { diff --git a/package.json b/package.json index 5809cfd..a8771e1 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/SudoPlz/react-native-mqtt.git" + "url": "git+https://github.com/spit4520/react-native-mqtt.git" }, "keywords": [ "mqtt", @@ -16,9 +16,9 @@ "iot" ], "author": { - "name": "Ioannis Kokkinidis", - "email": "sudoplz@gmail.com", - "url": "https://www.linkedin.com/in/sudoplz" + "name": "Scott Joseph Spitler II", + "email": "scott@kuhmute.com", + "url": "https://www.linkedin.com/in/sspitler" }, "contributors": [ { @@ -40,7 +40,12 @@ "name": "taoqf", "email": "tao_qiufeng@126.com", "url": "http://github.com/taoqf" - } + }, + { + "name": "Scott Spitler", + "email": "scott@kuhmute.com", + "url": "https://kuhmute.dev" + } ], "license": "MIT", "bugs": { From 408ffc694e7674a19bf1280cde11f4d0f45c3bfa Mon Sep 17 00:00:00 2001 From: Scott Spitler Date: Mon, 1 Mar 2021 23:40:49 -0500 Subject: [PATCH 34/41] Added android implementation Added in android version of getTopics, isSubbed --- .../main/java/com/tuanpm/RCTMqtt/RCTMqtt.java | 23 +++++++++++++++++++ .../com/tuanpm/RCTMqtt/RCTMqttModule.java | 16 +++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java index 67d98bc..13dbfeb 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java @@ -8,7 +8,9 @@ import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableNativeMap; +import com.facebook.react.bridge.WritableNativeArray; import com.facebook.react.modules.core.RCTNativeAppEventEmitter; import org.eclipse.paho.client.mqttv3.IMqttActionListener; @@ -234,6 +236,27 @@ public void reconnect() { public boolean isConnected() { return client.isConnected(); } + /* + * Returns all connected topics as object + */ + public WritableArray getTopics() { + WritableArray ret = new WritableNativeArray(); + for(Map.Entry entry : topics.entrySet()) { + WritableMap tmp = Arguments.createMap(); + tmp.putString("topic", entry.getKey()); + tmp.putInt("qos", entry.getValue()); + ret.pushMap(tmp); + } + return ret; + } + + /* + * Check if listening to a specifc topic + */ + public boolean isSubbed(String topic) { + //log("isSubbed. checking is topic: "+ topic); + return topics.containsKey(topic); + } public void connect() { try { diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java index ac0fb7c..bef5c35 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java @@ -116,7 +116,19 @@ public void isConnected(@NonNull final String clientRef, Promise promise) { promise.resolve(clients.get(clientRef).isConnected()); } - + + @ReactMethod + public void getTopics(@NonNull final String clientRef, Promise promise) + { + promise.resolve(clients.get(clientRef).getTopics()); + } + + @ReactMethod + public void isSubbed(@NonNull final String clientRef, String topic, Promise promise) + { + promise.resolve(clients.get(clientRef).isSubbed(topic)); + } + private String createClientRef() { return UUID.randomUUID().toString(); @@ -136,4 +148,4 @@ public void onCatalystInstanceDestroy() { disconnectAll(); } -} \ No newline at end of file +} From 9ab6d0554083abca23a1a939bcc53b37a91cb34d Mon Sep 17 00:00:00 2001 From: Scott Joseph Spitler II Date: Tue, 9 Mar 2021 16:22:07 -0500 Subject: [PATCH 35/41] Updated package.json Moved myself to contributor, Re-added SudoPlz to Author --- .../com/tuanpm/RCTMqtt/.RCTMqttModule.java.swp | Bin 0 -> 16384 bytes ios/Mqtt.m | 2 +- package.json | 10 +++++----- 3 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 android/src/main/java/com/tuanpm/RCTMqtt/.RCTMqttModule.java.swp diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/.RCTMqttModule.java.swp b/android/src/main/java/com/tuanpm/RCTMqtt/.RCTMqttModule.java.swp new file mode 100644 index 0000000000000000000000000000000000000000..4cc5066963b07cf6ee74ae680bd63224e832fedf GIT binary patch literal 16384 zcmeI3ONbmr7{|+Ze8iXp!HZg1CCr4`?z{*Z&64aylBl~%l8tx@H9fVv?e=tax@tDA zArYU59!yjO1&u}n29J7D5ET{4$&+BbCc6_GXS!!+vm5mwQU$-A?e2Pf z-@m@8s;;eVtlqO@gx=w;B}g|A^7I>@-u%}2Q{?FFgh-i$D&nbrbfL5>5K76x5f%&! zF*W#LD!fPpEb1+DD6i1p%BOiG5}x`}jH~@D;6|_noV|{aufcI}6ub!zgDJqlDA*3Rfeqk~YYF)V zoCL3eQLq{;0zX|t$ZOzb@Dg|eYzM>OCa?@F1q6I?H6fpXBj5$_JeUCwgI(YjaC#9T zpMej+3Gfa$29AI|;8yV4RfPNsJ^~+t55O_NK@F?~=df||3pfM52gg7QYyeBZk5}M6 zcoiH5FM>m02rLCxfpeD=@-uiH><9Zm0``L2!7bn{I`a%T4Za1>fhR#7Yyx+HD|5HCt2B8+s_TXXMVcof zbB!R0!r>x$AD<~SVBAYe%4j$0S;x;2pr%Ugq7Cd)Kg}UePY7jA%E^inNf^{TmZPebzOmf3b^jxBUGrUui2@J^S`~%~19XWVsLHBBd3395ByLH`c_BNC6o!VbJzJv4P9T3H zI=j`(Jw6xm%p>>02k4#=s7Kn_?&cZ(u>o@o|E8BQjBZ@`(BFT8F3&c$m%XH2n6zuQ zrwh}F$>&L~>MV*HESSpsL&r-VT_zVr#9#umH@g#v9;-1$*D<;9M^%lAL?3{ag;x5H z38-(@g2c?1rXREgeN*3cLUC*@R$DQRV-?Y4jfju1BsXyWq1CRo2K33>fud=)u})Oj zaT3ur%3Ami5pDP82c~(NhE3kPh_jtz_1w}|+pa6MP&HQP>($&!<7q9Af}woyFb3thJDShi zOu3v?uqP-lg|Q@u^8+Oh&>7?avAzWnlQK8R9E_$2M69B4w;D@wD9a6UqDIwW$SuxkE$EV@Yd9+BY%L1)WUi!j)m?|5qtI>2bClkV(@N7wJPRl zyJveA59ul&&^n?SuNAa0LwDo!`-3C2VzO?IaA4j;(JB=&UE{C!*KF{JziJiH@BcC0 zj} z3LNa+1?z6_W;@AtBdD;|jD0DlSTrNmju;z5alp6Y|LIdPgFWg4MDKldci8>{NagJu literal 0 HcmV?d00001 diff --git a/ios/Mqtt.m b/ios/Mqtt.m index 78017dd..b1041a8 100644 --- a/ios/Mqtt.m +++ b/ios/Mqtt.m @@ -214,7 +214,7 @@ - (NSMutableArray *) getTopics { NSMutableArray * ret; int i = 0; for(id key in self.manager.subscriptions) { - id keySet = [NSDictionary sharedKeySetForKeys:@[@"topic", @"qos"]] + id keySet = [NSDictionary sharedKeySetForKeys:@[@"topic", @"qos"]]; NSMutableDictionary *tmp = [NSMutableDictionary dictionaryWithSharedKeySet:keySet]; tmp[@"topic"] = key; tmp[@"qos"] = [self.manager.subscriptions objectForKey:key]; diff --git a/package.json b/package.json index a8771e1..7c13431 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.26", + "version": "0.4.27", "description": "MQTT client for react-native", "main": "index.js", "scripts": { @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/spit4520/react-native-mqtt.git" + "url": "git+https://github.com/SudoPlz/react-native-mqtt.git" }, "keywords": [ "mqtt", @@ -16,9 +16,9 @@ "iot" ], "author": { - "name": "Scott Joseph Spitler II", - "email": "scott@kuhmute.com", - "url": "https://www.linkedin.com/in/sspitler" + "name": "Ioannis Kokkinidis", + "email": "sudoplz@gmail.com", + "url": "https://www.linkedin.com/in/sudoplz" }, "contributors": [ { From c57d953a204e639f27b674bca50775259de02d73 Mon Sep 17 00:00:00 2001 From: Scott Joseph Spitler II Date: Tue, 9 Mar 2021 16:24:30 -0500 Subject: [PATCH 36/41] Patched .gitignore Removed vim swap files, added lazy filter for vim swap files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 20f2285..78e7ace 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ # .DS_Store +# vim +# +*.sw* + # Xcode # build/ From e78178aba57e6c544b1fb2f4e34b481cbbbcb8c8 Mon Sep 17 00:00:00 2001 From: Scott Joseph Spitler II Date: Thu, 11 Mar 2021 12:04:18 -0500 Subject: [PATCH 37/41] Removed Tabs for Spaces --- package.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7c13431..bb086e3 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/SudoPlz/react-native-mqtt.git" + "url": "git+https://github.com/SudoPlz/react-native-mqtt.git" }, "keywords": [ "mqtt", @@ -41,11 +41,11 @@ "email": "tao_qiufeng@126.com", "url": "http://github.com/taoqf" }, - { - "name": "Scott Spitler", - "email": "scott@kuhmute.com", - "url": "https://kuhmute.dev" - } + { + "name": "Scott Spitler", + "email": "scott@kuhmute.com", + "url": "https://kuhmute.dev" + } ], "license": "MIT", "bugs": { From bd936a9de6c27f67da78c38cd1956b161935022e Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Thu, 11 Mar 2021 19:49:26 +0200 Subject: [PATCH 38/41] 0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb086e3..f8a9fbd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.4.27", + "version": "0.5.0", "description": "MQTT client for react-native", "main": "index.js", "scripts": { From 9ac31d9a2af66901b11e7f13373cd377f925fb61 Mon Sep 17 00:00:00 2001 From: Carlos Scovino Date: Tue, 10 Aug 2021 21:54:53 -0300 Subject: [PATCH 39/41] fix: ts declaration to allow all options on create client method --- index.d.ts | 72 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 30 deletions(-) diff --git a/index.d.ts b/index.d.ts index 83582a8..11d4751 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,48 +1,60 @@ export type QoS = 0 | 1 | 2; +interface IMqttClientOptions { + clientId: string; + uri: string; + host?: string; + port?: number; + protocol?: 'mqtt' | 'tcp' | 'wss' | 'mqtts' | 'ws'; + tls?: boolean; + keepalive?: number; // seconds + protocolLevel?: number; + clean?: boolean; + auth?: boolean; + user?: string; // only used when auth is true + pass?: string; // only used when auth is true + will?: boolean; + willMsg?: string; // only used when will is true + willtopic?: string; // only used when will is true + willQos?: QoS; // only used when will is true + willRetainFlag?: boolean; // only used when will is true + automaticReconnect?: boolean; // android only +} + export class IMqttClient { - constructor(options: { - clientId: string; - uri: string; - host?: string; - port?: number; - protocol?: 'mqtt' | 'tcp' | 'wss' | 'mqtts' | 'ws'; - tls?: boolean; - keepalive?: number; // seconds - protocolLevel?: number; - clean?: boolean; - auth?: boolean; - user?: string; // only used when auth is true - pass?: string; // only used when auth is true - will?: boolean; - willMsg?: string; // only used when will is true - willtopic?: string; // only used when will is true - willQos?: QoS; // only used when will is true - willRetainFlag: boolean; // only used when will is true - automaticReconnect?: boolean; // android only - }) - on(event: 'closed', cb: (msg: string) => void): void - on(event: 'error', cb: (msg: string) => void): void - on(event: 'message', cb: (msg: { - data: string; - qos: QoS; - retain: boolean; - topic: string; - }) => void): void - on(event: 'connect', cb: (msg: { reconnect: boolean; }) => void): void + constructor(options: IMqttClientOptions); + + on(event: 'closed', cb: (msg: string) => void): void; + + on(event: 'error', cb: (msg: string) => void): void; + + on( + event: 'message', + cb: (msg: { data: string; qos: QoS; retain: boolean; topic: string }) => void, + ): void; + + on(event: 'connect', cb: (msg: { reconnect: boolean }) => void): void; + connect(): void; + disconnect(): void; + subscribe(topic: string, qos: QoS): void; + unsubscribe(topic: string): void; + publish(topic: string, payload: string, qos: QoS, retain: boolean): void; + reconnect(): void; + isConnected(): Promise; } declare namespace mqtt { - function createClient(options: { uri: string, clientId?: string }): Promise; + function createClient(options: IMqttClientOptions): Promise; function removeClient(client: IMqttClient): void; function disconnectAll(): void; } export default mqtt; + From f8f39d32e5aad5801ec5dcc3c9d27047cb53c14f Mon Sep 17 00:00:00 2001 From: leinailychee <65280679+leinailychee@users.noreply.github.com> Date: Thu, 11 Aug 2022 22:53:14 +0700 Subject: [PATCH 40/41] Fix AndroidX build error --- android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java | 2 +- android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java index 13dbfeb..de2cba0 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqtt.java @@ -1,6 +1,6 @@ package com.tuanpm.RCTMqtt; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import com.facebook.react.bridge.Arguments; diff --git a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java index bef5c35..6193621 100644 --- a/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java +++ b/android/src/main/java/com/tuanpm/RCTMqtt/RCTMqttModule.java @@ -4,7 +4,7 @@ package com.tuanpm.RCTMqtt; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.util.Log; import com.facebook.react.bridge.Promise; From 7105d214b7a70c0bcf399b190337ce424d158265 Mon Sep 17 00:00:00 2001 From: Ioannis Kokkinidis Date: Thu, 11 Aug 2022 19:36:10 +0300 Subject: [PATCH 41/41] 0.5.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f8a9fbd..d8daa9d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sp-react-native-mqtt", - "version": "0.5.0", + "version": "0.5.1", "description": "MQTT client for react-native", "main": "index.js", "scripts": {